Pipes: สิ่งที่คุณต้องรู้เพื่อเริ่มใช้งานใน GNU / Linux

ท่อ

Una ท่อหรือ pipe เป็นไปป์ไลน์สำหรับ UNIX / Linux และใช้งานได้จริง แต่เพื่อให้เข้าใจอย่างถ่องแท้ว่าไปป์คืออะไรคุณควรรู้ว่าในสภาพแวดล้อม * nix มีสตรีมข้อมูลในตัว 3 สตรีม สำหรับผู้ที่ไม่ทราบหมายความว่าข้อมูลสามารถเดินทางไปยังหรือจากจุดสามจุดได้

แล้วคุณจะเข้าใจสิ่งนี้ในทางที่ดีขึ้นแต่สิ่งที่ฉันอยากจะบอกคุณให้ชัดเจนในตอนนี้ก็คือสิ่งที่คุณทำได้คือช่องทางจากจุดใดจุดหนึ่งไปยังผู้อื่น สิ่งนี้ช่วยให้สามารถรับเอาท์พุทหรือผลลัพธ์ที่โปรแกรมส่งไปยังอินพุตของอีกรายการเพื่อใช้งานเป็นต้น ฉันจะพยายามอธิบายด้วยตัวอย่างที่ใช้ได้จริงซึ่งจะช่วยให้คุณเข้าใจได้เป็นอย่างดี

ประเด็นเหล่านั้นที่ฉันพูดถึงหรือ สตรีมข้อมูลคือ:

  • สเตดิน: สอดคล้องกับ 0 และเป็นอินพุตมาตรฐาน โดยทั่วไปอินพุตมาตรฐานสำหรับระบบ * nix คือแป้นพิมพ์ นั่นคือสิ่งที่คุณพิมพ์จะเป็นข้อมูลที่ใช้ เธอมีอุปกรณ์พิเศษที่เกี่ยวข้องซึ่งก็คือ / dev / stdin
  • แย่: ระบุด้วย 1 เป็นเอาต์พุตมาตรฐาน โดยปกติจะตรงกับจอภาพหรือหน้าจอคอมพิวเตอร์ของคุณซึ่งเป็นที่ที่คุณสามารถดูข้อมูลได้ ตัวอย่างเช่นเมื่อคุณเรียกใช้คำสั่ง ls รายการเนื้อหาจะแสดงบนหน้าจอใช่ไหม? อุปกรณ์ที่เกี่ยวข้องคือ / dev / stdout
  • สตเดอร์: ระบุด้วย 2 เป็นเอาต์พุตข้อผิดพลาดมาตรฐานเมื่อเกิดข้อผิดพลาดในโปรแกรม อุปกรณ์ที่เกี่ยวข้องคือ / dev / stderr

ด้วยไปป์ไลน์คุณสามารถทำให้เอาต์พุตมาตรฐานหรือ stdout ของคำสั่งหนึ่งส่งผ่านไปยังอินพุตมาตรฐานของอีกคำสั่งได้โดยตรง. นั่นคือคุณสามารถทำให้โปรแกรมหนึ่งฟีดอีกโปรแกรมหนึ่งได้ แทนที่จะใช้พารามิเตอร์ที่ป้อนด้วยแป้นพิมพ์ไปป์จะส่งข้อมูลที่สร้างโดยคำสั่งก่อนหน้านี้ผ่านไปป์ไลน์ที่แสดงโดย |

กับ ตัวอย่าง คุณจะเข้าใจมันได้ดีขึ้น สมมติว่าคุณต้องการแสดงรายการเนื้อหาของไดเร็กทอรี แต่คุณสนใจที่จะดูชื่อที่ตรงกับคำว่า doc เท่านั้น ดังนั้นคุณสามารถใช้ไปป์ไลน์เพื่อไพพ์เอาต์พุตของ ls ไปยังอินพุตของตัวกรอง grep เพื่อบอกให้แสดงเฉพาะที่ตรงกับรูปแบบนั้น:

ls -l | grep doc

ดังนั้นแทนที่จะแสดงชื่อทั้งหมดให้คุณดูมันก็แสดงให้คุณเห็น คนที่คุณสนใจจริงๆ. คุณสามารถทำเช่นเดียวกันกับเนื้อหาของไฟล์ ลองนึกภาพว่าคุณต้องการดูข้อมูลของกระบวนการที่ชื่อว่า firefox เท่านั้นไม่ใช่ทั้งหมด:

ps aux | grep firefox

แทนที่จะแสดงผลลัพธ์ทั้งหมดของโปรแกรม ps บนหน้าจอ (stdout) สิ่งที่ทำคือส่งสัญญาณไปยังอินพุตของตัวกรอง grep และแสดงเฉพาะในเอาต์พุตที่ตรงกับรูปแบบ firefox ในกรณีนี้ ...

ถ้าคุณต้องการคุณสามารถใช้ ท่อต่างๆ เพื่อนำเอาต์พุตของคำสั่งหนึ่งไปยังอินพุตของคำสั่งที่สองอื่นและเอาต์พุตของวินาทีนั้นไปยังอินพุตของหนึ่งในสามและอื่น ๆ ตัวอย่างเช่น:

cat libro | grep love | more

อย่างที่คุณเห็น, ความเป็นไปได้มีมากมายทุกสิ่งที่คุณสามารถจินตนาการได้และได้รับอนุญาต แม้แต่แสดงเฉพาะบรรทัดแรกและบรรทัดสุดท้ายของไฟล์นับบรรทัดที่ป้อน wc ที่มาจากรายการและจัดเรียงด้วย:

cat listado | head
cat listado | tail
cat listado | wc -l
cat listado | sort

คุณยังสามารถทำงานกับไฟล์ ข้อผิดพลาดกับ | & และตัวอย่างเช่นค้นหาคำว่า alert ในเอาต์พุตของสคริปต์หากล้มเหลว:

./miscript |& grep alerta 

และสุดท้ายมีสองคำสั่งที่เชื่อมโยงอย่างใกล้ชิดกับท่อนั่นคือ ทีและ xargs และพวกเขาสามารถขยายความเป็นไปได้ของสิ่งเหล่านี้เพิ่มเติม ในกรณีของทีสิ่งที่จะอนุญาตคือการแสดงผลลัพธ์ของโปรแกรมก่อนหน้าบนเอาต์พุตมาตรฐานเพื่อให้คุณสามารถดูได้และนอกจากนั้นยังสามารถไพพ์ไปยังไฟล์อื่นได้ ตัวอย่างเช่นหากคุณแสดงรายการเนื้อหาของไดเร็กทอรีและต้องการดูผลลัพธ์ของ ls -l ในขณะนี้และบันทึกไว้ใน file listing.txt:

ls -l | tee listado.txt

หากคุณไม่ใช้ทีคุณจะไม่สามารถเห็นผลลัพธ์บนคอนโซลของคุณ ...

Y xargs มันน่าสนใจยิ่งขึ้นในบางกรณี ในกรณีนี้จะสามารถสร้างคำสั่งจากอินพุตมาตรฐานที่ได้รับผ่านไปป์ไลน์ กล่าวอีกนัยหนึ่งก็คือสามารถจับทุกอย่างที่โปรแกรมก่อนหน้านี้เปิดตัวผ่านเอาต์พุตและส่งต่อ xargs ผ่านไปป์ไลน์เพื่อส่งต่อไปยังคำสั่งอื่นเป็นอาร์กิวเมนต์

ยังไม่เข้าใจ? คุณจะเห็นได้ดีขึ้นมากด้วยตัวอย่าง สมมติว่าคุณต้องการลบไฟล์ thumbs.db ที่น่ารังเกียจทั้งหมดออกจากไดเร็กทอรีดิสก์หรือพาร์ติชัน หากมีจำนวนมากอาจเป็นไปไม่ได้ที่จะดำเนินการทีละรายการโดยใช้คำสั่ง rm เพื่อลบด้วยตนเอง แต่ด้วย xargs คุณสามารถทำให้ทุกอย่างเป็นไปโดยอัตโนมัติ และคุณสามารถทำได้โดยใช้ find เพื่อหาตำแหน่งส่งเอาต์พุตผ่านอินพุตของ xargs และสิ่งนี้จะให้ชื่อ rm เป็นอาร์กิวเมนต์ ดังนั้นสิ่งที่อยู่ทั้งหมดจะถูกลบโดยอัตโนมัติ:

find ./ -name "thumbs.db" | xargs rm

ตัวอย่างเช่นสมมติว่าค้นหาตำแหน่ง /home/name/thumbs.db, /media/test/thumbs.db และ /tmp/thumbs.db เอาล่ะ xargs จะส่งพวกมันไปที่ rm ราวกับว่าพวกมันเป็นข้อโต้แย้ง นั่นคือราวกับว่าเราได้ดำเนินการ: rm /home/name/thumbs.db แล้ว rm /media/test/thumbs.db แล้ว rm /tmp/thumbs.db


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. รับผิดชอบข้อมูล: AB Internet Networks 2008 SL
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   โฮเซ dijo

    ยอดเยี่ยมข้อมูลนี้มีความสำคัญมากสำหรับผู้ใช้ linux ของเรา

  2.   แดเนียล dijo

    เป็นบทความที่ดีตอนนี้ที่ฉันกำลังศึกษาการเปลี่ยนเส้นทาง I / O ในหนังสือ The Linux Command Line มันชัดเจนกว่าสำหรับฉันเกี่ยวกับท่อ (Pipeline) และสตรีมข้อมูลสามสาย ผลงานเป็นที่ชื่นชม ทักทาย.

  3.   01101001b dijo

    ตัวอย่างที่มี xargs เหมาะกับฉันเช่นถุงมือ ตรงกับวันนี้ฉันกำลังจัดการกับรายละเอียดของทางออกหลายทางที่ฉันต้องส่ง "เป็นส่วน ๆ " xargs เดิน pinturita
    ซาบซึ้งสุด ๆ !