บทที่ 5 · อ่าน 7 นาที
ต่อคำสั่งเข้าด้วยกัน
เครื่องหมาย | คือสายพานต่อ output ของคำสั่งหนึ่งไปคำสั่งถัดไป รู้จักคำสั่งเล็กๆ ที่ใช้คู่กัน grep head tail sort wc
คำสั่งหลักครบแล้วครับ ทั้งเดินดู (pwd/ls/cd) อ่าน path จัดการไฟล์ (mkdir/touch/cp/mv/rm) บทนี้เป็นเรื่องที่ทำให้ Terminal ทรงพลังจริงๆ คือ ต่อคำสั่งเข้าด้วยกัน
เคล็ดลับนี้ฝรั่งเรียก pipe (อ่าน ไพป์) คนใช้ Terminal ทำงานทุกวัน เป็นเหตุผล หลักที่ Terminal เร็วกว่าคลิกเมาส์หลายเท่าตอนต้องทำของซ้ำๆ
นึกภาพคำสั่งเป็นเครื่องจักรในโรงงาน
ลองนึกถึงโรงงานผลิตของในการ์ตูนครับ วัตถุดิบเข้าทางหนึ่ง เครื่องจักรแต่ละตัว ทำหน้าที่เดียว ของไหลผ่านสายพานไปเครื่องถัดไป จนได้ผลลัพธ์สุดท้าย
Terminal ทำงานแบบเดียวกัน เครื่องจักร = คำสั่ง สายพาน = pipe ใช้เครื่องหมาย |
แทนที่จะเอาผลของคำสั่งแรกไปเก็บก่อนแล้วค่อยเอามารันคำสั่งที่สอง เราต่อมัน ตรงๆ ในบรรทัดเดียว
ตัวอย่างให้เห็นภาพ
สมมติเปิดกล่อง Photos ที่มีรูป 50 รูปอยู่ อยากเห็นเฉพาะรูปที่มีคำว่า summer ในชื่อ พิมพ์แบบนี้
ls | grep summerlsทำรายชื่อไฟล์ทั้งหมดในกล่อง|ส่งรายชื่อนี้ผ่านสายพานไปคำสั่งถัดไปgrep summerจากรายชื่อที่ได้ เลือกเฉพาะบรรทัดที่มีคำว่า summer
ผลลัพธ์ ได้เฉพาะรูปที่มีคำว่า summer ไม่ต้องเลื่อนหาเองทีละรูป
คำสั่งเล็กๆ ที่ใช้คู่กับ pipe
นอกจาก grep ยังมีอีก 4 คำสั่งที่เจอตามหลัง pipe บ่อย
grep กรอง
grep <คำ> เลือกเฉพาะบรรทัดที่มีคำที่ใส่
ls | grep .jpg # เฉพาะไฟล์ .jpg
ls | grep 2024 # เฉพาะไฟล์ที่มีเลข 2024head กับ tail เอาส่วนต้นหรือส่วนท้าย
head -3 เอา 3 บรรทัดแรก tail -3 เอา 3 บรรทัดท้าย
ls | head -3 # 3 ไฟล์แรก
ls | tail -5 # 5 ไฟล์ท้ายsort เรียงตามตัวอักษร
ls | sort # เรียง a-zwc -l นับบรรทัด
wc -l นับว่ามีกี่บรรทัด ใช้ pipe จาก ls ก็คือนับว่า มีกี่ไฟล์
ls | wc -l # ในกล่องนี้มีกี่ไฟล์ต่อ pipe ได้มากกว่า 2 stage
| ใส่ได้ไม่จำกัด ของไหลผ่านทุก stage ตามลำดับ
ls | grep .jpg | sort | head -5ความหมายตามลำดับ รายชื่อทั้งหมด → กรองเฉพาะ .jpg → เรียงตัวอักษร → เอา 5 อันแรก
ทำไม pipe ถึงทรงพลัง
แทนที่จะมีคำสั่งใหญ่ที่ทำได้ทุกอย่าง Mac/Linux ออกแบบให้แต่ละคำสั่ง ทำงานเดียวให้เก่ง แล้วต่อ pipe กันได้
กลายเป็นว่ามีคำสั่งเล็กๆ 5-6 ตัว ผสมกันได้เป็นล้านแบบ ไม่ต้องเรียนคำสั่งใหม่ เป็นพันสำหรับทุกสถานการณ์
สรุปบทนี้
|(pipe) สายพานต่อ output ของคำสั่งหนึ่งไปเป็น input ของอีกคำสั่งgrep <คำ>เลือกเฉพาะบรรทัดที่มีคำhead -Nเอา N บรรทัดแรกtail -Nเอา N บรรทัดท้ายsortเรียงตามตัวอักษรwc -lนับบรรทัด- ต่อ pipe กันได้ไม่จำกัด stage แต่ละ stage รับผิดชอบ 1 หน้าที่
จบช่วงกลางแล้ว Terminal ใช้งานในชีวิตจริงได้เกือบครบ บทต่อไปเข้าช่วงสุดท้าย เราจะเรียน คุมโปรแกรมที่รันอยู่ เครื่องค้างทำยังไง โปรแกรม เปิดทิ้งไว้ทำยังไง และ Ctrl+C ที่บอกไว้ตั้งแต่บทแรก