ค้นหาเว็บไซต์

วิธีใช้คำสั่ง Grep ใน Linux [12 ตัวอย่างที่เป็นประโยชน์]


คุณเคยเผชิญกับงานที่ต้องค้นหาสตริงหรือรูปแบบเฉพาะในไฟล์แต่ไม่รู้ว่าจะเริ่มค้นหาจากที่ไหน? ถ้าอย่างนั้นนี่คือคำสั่ง grep เพื่อช่วยเหลือ!

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

sudo apt install grep         [On Debian, Ubuntu and Mint]
sudo yum install grep         [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux]
sudo emerge -a sys-apps/grep  [On Gentoo Linux]
sudo apk add grep             [On Alpine Linux]
sudo pacman -S grep           [On Arch Linux]
sudo zypper install grep      [On OpenSUSE]    

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

1. ค้นหาและค้นหาไฟล์ใน Linux

สมมติว่าคุณเพิ่งติดตั้ง Ubuntu ใหม่บนเครื่องของคุณ และคุณกำลังจะลองใช้สคริปต์ Python

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

เพียงรันคำสั่ง dpkg ต่อไปนี้ด้วย grep ดังที่แสดง:

dpkg -l | grep -i python

อันดับแรก เราใช้ dpkg –l ซึ่งแสดงรายการแพ็คเกจ *.deb ที่ติดตั้งบนระบบของคุณ ประการที่สอง เราได้ไพพ์เอาต์พุตนั้นไปที่ grep -i python ซึ่งระบุเพียงว่า “ไปที่ grep แล้วกรองออก แล้วส่งคืนทุกสิ่งที่มี 'python’ อยู่ในนั้น ”

ตัวเลือก -i มีไว้สำหรับละเว้นตัวพิมพ์ เนื่องจาก grep คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ การใช้ตัวเลือก -i ถือเป็นนิสัยที่ดีในการเข้าถึง เว้นแต่ว่าคุณกำลังพยายามเจาะลึกการค้นหาที่เฉพาะเจาะจงมากขึ้น

2. ค้นหาและกรองไฟล์ใน Linux

grep ยังสามารถใช้เพื่อค้นหาและกรองภายในไฟล์แต่ละไฟล์หรือหลายไฟล์ก็ได้ ลองใช้สถานการณ์นี้:

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

ผู้ใจดีที่ตอบกลับคุณขอให้คุณโพสต์เนื้อหาของไฟล์ /etc/apache2/apache2.conf ของคุณ จะดีกว่าไหมสำหรับคุณ คนที่ช่วยคุณ และทุกคนที่อ่านมัน หากคุณสามารถลบบรรทัดที่แสดงความคิดเห็นทั้งหมดได้ คุณทำได้! เพียงแค่เรียกใช้สิ่งนี้:

grep -v ^\# /etc/apache2/apache2.conf | grep .

ตัวเลือก -v บอกให้ grep กลับด้านเอาต์พุต ซึ่งหมายความว่าแทนที่จะพิมพ์บรรทัดที่ตรงกัน ให้ทำตรงกันข้ามและพิมพ์บรรทัดทั้งหมดที่ไม่ตรงกับนิพจน์ ในกรณีนี้ บรรทัดความคิดเห็น #

โปรดทราบว่าเรายังใช้ grep . ในตอนท้ายเพื่อซ่อนเอาต์พุตของบรรทัดว่างทั้งหมด วิธีนี้เราจะเห็นเฉพาะการตั้งค่าในเทอร์มินัลของเราเท่านั้น

3. ค้นหาไฟล์ .mp3 ทั้งหมดใน Linux

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

คุณต้องการค้นหาไฟล์ *.mp3 ทั้งหมดจากศิลปิน JayZ แต่คุณไม่ต้องการแทร็กที่รีมิกซ์ใดๆ การใช้ คำสั่ง find กับไพพ์ grep สองสามรายการจะช่วยได้:

find . -name “*.mp3” | grep –i JayZ | grep –vi “remix”

ในตัวอย่างนี้ เราใช้ find เพื่อพิมพ์ไฟล์ทั้งหมดที่มีนามสกุล *.mp3 โดยไพพ์ไปที่ grep –i เพื่อกรอง ออกและพิมพ์ไฟล์ทั้งหมดด้วยชื่อ “JayZ ” จากนั้นไปป์อื่นไปที่ grep –vi ซึ่งจะกรองออกและไม่พิมพ์ชื่อไฟล์ทั้งหมดด้วยสตริง (ไม่ว่าในกรณีใด) “รีมิกซ์

4. แสดงจำนวนบรรทัดก่อนหรือหลังสตริงการค้นหา

อีกสองสามตัวเลือกคือสวิตช์ -A และ -B ซึ่งแสดงบรรทัดที่ตรงกันและจำนวนบรรทัดที่อยู่ก่อนหรือหลังสตริงการค้นหา

แม้ว่า man page จะให้คำอธิบายที่ละเอียดกว่า แต่ฉันพบว่าวิธีที่ง่ายที่สุดในการจำตัวเลือกต่างๆ ได้แก่ -A=after และ -B=< แข็งแกร่ง>ก่อน:

ifconfig | grep -A 4 inet
ifconfig | grep -B 2 UP

5. พิมพ์จำนวนบรรทัดรอบการแข่งขัน

ตัวเลือก -C ของ grep นั้นคล้ายกัน แต่แทนที่จะพิมพ์บรรทัดที่อยู่ก่อนหรือหลังสตริง กลับพิมพ์บรรทัดในทิศทางใดทิศทางหนึ่ง:

ifconfig | grep -C 2 lo

 TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 15314  bytes 1593769 (1.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0

6. นับจำนวนการแข่งขัน

คล้ายกับการไพพ์สตริง grep ตามจำนวนคำ (คำสั่ง wc) ตัวเลือกในตัวของ grep ก็สามารถดำเนินการเช่นเดียวกันกับคุณ:

ifconfig | grep -c inet6

7. ค้นหาไฟล์ตามที่กำหนดสตริงใน Linux

ตัวเลือก –n สำหรับ grep มีประโยชน์มากเมื่อทำการดีบักไฟล์ระหว่างเกิดข้อผิดพลาดในการคอมไพล์ จะแสดงหมายเลขบรรทัดในไฟล์ของสตริงการค้นหาที่กำหนด:

grep -n "main" setup.py

8. ค้นหาสตริงแบบเรียกซ้ำในทุกไดเร็กทอรี

หากคุณต้องการค้นหาสตริงในไดเรกทอรีปัจจุบันพร้อมกับไดเรกทอรีย่อยทั้งหมด คุณสามารถระบุตัวเลือก –r เพื่อค้นหาแบบวนซ้ำ:

grep -r “function” *

9. ค้นหารูปแบบทั้งหมด

การส่งผ่านตัวเลือก -w เพื่อ grep ค้นหารูปแบบทั้งหมดที่อยู่ในสตริง ตัวอย่างเช่น การใช้:

ifconfig | grep -w "RUNNING"

จะพิมพ์บรรทัดที่มีรูปแบบออกมาในเครื่องหมายคำพูด ในทางกลับกัน หากคุณลอง:

ifconfig | grep -w "RUN"

จะไม่มีอะไรส่งคืนเนื่องจากเราไม่ได้ค้นหารูปแบบ แต่เป็นทั้งคำ

10. ค้นหาสตริงในไฟล์ Gzipped

สิ่งที่สมควรกล่าวถึงคืออนุพันธ์ของ grep อย่างแรกคือ zgrep ซึ่งคล้ายกับ zcat มีไว้สำหรับใช้กับไฟล์ gzipped ใช้ตัวเลือกเดียวกันกับ grep และใช้ในลักษณะเดียวกัน:

zgrep -i error /var/log/syslog.2.gz

11. จับคู่นิพจน์ทั่วไปในไฟล์

คำสั่ง egrep เป็นอีกหนึ่งอนุพันธ์ที่ย่อมาจาก “Extensed Global Regular Expression ” จดจำอักขระเมตานิพจน์เพิ่มเติมเช่น at + ? | และ ()

คำสั่ง egrep มีประโยชน์มากสำหรับการค้นหาไฟล์ต้นฉบับและโค้ดอื่นๆ หากจำเป็น สามารถเรียกใช้จาก grep ปกติโดยการระบุตัวเลือก -E

grep -E

12. ค้นหาสตริงรูปแบบคงที่

คำสั่ง fgrep ค้นหาไฟล์หรือรายการไฟล์เพื่อหาสตริงรูปแบบคงที่ มันเหมือนกับ grep -F วิธีทั่วไปในการใช้ fgrep คือการส่งไฟล์รูปแบบไปให้:

fgrep –f file_full_of_patterns.txt file_to_search.txt

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

ใช้ความคิดสร้างสรรค์ ทดลองใช้ตัวเลือกต่างๆ ใน man page และสร้าง นิพจน์ grep ที่เหมาะกับวัตถุประสงค์ของคุณเอง!