16 ตัวอย่างคำสั่ง grep ที่จะช่วยคุณในโลกแห่งความเป็นจริง
เผยแพร่แล้ว: 2021-02-23grep ซึ่งแต่เดิมพัฒนาขึ้นสำหรับระบบที่ใช้ Unix เป็นหนึ่งในยูทิลิตี้บรรทัดคำสั่งที่ใช้กันอย่างแพร่หลายในกล่อง Linux
ชื่อของมันมาจากคำสั่งอื่นที่คล้ายกันในเครื่องมือ ed เช่น g/re/p ซึ่งย่อมาจาก g lobally ค้นหานิพจน์ re gular และ p พิมพ์บรรทัดที่ตรงกัน โดยทั่วไป grep จะค้นหารูปแบบที่กำหนดหรือนิพจน์ทั่วไปจากอินพุตหรือไฟล์มาตรฐาน และพิมพ์บรรทัดที่ตรงกับเกณฑ์ที่กำหนด มักใช้เพื่อกรองรายละเอียดที่ไม่จำเป็นออกในขณะที่พิมพ์เฉพาะข้อมูลที่จำเป็นจากไฟล์บันทึกขนาดใหญ่
พลังของนิพจน์ทั่วไปรวมกับตัวเลือกที่รองรับใน grep ทำให้สิ่งนี้เป็นไปได้
ในที่นี้เราจะกล่าวถึงคำสั่ง grep ที่ใช้กันทั่วไปในสถานการณ์ต่างๆ โดยผู้ดูแลระบบหรือนักพัฒนาซอฟต์แวร์
มาเริ่มกันเลย…
ไวยากรณ์คำสั่ง grep
คำสั่ง grep ต้องการรูปแบบและอาร์กิวเมนต์ทางเลือกพร้อมกับรายการไฟล์หากใช้โดยไม่มีการวางท่อ
$ grep [options] pattern [files]ตัวอย่างง่ายๆ คือ:
$ grep my file.txt my_file $ค้นหาหลายไฟล์
grep ช่วยให้คุณค้นหารูปแบบที่กำหนดได้ ไม่ใช่แค่ไฟล์เดียวแต่มีหลายไฟล์ ต่อไปนี้คือวิธีค้นหารูปแบบในหลายไฟล์โดยใช้สัญลักษณ์แทน *
$ sudo grep -i err /var/log/messages*เอาท์พุต:
$ sudo grep err /var/log/messages* /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. $ คุณสามารถสังเกตจากเอาต์พุตด้านบนที่ชื่อไฟล์ถูกพิมพ์ก่อนพิมพ์บรรทัดที่ตรงกันเพื่อระบุตำแหน่งที่ grep พบรูปแบบที่กำหนด
การค้นหาที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
grep เสนอให้ค้นหารูปแบบโดยไม่ต้องดูกรณีของรูปแบบ ใช้ -i flag เพื่อบอกให้ grep ละเว้น case
$ grep -i [pattern] [file]เอาท์พุต:
$ grep -i it text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ค้นหาทั้งคำ
ไม่ใช่เสมอไปที่เราต้องการการจับคู่บางส่วน แต่คาดหวังให้ grep จับคู่คำที่สมบูรณ์เท่านั้น คุณสามารถทำได้ด้วยแฟล็ก -w
$ grep -w [pattern] [file]เอาท์พุต:
$ grep -w is text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $ตรวจสอบจำนวนการแข่งขัน
บางครั้งแทนที่จะใช้บรรทัดที่ตรงกันจริง ๆ เราต้องการเพียงจำนวนการจับคู่ที่สำเร็จที่ grep ทำ เราสามารถนับจำนวนนี้ได้โดยใช้ตัวเลือก -c
$ grep -c [pattern] [file]เอาท์พุต:
$ grep -c is text_file.txt 2 $ค้นหาไดเรกทอรีย่อย
มักจำเป็นในการค้นหาไฟล์ ไม่ใช่แค่ในไดเร็กทอรีการทำงานปัจจุบัน แต่ยังรวมถึงในไดเร็กทอรีย่อยด้วย grep ช่วยให้คุณทำได้อย่างง่ายดายด้วยแฟล็ก -r
$ grep -r [pattern] *เอาท์พุต:
$ grep -r Hello * dir1/file1.txt:Hello One dir1/file2.txt:Hello Two dir1/file3.txt:Hello Three $ตามที่คุณสังเกตเห็น grep จะข้ามผ่านแต่ละไดเร็กทอรีย่อยภายในไดเร็กทอรีปัจจุบัน และแสดงรายการไฟล์และบรรทัดที่พบการจับคู่
การค้นหาผกผัน
หากคุณต้องการค้นหาบางสิ่งที่ไม่ตรงกับรูปแบบที่กำหนด grep อนุญาตให้ทำเช่นนั้นด้วยแฟล็ก -v
$ grep -v [pattern] [file]เอาท์พุต:
$ grep This text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $ grep -v This text_file.txt several lines to be used as part of testing grep functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $ คุณสามารถเปรียบเทียบผลลัพธ์ของคำสั่ง grep ในรูปแบบเดียวกันและไฟล์ที่มีและไม่มีแฟล็ก -v ด้วย -v บรรทัดใดที่ไม่ตรงกับรูปแบบจะถูกพิมพ์
พิมพ์หมายเลขบรรทัด
grep ช่วยให้คุณสามารถพิมพ์หมายเลขบรรทัดพร้อมกับบรรทัดที่พิมพ์ ซึ่งช่วยให้ทราบตำแหน่งบรรทัดในไฟล์ได้ง่าย ใช้ -n ตัวเลือกตามที่แสดงเพื่อรับหมายเลขบรรทัดในเอาต์พุต
$ grep -n [pattern] [file]เอาท์พุต:
$ grep -n This text_file.txt 1:This is a sample text file. It contains 7:This is a sample text file. It's repeated two times. $จำกัด เอาต์พุต grep
สำหรับไฟล์ขนาดใหญ่ เช่น บันทึก ฯลฯ เอาต์พุต grep อาจยาวได้ และคุณอาจต้องใช้จำนวนบรรทัดคงที่ในเอาต์พุตแทนที่จะจับคู่ทุกอย่าง เราสามารถใช้ – m[num] เพื่อจำกัดบรรทัดที่พิมพ์ด้วย num นี่คือวิธีการใช้งาน:
$ grep -m[num] [pattern] [file] สังเกตว่าการใช้แฟล็ก -m มีผลอย่างไรกับผลลัพธ์ของ grep สำหรับชุดเงื่อนไขเดียวกันในตัวอย่างด้านล่าง:
$ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep -m2 It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as $แสดงบรรทัดเพิ่มเติม
บ่อยครั้งที่เราไม่ต้องการเพียงแค่เส้นที่มีรูปแบบตรงกันเท่านั้น แต่ต้องมีเส้นด้านบนหรือด้านล่างเพื่อบริบทที่ดีขึ้น

เป็นไปได้ที่จะพิมพ์บรรทัดด้านบนหรือด้านล่าง (หรือทั้งสองอย่าง) บรรทัดที่มีรูปแบบโดยใช้ grep โดยใช้แฟล็ก -A , -B หรือ -C ที่มีค่า num ตัวเลขในที่นี้ num ถึงจำนวนบรรทัดเพิ่มเติมที่จะพิมพ์ซึ่งอยู่เหนือหรือใต้บรรทัดที่ตรงกัน สิ่งนี้ใช้ได้กับการจับคู่ทั้งหมดที่ grep พบในไฟล์หรือรายการไฟล์ที่ระบุ
$ grep -A[num] [pattern] [file]หรือ
$ grep -B[num] [pattern] [file]หรือ
$ grep -C[num] [pattern] [file] เอาต์พุตด้านล่างแสดงเอาต์พุต grep ปกติ เช่นเดียวกับเอาต์พุตที่มีแฟล็ก -A , -B และ -C ทีละรายการ สังเกตว่า grep ตีความแฟล็กและค่าของมันอย่างไร รวมถึงการเปลี่ยนแปลงในเอาต์พุตที่เกี่ยวข้อง ด้วยแฟล็ก -A1 grep พิมพ์ 1 บรรทัดซึ่งตามหลังบรรทัดที่ตรงกัน
ในทำนองเดียวกัน ด้วยแฟ -B1 จะพิมพ์ 1 บรรทัดก่อนบรรทัดที่ตรงกัน ด้วยแฟล็ก -C1 จะพิมพ์ 1 บรรทัดซึ่งอยู่ก่อนและหลังบรรทัดที่ตรงกัน
$ grep numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as $ grep -A1 numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $ grep -B1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as $ grep -C1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $แสดงรายการชื่อไฟล์
หากต้องการพิมพ์เฉพาะชื่อของไฟล์ที่พบรูปแบบแทนบรรทัดที่ตรงกันจริงๆ ให้ใช้แฟล็ก -l
$ grep -l [pattern] [file]นี่คือตัวอย่างการทำงาน:
$ grep -l su *.txt file.txt text_file.txt $พิมพ์เส้นตรง
บางครั้งเราต้องพิมพ์เส้นให้ตรงกับรูปแบบที่กำหนด ไม่ใช่บางส่วน grep อนุญาตให้แฟล็ก -x ทำเช่นนั้น
$ grep -x [pattern] [file] ในตัวอย่างด้านล่าง file.txt มีบรรทัดที่มีคำว่า "support" เพียงคำเดียว ดังนั้นจะถูกจับคู่โดย grep ที่มีแฟล็ก -x ในขณะที่ละเว้นบรรทัดที่อาจมีคำว่า "support" พร้อมกับข้อความอื่นๆ
$ grep -x support *.txt file.txt:support $จับคู่สตริงเริ่มต้น
เมื่อใช้นิพจน์ทั่วไป เราจะพบสตริงที่จุดเริ่มต้นของบรรทัด นี่คือวิธีการทำ
$ grep [options] "^[string]" [file]ตัวอย่าง:
$ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep ^It text_file.txt It supports numbers like 1, 2, 3 etc. as well as $ สังเกตว่าการใช้อักขระ ^ เปลี่ยนผลลัพธ์อย่างไร ^ หมายถึงจุดเริ่มต้นของสตริงและ grep ที่ตรงกัน ^It เป็นบรรทัดใดๆ ที่ขึ้นต้นด้วยคำว่า It การใส่เครื่องหมายคำพูดสามารถช่วยได้เมื่อรูปแบบมีช่องว่าง เป็นต้น
สตริงสิ้นสุดการแข่งขัน
นิพจน์ทั่วไปที่มีประโยชน์ทั่วไปอีกอย่างหนึ่งคือการจับคู่จุดสิ้นสุดของรูปแบบเส้น
$ grep [options] "[string]$" [file]ตัวอย่าง:
$ grep "\." text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $ grep "\.$" text_file.txt kind of data but it works best with text data. alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $ เราพยายามจับ . อักขระที่อยู่ท้ายบรรทัด เนื่องจากจุด (.) เป็นอักขระที่มีความหมายพิเศษ เราจำเป็นต้องหลีกเลี่ยงด้วยอักขระ \ โปรดสังเกตอีกครั้งว่าเอาต์พุตแตกต่างกันอย่างไรเมื่อเราจับ . character และเมื่อเราใช้ $ เพื่อสั่งให้ grep จับคู่เฉพาะบรรทัดที่ลงท้ายด้วย . (ไม่ใช่สิ่งที่อาจมีอยู่ตรงกลาง)
ใช้ไฟล์รูปแบบ
อาจมีสถานการณ์ที่คุณมีรายการรูปแบบที่ซับซ้อนที่คุณใช้บ่อยๆ แทนที่จะจดทุกครั้ง คุณสามารถระบุรายการรูปแบบในไฟล์และใช้กับแฟล็ก -f ไฟล์ควรมีหนึ่งรูปแบบต่อบรรทัด
$ grep -f [pattern_file] [file_to_match] ในตัวอย่างของเรา เราได้สร้างชื่อไฟล์ pattern.txt โดยมีเนื้อหาด้านล่าง:
$ cat pattern.txt This It $ หากต้องการใช้ให้ใช้แฟล็ก -f
$ grep -f pattern.txt text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ระบุหลายรูปแบบ
grep อนุญาตให้ระบุหลายรูปแบบโดยใช้แฟล็ก -e
$ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]ตัวอย่าง:
$ grep -e is -e It -e to text_file.txt This is a sample text file. It contains several lines to be used as part of testing grep It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ระบุ Extended RegEx
grep ยังรองรับ Extended Regular Expressions หรือ ERE โดยใช้แฟล็ก -E ซึ่งคล้ายกับคำสั่ง egrep ใน Linux
การใช้ ERE มีข้อได้เปรียบเมื่อคุณต้องการใช้อักขระเมตาตามที่เป็นอยู่ และไม่ต้องการแทนที่อักขระเหล่านี้เป็นสตริง เช่น grep สิ่งนี้ช่วยให้คุณมีความยืดหยุ่นมากขึ้นในแง่ของการหลบหนี เนื่องจากเราต้องดำเนินการในกรณีของ grep ดังที่กล่าวไว้ การใช้ -E กับ grep นั้นเทียบเท่ากับคำสั่ง egrep
$ grep -E '[Extended RegEx]' [file] นี่คือการใช้ ERE อย่างหนึ่งที่เราต้องการพิมพ์บรรทัดที่ไม่ได้แสดงความคิดเห็นหรือเว้นว่างไว้ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการค้นหาบางสิ่งในไฟล์คอนฟิกูเรชันขนาดใหญ่ ฉันยังใช้แฟล็ก -v เพื่อไม่พิมพ์บรรทัดที่ตรงกับรูปแบบ '^(#|$)'
$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server $บทสรุป
ตัวอย่างข้างต้นเป็นเพียงส่วนเล็ก ๆ ของภูเขาน้ำแข็ง grep รองรับตัวเลือกที่หลากหลายและสามารถเป็นเครื่องมือที่มีประโยชน์มากในมือของผู้ที่รู้วิธีใช้งานอย่างมีประสิทธิภาพ เราไม่เพียงใช้ตัวอย่างที่ให้ไว้ด้านบนเท่านั้น แต่ยังรวมเข้าด้วยกันในรูปแบบต่างๆ เพื่อให้ได้สิ่งที่เราต้องการ
อ้างถึงหน้าคนเพื่ออ่านเพิ่มเติมเกี่ยวกับเรื่องนี้
$ man grepจากนั้น เรียนรู้ตัวอย่างคำสั่ง SFTP
