วิธีใช้คำสั่ง grep บน Linux
เผยแพร่แล้ว: 2022-01-29 คำสั่ง Linux grep
คือยูทิลิตีการจับคู่สตริงและรูปแบบที่แสดงบรรทัดที่ตรงกันจากหลายไฟล์ นอกจากนี้ยังทำงานร่วมกับเอาต์พุตแบบไพพ์จากคำสั่งอื่นๆ เราแสดงให้คุณเห็นว่า
เรื่องราวเบื้องหลัง grep
คำสั่ง grep
มีชื่อเสียงในแวดวง Linux และ Unix ด้วยเหตุผลสามประการ ประการแรกมันมีประโยชน์อย่างมาก ประการที่สอง ความมั่งคั่งของตัวเลือกสามารถครอบงำได้ ประการที่สาม มันถูกเขียนขึ้นในชั่วข้ามคืนเพื่อตอบสนองความต้องการเฉพาะ สองคนแรกถูกกระแทก ที่สามปิดเล็กน้อย
Ken Thompson ได้ดึงความสามารถในการค้นหานิพจน์ทั่วไปออกจากตัวแก้ไข ed
(ออกเสียงว่า ee-dee) และสร้างโปรแกรมเล็กๆ ขึ้นมาเพื่อใช้งานเอง เพื่อค้นหาไฟล์ข้อความ Doug McMahon หัวหน้าแผนกของเขาที่ Bell Labs ได้ติดต่อ Thompson และอธิบายปัญหาที่ Lee McMahon เพื่อนร่วมงานของเขากำลังเผชิญอยู่
แมคมาฮอนพยายามระบุผู้เขียนบทความของ Federalist ผ่านการวิเคราะห์ข้อความ เขาต้องการเครื่องมือที่สามารถค้นหาวลีและสตริงในไฟล์ข้อความได้ ทอมป์สันใช้เวลาประมาณหนึ่งชั่วโมงในเย็นวันนั้นเพื่อทำให้เครื่องมือของเขาเป็นยูทิลิตี้ทั่วไปที่ผู้อื่นสามารถใช้และเปลี่ยนชื่อเป็น grep
เขาใช้ชื่อจากสตริงคำสั่ง ed
g/re/p
ซึ่งแปลว่า "การค้นหานิพจน์ทั่วไปทั่วโลก"
คุณสามารถรับชม Thompson พูดคุยกับ Brian Kernighan เกี่ยวกับการกำเนิดของ grep
การค้นหาอย่างง่ายด้วย grep
ในการค้นหาสตริงภายในไฟล์ ให้ส่งคำค้นหาและชื่อไฟล์บนบรรทัดคำสั่ง:
เส้นที่ตรงกันจะปรากฏขึ้น ในกรณีนี้จะเป็นบรรทัดเดียว ข้อความที่ตรงกันจะถูกเน้น นี่เป็นเพราะการแจกแจงส่วนใหญ่ grep
มีนามแฝงว่า:
นามแฝง grep='grep --colour=auto'
ลองดูผลลัพธ์ที่มีหลายบรรทัดที่ตรงกัน เราจะมองหาคำว่า “เฉลี่ย” ในไฟล์บันทึกของแอปพลิเคชัน เนื่องจากเราจำไม่ได้ว่าคำนั้นอยู่ในไฟล์บันทึกหรือไม่ เราจะใช้ตัวเลือก -i
(ละเว้นตัวพิมพ์เล็ก):
grep -i เฉลี่ย geek-1.log
ทุกบรรทัดที่ตรงกันจะปรากฏขึ้น โดยเน้นข้อความที่ตรงกันในแต่ละบรรทัด
เราสามารถแสดงบรรทัดที่ไม่ตรงกันโดยใช้ตัวเลือก -v (กลับด้าน)
grep -v Mem geek-1.log
ไม่มีการเน้นเนื่องจากเป็นบรรทัดที่ไม่ตรงกัน
เราสามารถทำให้ grep
เงียบสนิทได้ ผลลัพธ์ถูกส่งไปยังเชลล์เป็นค่าส่งคืนจาก grep
ผลลัพธ์ของศูนย์หมายถึงพบสตริง และผลลัพธ์ของหนึ่งหมายความ ว่าไม่ พบ สตริง เราสามารถตรวจสอบรหัสส่งคืนโดยใช้ $?
พารามิเตอร์พิเศษ:
grep -q เฉลี่ย geek-1.log
เสียงสะท้อน $?
grep -q howtogeek geek-1.log
เสียงสะท้อน $?
การค้นหาแบบเรียกซ้ำด้วย grep
หากต้องการค้นหาผ่านไดเร็กทอรีที่ซ้อนกันและไดเร็กทอรีย่อย ให้ใช้ตัวเลือก -r (แบบเรียกซ้ำ) โปรดทราบว่าคุณไม่ได้ระบุชื่อไฟล์ในบรรทัดคำสั่ง คุณต้องระบุเส้นทาง เรากำลังค้นหาในไดเร็กทอรีปัจจุบัน “.” และไดเร็กทอรีย่อยใดๆ:
grep -r -i memfree
ผลลัพธ์รวมถึงไดเร็กทอรีและชื่อไฟล์ของแต่ละบรรทัดที่ตรงกัน
เราสามารถทำให้ grep
ติดตามลิงก์สัญลักษณ์ได้โดยใช้ตัวเลือก -R
(recursive dereference) เรามีลิงก์สัญลักษณ์ในไดเร็กทอรีนี้ เรียกว่า logs-folder
มันชี้ไปที่ /home/dave/logs
ls -l บันทึกโฟลเดอร์
ลองทำการค้นหาครั้งล่าสุดของเราซ้ำด้วยตัวเลือก -R
(recursive dereference):
grep -R -i memfree
ตามลิงค์สัญลักษณ์และไดเรกทอรีที่ชี้ไปจะถูกค้นหาโดย grep
ด้วย
ค้นหาทั้งคำ
โดยค่าเริ่มต้น grep
จะจับคู่บรรทัดหากเป้าหมายการค้นหาปรากฏที่ใดก็ได้ในบรรทัดนั้น รวมถึงภายในสตริงอื่นด้วย ดูตัวอย่างนี้ เราจะค้นหาคำว่า "ฟรี"
grep -i ฟรี geek-1.log
ผลลัพธ์คือบรรทัดที่มีสตริง "free" อยู่ในนั้น แต่ไม่ใช่คำที่แยกจากกัน พวกเขาเป็นส่วนหนึ่งของสตริง "MemFree"
หากต้องการบังคับให้ grep
จับคู่เฉพาะ "คำ" ให้ใช้ตัวเลือก -w
(word regexp)
grep -w -i ฟรี geek-1.log
เสียงสะท้อน $?
คราวนี้ไม่มีผลลัพธ์เนื่องจากคำค้นหา "ฟรี" ไม่ปรากฏในไฟล์เป็นคำที่แยกจากกัน
การใช้คำค้นหาหลายคำ
ตัวเลือก -E
(extended regexp) ช่วยให้คุณค้นหาคำได้หลายคำ (ตัวเลือก -E
แทนที่ grep
เวอร์ชัน egrep
ที่เลิกใช้แล้ว)
คำสั่งนี้จะค้นหาคำค้นหาสองคำคือ "ค่าเฉลี่ย" และ "memfree"
grep -E -w -i "average|memfree" geek-1.log
บรรทัดที่ตรงกันทั้งหมดจะแสดงขึ้นสำหรับคำค้นหาแต่ละคำ
คุณยังสามารถค้นหาคำหลายคำที่ไม่จำเป็นต้องเป็นทั้งคำ แต่ก็สามารถเป็นทั้งคำได้เช่นกัน
ตัวเลือก -e
(รูปแบบ) ช่วยให้คุณใช้คำค้นหาหลายคำในบรรทัดคำสั่งได้ เรากำลังใช้ประโยชน์จากคุณสมบัติวงเล็บนิพจน์ทั่วไปเพื่อสร้างรูปแบบการค้นหา มันบอกให้ grep
จับคู่อักขระตัวใดตัวหนึ่งที่อยู่ในวงเล็บ "[]" ซึ่งหมายความว่า grep
จะจับคู่ "kB" หรือ "KB" ขณะที่ค้นหา
สตริงทั้งสองตรงกัน และที่จริงแล้ว บางบรรทัดมีทั้งสองสตริง
จับคู่เส้นตรงทั้งหมด
-x
(line regexp) จะจับคู่เฉพาะบรรทัดที่ ทั้งบรรทัด ตรงกับข้อความค้นหา มาค้นหาตราประทับวันที่และเวลาที่เราทราบว่าปรากฏเพียงครั้งเดียวในไฟล์บันทึก:
grep -x "20-Jan--06 15:24:35" geek-1.log
พบและแสดงบรรทัดเดียวที่ตรงกัน
ตรงกันข้ามคือแสดงเฉพาะบรรทัดที่ ไม่ ตรงกัน สิ่งนี้มีประโยชน์เมื่อคุณดูไฟล์การกำหนดค่า ความคิดเห็นนั้นยอดเยี่ยม แต่บางครั้งก็ยากที่จะระบุการตั้งค่าจริงจากทั้งหมด นี่คือไฟล์ /etc/sudoers
:
เราสามารถกรองบรรทัดความคิดเห็นได้อย่างมีประสิทธิภาพดังนี้:
sudo grep -v "#" /etc/sudoers
แยกวิเคราะห์ง่ายกว่ามาก
แสดงเฉพาะข้อความที่ตรงกัน
อาจมีบางครั้งที่คุณไม่ต้องการเห็นบรรทัดที่ตรงกันทั้งหมด เพียงแต่ข้อความที่ตรงกัน ตัวเลือก -o
(จับคู่เท่านั้น) ทำเช่นนั้น
grep -o MemFree geek-1.log
การแสดงผลถูกย่อให้แสดงเฉพาะข้อความที่ตรงกับคำค้นหา แทนที่จะแสดงทั้งบรรทัดที่ตรงกัน
นับด้วย grep
grep
ไม่ได้เป็นเพียงเกี่ยวกับข้อความเท่านั้น แต่ยังสามารถให้ข้อมูลที่เป็นตัวเลขได้อีกด้วย เราสามารถนับ grep
ให้เราได้หลายวิธี หากเราต้องการทราบจำนวนครั้งที่ข้อความค้นหาปรากฏในไฟล์ เราสามารถใช้ตัวเลือก -c
(นับ)
grep -c เฉลี่ย geek-1.log
grep
รายงานว่าข้อความค้นหาปรากฏขึ้น 240 ครั้งในไฟล์นี้
คุณสามารถทำให้ grep
แสดงหมายเลขบรรทัดสำหรับแต่ละบรรทัดที่ตรงกันโดยใช้ตัวเลือก -n
(หมายเลขบรรทัด)
grep -n Jan geek-1.log
หมายเลขบรรทัดสำหรับแต่ละบรรทัดที่ตรงกันจะแสดงที่จุดเริ่มต้นของบรรทัด
หากต้องการลดจำนวนผลลัพธ์ที่แสดง ให้ใช้ตัวเลือก -m
(จำนวนสูงสุด) เราจะจำกัดเอาต์พุตไว้ที่ห้าบรรทัดที่ตรงกัน:
grep -m5 -n ม.ค. geek-1.log
การเพิ่มบริบท
การสามารถเห็นบรรทัดเพิ่มเติมบางบรรทัด - อาจเป็นบรรทัดที่ไม่ตรงกัน - สำหรับแต่ละบรรทัดที่ตรงกันมักจะมีประโยชน์ สามารถช่วยแยกแยะว่าเส้นที่ตรงกันคือเส้นใดที่คุณสนใจ
หากต้องการแสดงบางบรรทัดหลังบรรทัดที่ตรงกัน ให้ใช้ตัวเลือก -A (หลังบริบท) เราขอสามบรรทัดในตัวอย่างนี้:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log
หากต้องการดูบางบรรทัดก่อนถึงบรรทัดที่ตรงกัน ให้ใช้ตัวเลือก -B
(บริบทก่อน)
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log
และหากต้องการรวมบรรทัดก่อนและหลังบรรทัดที่ตรงกัน ให้ใช้ตัวเลือก -C
(บริบท)
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log
กำลังแสดงไฟล์ที่ตรงกัน
หากต้องการดูชื่อไฟล์ที่มีคำค้นหา ให้ใช้ตัวเลือก -l
(ไฟล์ที่ตรงกัน) หากต้องการค้นหาว่าไฟล์ซอร์สโค้ด C ใดมีการอ้างอิงไปยังไฟล์ส่วนหัว sl.h
ให้ใช้คำสั่งนี้:
grep -l "sl.h" *.c
ชื่อไฟล์อยู่ในรายการ ไม่ใช่บรรทัดที่ตรงกัน
และแน่นอน เราสามารถค้นหาไฟล์ที่ไม่มีคำค้นหาได้ ตัวเลือก -L
(ไฟล์ที่ไม่ตรงกัน) ทำได้แค่นั้น
grep -L "sl.h" *.c
จุดเริ่มต้นและจุดสิ้นสุดของบรรทัด
เราสามารถบังคับให้ grep
แสดงเฉพาะการจับคู่ที่จุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัด ตัวดำเนินการนิพจน์ทั่วไป "^" ตรงกับจุดเริ่มต้นของบรรทัด แทบทุกบรรทัดในล็อกไฟล์จะมีช่องว่าง แต่เราจะค้นหาบรรทัดที่มีช่องว่างเป็นอักขระตัวแรก:
grep "^ " geek-1.log
บรรทัดที่มีช่องว่างเป็นอักขระตัวแรก—ที่ต้นบรรทัด—จะแสดงขึ้น
เพื่อให้ตรงกับส่วนท้ายของบรรทัด ให้ใช้ตัวดำเนินการนิพจน์ทั่วไป “$” เราจะค้นหาบรรทัดที่ลงท้ายด้วย “00”
grep "00$" geek-1.log
หน้าจอแสดงบรรทัดที่มี “00” เป็นอักขระสุดท้าย
การใช้ท่อกับ grep
แน่นอน คุณสามารถไพพ์อินพุตไปที่ grep
เอาต์พุตจาก grep
ไปยังโปรแกรมอื่น และให้ grep
อยู่ตรงกลางของไพพ์เชน
สมมติว่าเราต้องการเห็นการเกิดขึ้นทั้งหมดของสตริง “ExtractParameters” ในไฟล์ซอร์สโค้ด C ของเรา เรารู้ว่าจะมีค่อนข้างน้อย ดังนั้นเราจึงไพพ์เอาต์พุตเป็น less
:
grep "ExtractParameters" *.c | น้อย
ผลลัพธ์ถูกนำเสนอใน less
ซึ่งจะทำให้คุณสามารถเลื่อนดูรายการไฟล์และใช้สิ่งอำนวยความสะดวกในการค้นหา less's
หากเราไพพ์เอาต์พุตจาก grep
ไปที่ wc
และใช้ตัวเลือก -l
(บรรทัด) เราสามารถนับจำนวนบรรทัดในไฟล์ซอร์สโค้ดที่มี "ExtractParameters" (เราสามารถทำได้โดยใช้ตัวเลือก grep
-c
(count) แต่นี่เป็นวิธีที่เรียบร้อยในการสาธิตการวางท่อ grep
)
grep "ExtractParameters" *.c | wc -l
ด้วยคำสั่งถัดไป เรากำลังไพพ์เอาต์พุตจาก ls
ไปที่ grep
และไพพ์เอาต์พุตจาก grep
ไปเป็น sort
เรากำลังแสดงรายการไฟล์ในไดเร็กทอรีปัจจุบัน เลือกไฟล์ที่มีสตริง "Aug" และจัดเรียงตามขนาดไฟล์:
ls -l | grep "ส.ค." | เรียงลำดับ +4n
มาทำลายมันกันเถอะ:
- ls -l : ทำการแสดงรายการไฟล์ในรูปแบบยาวโดยใช้
ls
- grep “Aug” : เลือกบรรทัดจากรายการ
ls
ที่มี “Aug” อยู่ในนั้น โปรดทราบว่าการดำเนินการนี้จะพบไฟล์ที่มีชื่อ "Aug" ด้วย - sort +4n : เรียงลำดับผลลัพธ์จาก grep ในคอลัมน์ที่สี่ (ขนาดไฟล์)
เราได้รับรายการเรียงของไฟล์ทั้งหมดที่แก้ไขในเดือนสิงหาคม (โดยไม่คำนึงถึงปี) โดยเรียงจากน้อยไปมากของขนาดไฟล์
ที่เกี่ยวข้อง: วิธีใช้ท่อบน Linux
grep: ออกคำสั่งน้อยลง เป็นพันธมิตรมากขึ้น
grep
เป็นเครื่องมือที่ยอดเยี่ยมสำหรับคุณ มีมาตั้งแต่ปี 1974 และยังคงแข็งแกร่งเพราะเราต้องการในสิ่งที่ทำ และไม่มีอะไรดีขึ้น
การจับคู่ grep
กับนิพจน์ทั่วไปบางตัว fu นำไปสู่ระดับต่อไปจริงๆ
ที่เกี่ยวข้อง: วิธีใช้นิพจน์ทั่วไปพื้นฐานเพื่อค้นหาได้ดีขึ้นและประหยัดเวลา
คำสั่งลินุกซ์ | ||
ไฟล์ | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · เข้าร่วม · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · ดู · strings · พิมพ์ · เปลี่ยนชื่อ · zip · unzip · เมานต์ · umount · ติดตั้ง · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · แพทช์ · แปลง · rclone · ฉีก · srm | |
กระบวนการ | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · หมดเวลา · ผนัง · ใช่ · ฆ่า · หลับ · sudo · su · เวลา · groupadd · usermod · กลุ่ม · lshw · ปิดระบบ · รีบูต · หยุด · poweroff · passwd · lscpu · crontab · วันที่ · bg · fg | |
ระบบเครือข่าย | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
ที่เกี่ยวข้อง: แล็ปท็อป Linux ที่ดีที่สุดสำหรับนักพัฒนาและผู้ที่ชื่นชอบ