ต่อคำสั่งเข้าด้วยกัน
pipe (|) คือสายพานต่อ output ของคำสั่งหนึ่งไปคำสั่งถัดไป รู้จัก grep/head/tail/sort/wc เคล็ดลับที่ทำให้ Terminal ทรงพลัง
คำสั่งหลักครบแล้ว ทั้งเดินดู (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 # ในกล่องนี้มีกี่ไฟล์ls | grep .jpgดูว่าผลลัพธ์ลดลงทีละ stage ยังไงต่อ 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 ที่บอกไว้ตั้งแต่บทแรก