วิธีใช้คำสั่ง wc ใน Linux

เผยแพร่แล้ว: 2022-07-23
แล็ปท็อป Linux แสดง bash prompt
fatmawati achmad zaenuri/Shutterstock.com

การนับจำนวนบรรทัด คำ และไบต์ในไฟล์นั้นมีประโยชน์ แต่ความยืดหยุ่นที่แท้จริงของคำสั่ง Linux wc มาจากการทำงานกับคำสั่งอื่นๆ ลองมาดูกัน

คำสั่ง wc คืออะไร?

คำสั่ง wc เป็นโปรแกรมขนาดเล็ก เป็นหนึ่งในยูทิลิตี้หลักของ Linux ดังนั้นจึงไม่จำเป็นต้องติดตั้ง มันจะอยู่ในคอมพิวเตอร์ Linux ของคุณอยู่แล้ว

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

วิธีใช้ไพพ์บน Linux
วิธีใช้ Pipes บน Linux

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

วิธีหนึ่งที่ฉันใช้ wc คือเป็นตัวยึดตำแหน่งในคำสั่งที่ซับซ้อนหรือนามแฝงที่ฉันกำลังทำอาหาร หากคำสั่งที่เสร็จสิ้นแล้วมีศักยภาพที่จะทำลายและลบไฟล์ได้ ฉันมักจะใช้ wc เป็นคำสั่งแทนคำสั่งจริงที่อันตราย

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

เรียบง่ายเหมือนห้อง wc ยังมีนิสัยใจคอเล็ก ๆ น้อย ๆ ที่คุณต้องรู้

เริ่มต้นกับ wc

วิธีที่ง่ายที่สุดในการใช้ wc คือการส่งชื่อของไฟล์ข้อความบนบรรทัดคำสั่ง

 wc lorem.txt 

การใช้ wc กับไฟล์ที่มีข้อความยาวหนึ่งบรรทัด

สิ่งนี้ทำให้ wc สแกนไฟล์และนับจำนวนบรรทัด คำ และไบต์ และเขียนลงในหน้าต่างเทอร์มินัล

คำถือเป็นสิ่งที่ล้อมรอบด้วยช่องว่าง ไม่ว่าจะเป็นคำจากภาษาจริงหรือไม่ก็ไม่เกี่ยวข้อง หากไฟล์ไม่มีสิ่งใดนอกจาก “frd g lkj” ไฟล์นั้นจะยังนับเป็นสามคำ

บรรทัดคือลำดับของอักขระที่สิ้นสุดโดยการขึ้นบรรทัดใหม่หรือส่วนท้ายของไฟล์ ไม่สำคัญว่าบรรทัดจะวนอยู่ในโปรแกรมแก้ไขหรือในหน้าต่างเทอร์มินัล จนกว่า wc จะพบการขึ้นบรรทัดใหม่หรือจุดสิ้นสุดของไฟล์ ยังคงเป็นบรรทัดเดียวกัน

ตัวอย่างแรกของเราพบหนึ่งบรรทัดในไฟล์ทั้งหมด นี่คือเนื้อหาของไฟล์ “lorem.txt”

 cat lorem.txt 

เนื้อหาของไฟล์ที่มีหนึ่งบรรทัดยาว

ทั้งหมดนี้นับเป็นบรรทัดเดียวเนื่องจากไม่มีการขึ้นบรรทัดใหม่ เปรียบเทียบสิ่งนี้กับไฟล์อื่น “lorem2.txt” และวิธีที่ wc ตีความมัน

 wc lorem2.txt
 แมว lorem2.txt 

การใช้ wc กับไฟล์ที่มีหลายบรรทัด

ครั้งนี้ wc นับ 15 บรรทัด เนื่องจากการขึ้นบรรทัดใหม่ถูกแทรกลงในข้อความเพื่อขึ้นบรรทัดใหม่ ณ จุดที่กำหนด อย่างไรก็ตาม หากคุณนับบรรทัดที่มีข้อความอยู่ คุณจะเห็นว่ามีเพียง 12 บรรทัดเท่านั้น

อีกสามบรรทัดเป็นบรรทัดว่างที่ท้ายไฟล์ สิ่งเหล่านี้มีเพียงการคืนสินค้า แม้ว่าบรรทัดเหล่านี้จะไม่มีข้อความ แต่ก็มีการขึ้นบรรทัดใหม่ ดังนั้น wc จึงนับไว้เช่นนั้น

เราสามารถส่งไฟล์ไปยัง wc ได้มากเท่าที่เราต้องการ

 wc lorem.txt lorem2.txt 

ใช้ wc กับสองไฟล์

เราได้รับสถิติสำหรับแต่ละไฟล์และผลรวมของไฟล์ทั้งหมด

นอกจากนี้เรายังสามารถใช้สัญลักษณ์แทนเพื่อให้เราสามารถเลือกไฟล์ที่ตรงกันแทนไฟล์ที่มีชื่ออย่างชัดเจน

 wc *.txt *.? 

การใช้ wc กับ wildcards

ตัวเลือกบรรทัดคำสั่ง

โดยค่าเริ่มต้น wc จะแสดงบรรทัด คำ และไบต์ในแต่ละไฟล์ เหมือนกับการใช้ตัวเลือก -l (บรรทัด) -w (คำ) และ -c (ไบต์)

 wc lorem.txt
 wc -l -w -c lorem.txt 

การใช้ wc กับตัวเลือกบรรทัด คำ และไบต์

เราสามารถระบุได้ว่าเราต้องการดูชุดค่าผสมใด

 wc -l lorem.txt

wc -w lorem.txt

wc -c lorem.txt

wc -l -c lorem.txt 

การใช้ wc ร่วมกับตัวเลือกต่างๆ

ควรให้ความสนใจเป็นพิเศษกับตัวเลขสุดท้าย ซึ่งสร้างโดยตัวเลือก -c (ไบต์) หลายคนเข้าใจผิดว่าเป็นการนับตัวอักษร จริงๆแล้วมันนับ ไบต์ จำนวนอักขระและจำนวนไบต์อาจเท่ากัน แต่ไม่เสมอไป.

มาดูเนื้อหาของไฟล์ที่เรียกว่า “unicode.txt”

 cat unicode.txt 

เนื้อหาของไฟล์ที่มีอักขระที่ไม่ใช่ภาษาละติน

มีสามคำและอักขระที่ไม่ใช่ตัวอักษรละติน เราจะให้ wc ประมวลผลไฟล์ด้วยการตั้งค่าเริ่มต้นเป็น bytes และเราจะดำเนินการอีกครั้ง แต่ขอ อักขระ ที่มีตัวเลือก -m (อักขระ)

 wc unicode.txt
 wc -l -w -m unicode.txt 

การนับไบต์ในไฟล์แล้วนับอักขระในไฟล์เดียวกัน

มีไบต์มากกว่าที่มีอักขระ

เรามาดูการถ่ายโอนข้อมูลฐานสิบหกของไฟล์และดูว่าเกิดอะไรขึ้น อ็อพชัน -C (canonical) ของคำสั่ง hexdump แสดงไบต์ในไฟล์ในบรรทัดที่ 16 โดยมีค่าเทียบเท่า ASCII ธรรมดา (ถ้ามี) จะแสดงที่ท้ายบรรทัด หากไม่มีอักขระ ASCII ที่สอดคล้องกัน เครื่องหมายจุด “ . ” จะแสดงแทน

 hexdump -C unicode.txt 

hexdump ของไฟล์สั้นที่มีอักขระที่ไม่ใช่ภาษาละติน

ใน ASCII ค่าเลขฐานสิบหกของ 0x20 แสดงถึงอักขระเว้นวรรค ถ้าเรานับสามค่าจากด้านซ้าย เราจะเห็นค่าถัดไปเป็นอักขระเว้นวรรค ดังนั้น ค่าสามค่าแรกเหล่านั้น 0x62 , 0x6f และ 0x79 แทนตัวอักษรใน "boy"

กระโดดข้าม 0x20 เราเห็นค่าเลขฐานสิบหกสามชุดอื่น: 0x63 , 0x61 และ 0x74 สะกดว่า "แมว" ข้ามอักขระช่องว่างถัดไปเราเห็นค่าอีกสามค่าสำหรับตัวอักษรใน "สุนัข" เหล่านี้คือ 0x64 , 0x5f และ 0x67

ด้านหลังคำว่า "dog" เราจะเห็นอักขระเว้นวรรค 0x20 และค่าเลขฐานสิบหกอีกห้าค่า สองรายการสุดท้ายคือการคืน 0x0a

อีกสามไบต์เป็นตัวแทนของอักขระที่ไม่ใช่ภาษาละติน ซึ่งเราให้เสียงเรียกเข้าเป็นสีเขียว เป็นอักขระ Unicode และใช้เวลาสามไบต์ในการเข้ารหัส เหล่านี้คือ 0xe1 , 0xaf และ 0x8a

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

ที่เกี่ยวข้อง: การเข้ารหัสอักขระเช่น ANSI และ Unicode คืออะไรและแตกต่างกันอย่างไร

การตั้งชื่อไฟล์จากไฟล์

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

แต่มี gotcha และมันใหญ่ ชื่อไฟล์จะต้องถูก ยกเลิก ด้วย ค่า null ไม่ใช่การขึ้นบรรทัดใหม่ นั่นคือหลังจากแต่ละชื่อไฟล์จะต้องมีไบต์ว่าง 0x00 แทนการขึ้นบรรทัดใหม่ปกติ 0x0a

คุณไม่สามารถเปิดตัวแก้ไขและสร้างไฟล์ด้วยรูปแบบนี้ โดยปกติ ไฟล์ประเภทนี้จะถูกสร้างขึ้นโดยโปรแกรมอื่น แต่ถ้าคุณมีไฟล์ดังกล่าว คุณจะใช้มันอย่างไร

นี่คือไฟล์ของเราที่มีชื่อไฟล์ การเปิด less จะแสดงอักขระ “ ^@ ” แปลก ๆ ที่ใช้ less เพื่อระบุไบต์ว่าง

 น้อย source-files-list.txt 

ไฟล์น้อยกว่าที่มี null ไบต์

ในการใช้ไฟล์ด้วย wc เราจำเป็นต้องใช้ --files0-from (อ่านอินพุตจาก) ตัวเลือกและส่งผ่านในชื่อของไฟล์ที่มีชื่อไฟล์

 wc ---files0-from=source-files-list.txt 

wc กำลังประมวลผลไฟล์ของ null ที่สิ้นสุดชื่อไฟล์

ไฟล์ได้รับการประมวลผลเหมือนกับว่าได้ระบุไว้ในบรรทัดคำสั่ง

ไปป์อินพุทไปที่ wc

วิธีทั่วไป ยืดหยุ่น และได้ผลกว่ามากในการส่งอินพุตไปยัง wc คือการไพพ์เอาต์พุตจากคำสั่งอื่นๆ ลงใน wc เราสามารถสาธิตสิ่งนี้ด้วยคำสั่ง echo

 echo "นับนี่สิ" | ห้องน้ำ
 echo -e "นับสิ่งนี้\nสำหรับฉัน" | ห้องน้ำ 

ใช้ echo เพื่อส่งข้อมูลเข้า wc

คำสั่ง echo ที่สองใช้ตัวเลือก -e (อักขระที่เป็นอักขระหลีก) เพื่ออนุญาตลำดับที่ใช้ Escape เช่น โค้ดการจัดรูปแบบบรรทัดใหม่ “ \n ” สิ่งนี้จะฉีดขึ้นบรรทัดใหม่ ทำให้ wc เห็นอินพุตเป็นสองบรรทัด

นี่คือลำดับของคำสั่งที่ป้อนข้อมูลจากคำสั่งหนึ่งไปยังอีกคำสั่งหนึ่ง

 ค้นหา ./* -type f | rev | ตัด -d'.' -f1 | rev | เรียงลำดับ | uniq
  • find ค้นหา ไฟล์ ( type -f ) แบบเรียกซ้ำโดยเริ่มต้นในไดเร็กทอรีปัจจุบัน rev กลับชื่อไฟล์
  • cut แยกฟิลด์แรก ( -f1 ) โดยกำหนดตัวคั่นฟิลด์ให้เป็นช่วงเวลา . ” และอ่านจาก “ด้านหน้า” ของชื่อไฟล์ที่กลับกันจนถึงช่วงแรกที่พบ ตอนนี้เราได้แยกนามสกุลไฟล์แล้ว
  • rev ย้อนกลับฟิลด์แรกที่แยกออกมา
  • sort จัด เรียงตามลำดับตัวอักษรจากน้อยไปมาก
  • uniq แสดงรายการที่ไม่ซ้ำกับหน้าต่างเทอร์มินัล

รายการส่วนขยายที่ไม่ซ้ำในแผนผังไดเร็กทอรีปัจจุบัน

คำสั่งนี้แสดงรายการนามสกุลไฟล์ที่ไม่ซ้ำกันทั้งหมดในไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยใดๆ

หากเราเพิ่มตัวเลือก -c (นับ) ให้กับคำสั่ง uniq มันจะนับการ เกิดขึ้น ของส่วนขยายแต่ละประเภท แต่ถ้าเราต้องการทราบว่ามีนามสกุลไฟล์ที่แตกต่างกันกี่นามสกุล เราสามารถวาง wc เป็นคำสั่งสุดท้ายในบรรทัด และใช้ตัวเลือก -l (บรรทัด)

 ค้นหา ./* -type f | rev | ตัด -d'.' -f1 | rev | เรียงลำดับ | ยูนิโคล่ | wc -l 

การเพิ่ม wc เพื่อนับส่วนขยายที่ไม่ซ้ำ

ที่เกี่ยวข้อง: วิธีใช้คำสั่งตัดลินุกซ์

และในที่สุดก็

นี่คือเคล็ดลับสุดท้ายที่ wc สามารถทำได้สำหรับคุณ มันจะบอกคุณถึงความยาวของบรรทัดที่ยาวที่สุดในไฟล์ น่าเศร้าที่มันไม่ได้บอกคุณว่าเป็นแนวไหน มันให้ความยาวแก่คุณ

 wc -L taf.c 

รับความยาวของบรรทัดที่ยาวที่สุดในไฟล์ด้วย wc

ระวังว่าแท็บนั้นนับเป็นแปดช่องว่าง ดูในโปรแกรมแก้ไขของฉัน มีแท็บสองช่องว่างสามแท็บที่จุดเริ่มต้นของบรรทัดนั้น ความยาวจริงของมันคือ 124 อักขระ ดังนั้นตัวเลขที่รายงานจึงขยายเกินจริง

ฉันจะจัดการกับฟังก์ชันนี้ด้วยเกลือเล็กน้อย และโดยที่ฉันหมายความว่าอย่าใช้มัน ผลลัพธ์ของมันทำให้เข้าใจผิด

แม้จะมีนิสัยใจคอ wc เป็นเครื่องมือที่ยอดเยี่ยมในการวางคำสั่ง piped เมื่อคุณต้องการนับค่าทุกประเภท ไม่ใช่แค่คำในไฟล์

ที่เกี่ยวข้อง: 37 คำสั่ง Linux ที่สำคัญที่คุณควรรู้