วิธีใช้คำสั่ง wc ใน Linux
เผยแพร่แล้ว: 2022-07-23
การนับจำนวนบรรทัด คำ และไบต์ในไฟล์นั้นมีประโยชน์ แต่ความยืดหยุ่นที่แท้จริงของคำสั่ง Linux wc
มาจากการทำงานกับคำสั่งอื่นๆ ลองมาดูกัน
คำสั่ง wc คืออะไร?
คำสั่ง wc
เป็นโปรแกรมขนาดเล็ก เป็นหนึ่งในยูทิลิตี้หลักของ Linux ดังนั้นจึงไม่จำเป็นต้องติดตั้ง มันจะอยู่ในคอมพิวเตอร์ Linux ของคุณอยู่แล้ว
คุณสามารถอธิบายสิ่งที่ทำในคำไม่กี่คำ โดยจะนับบรรทัด คำ และไบต์ในไฟล์หรือการเลือกไฟล์ และพิมพ์ผลลัพธ์ในหน้าต่างเทอร์มินัล นอกจากนี้ยังสามารถรับข้อมูลจากสตรีม STDIN ซึ่งหมายความว่าข้อความที่คุณต้องการให้ประมวลผลสามารถวางลงในนั้นได้ นี่คือจุดที่ wc
เริ่มเพิ่มมูลค่าจริงๆ
เป็นตัวอย่างที่ดีของมนต์ลินุกซ์เรื่อง "ทำสิ่งหนึ่งและทำได้ดี" เนื่องจากมันรับอินพุตแบบไพพ์ จึงสามารถใช้ในคาถาหลายคำสั่งได้ อย่างที่เราเห็น ยูทิลิตี้แบบสแตนด์อโลนเล็กๆ นี้จริงๆ แล้วเป็นผู้เล่นในทีมที่ยอดเยี่ยม
วิธีหนึ่งที่ฉันใช้ wc
คือเป็นตัวยึดตำแหน่งในคำสั่งที่ซับซ้อนหรือนามแฝงที่ฉันกำลังทำอาหาร หากคำสั่งที่เสร็จสิ้นแล้วมีศักยภาพที่จะทำลายและลบไฟล์ได้ ฉันมักจะใช้ wc
เป็นคำสั่งแทนคำสั่งจริงที่อันตราย
ด้วยวิธีนี้ ในระหว่างการพัฒนาคำสั่ง ฉันจะได้รับคำติชมด้วยภาพว่าแต่ละไฟล์กำลังได้รับการประมวลผลตามที่ฉันคาดไว้ ไม่มีทางที่สิ่งเลวร้ายจะเกิดขึ้นในขณะที่ฉันกำลังต่อสู้กับไวยากรณ์
เรียบง่ายเหมือนห้อง wc
ยังมีนิสัยใจคอเล็ก ๆ น้อย ๆ ที่คุณต้องรู้
เริ่มต้นกับ wc
วิธีที่ง่ายที่สุดในการใช้ wc
คือการส่งชื่อของไฟล์ข้อความบนบรรทัดคำสั่ง
wc lorem.txt
สิ่งนี้ทำให้ wc
สแกนไฟล์และนับจำนวนบรรทัด คำ และไบต์ และเขียนลงในหน้าต่างเทอร์มินัล
คำถือเป็นสิ่งที่ล้อมรอบด้วยช่องว่าง ไม่ว่าจะเป็นคำจากภาษาจริงหรือไม่ก็ไม่เกี่ยวข้อง หากไฟล์ไม่มีสิ่งใดนอกจาก “frd g lkj” ไฟล์นั้นจะยังนับเป็นสามคำ
บรรทัดคือลำดับของอักขระที่สิ้นสุดโดยการขึ้นบรรทัดใหม่หรือส่วนท้ายของไฟล์ ไม่สำคัญว่าบรรทัดจะวนอยู่ในโปรแกรมแก้ไขหรือในหน้าต่างเทอร์มินัล จนกว่า wc
จะพบการขึ้นบรรทัดใหม่หรือจุดสิ้นสุดของไฟล์ ยังคงเป็นบรรทัดเดียวกัน
ตัวอย่างแรกของเราพบหนึ่งบรรทัดในไฟล์ทั้งหมด นี่คือเนื้อหาของไฟล์ “lorem.txt”
cat lorem.txt
ทั้งหมดนี้นับเป็นบรรทัดเดียวเนื่องจากไม่มีการขึ้นบรรทัดใหม่ เปรียบเทียบสิ่งนี้กับไฟล์อื่น “lorem2.txt” และวิธีที่ wc
ตีความมัน
wc lorem2.txt
แมว lorem2.txt
ครั้งนี้ wc
นับ 15 บรรทัด เนื่องจากการขึ้นบรรทัดใหม่ถูกแทรกลงในข้อความเพื่อขึ้นบรรทัดใหม่ ณ จุดที่กำหนด อย่างไรก็ตาม หากคุณนับบรรทัดที่มีข้อความอยู่ คุณจะเห็นว่ามีเพียง 12 บรรทัดเท่านั้น
อีกสามบรรทัดเป็นบรรทัดว่างที่ท้ายไฟล์ สิ่งเหล่านี้มีเพียงการคืนสินค้า แม้ว่าบรรทัดเหล่านี้จะไม่มีข้อความ แต่ก็มีการขึ้นบรรทัดใหม่ ดังนั้น wc
จึงนับไว้เช่นนั้น
เราสามารถส่งไฟล์ไปยัง wc
ได้มากเท่าที่เราต้องการ
wc lorem.txt lorem2.txt
เราได้รับสถิติสำหรับแต่ละไฟล์และผลรวมของไฟล์ทั้งหมด
นอกจากนี้เรายังสามารถใช้สัญลักษณ์แทนเพื่อให้เราสามารถเลือกไฟล์ที่ตรงกันแทนไฟล์ที่มีชื่ออย่างชัดเจน
wc *.txt *.?
ตัวเลือกบรรทัดคำสั่ง
โดยค่าเริ่มต้น wc
จะแสดงบรรทัด คำ และไบต์ในแต่ละไฟล์ เหมือนกับการใช้ตัวเลือก -l
(บรรทัด) -w
(คำ) และ -c
(ไบต์)
wc lorem.txt
wc -l -w -c lorem.txt
เราสามารถระบุได้ว่าเราต้องการดูชุดค่าผสมใด
wc -l lorem.txt wc -w lorem.txt wc -c lorem.txt wc -l -c lorem.txt
ควรให้ความสนใจเป็นพิเศษกับตัวเลขสุดท้าย ซึ่งสร้างโดยตัวเลือก -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
ใน 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
ในการใช้ไฟล์ด้วย wc
เราจำเป็นต้องใช้ --files0-from
(อ่านอินพุตจาก) ตัวเลือกและส่งผ่านในชื่อของไฟล์ที่มีชื่อไฟล์
wc ---files0-from=source-files-list.txt
ไฟล์ได้รับการประมวลผลเหมือนกับว่าได้ระบุไว้ในบรรทัดคำสั่ง
ไปป์อินพุทไปที่ wc
วิธีทั่วไป ยืดหยุ่น และได้ผลกว่ามากในการส่งอินพุตไปยัง wc
คือการไพพ์เอาต์พุตจากคำสั่งอื่นๆ ลงใน wc
เราสามารถสาธิตสิ่งนี้ด้วยคำสั่ง echo
echo "นับนี่สิ" | ห้องน้ำ
echo -e "นับสิ่งนี้\nสำหรับฉัน" | ห้องน้ำ
คำสั่ง 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 -L taf.c
ระวังว่าแท็บนั้นนับเป็นแปดช่องว่าง ดูในโปรแกรมแก้ไขของฉัน มีแท็บสองช่องว่างสามแท็บที่จุดเริ่มต้นของบรรทัดนั้น ความยาวจริงของมันคือ 124 อักขระ ดังนั้นตัวเลขที่รายงานจึงขยายเกินจริง
ฉันจะจัดการกับฟังก์ชันนี้ด้วยเกลือเล็กน้อย และโดยที่ฉันหมายความว่าอย่าใช้มัน ผลลัพธ์ของมันทำให้เข้าใจผิด
แม้จะมีนิสัยใจคอ wc
เป็นเครื่องมือที่ยอดเยี่ยมในการวางคำสั่ง piped เมื่อคุณต้องการนับค่าทุกประเภท ไม่ใช่แค่คำในไฟล์
ที่เกี่ยวข้อง: 37 คำสั่ง Linux ที่สำคัญที่คุณควรรู้