30 ตัวอย่าง Grep สำหรับผู้ดูแลระบบ

30 Grep Examples System Admins



คุณจะพบ grep อยู่ลึกลงไปในสมองของสัตว์ของระบบปฏิบัติการ Unix และ Unix เป็นโปรแกรมพื้นฐานที่ใช้สำหรับการจับคู่รูปแบบและเขียนขึ้นในยุค 70 พร้อมกับเครื่องมือ UNIX ที่เหลือที่เรารู้จักและชื่นชอบ (หรือเกลียด)

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







ตัวอย่างที่มีประโยชน์และทำให้ชีวิตของคุณง่ายขึ้นเล็กน้อย ต่อไปนี้คือกรณีและตัวเลือกการใช้งานทั่วไปของ grep 30 กรณี



1. ps aux | grep

ps aux แสดงรายการกระบวนการทั้งหมดและ pid ที่เกี่ยวข้อง แต่บ่อยครั้งรายการนี้ยาวเกินกว่าที่มนุษย์จะตรวจสอบได้ การส่งเอาต์พุตไปยังคำสั่ง grep คุณสามารถแสดงรายการกระบวนการที่ทำงานโดยคำนึงถึงแอปพลิเคชันที่เฉพาะเจาะจง ตัวอย่างเช่น อาจเป็น sshd หรือ nginx หรือ httpd



# ps ถึง | grep sshd
ราก400 0.0 0.2 69944 5624? NS17:47 0: 00/usr/sbin/sshd-NS
ราก1076 0.2 0.3 95204 6816? NS18:29 0:00 sshd: รูท@pts/0
ราก1093 0.0 0.0 12784 932pts/0S+18:29 0: 00กริปsshd

2. Grepping ที่อยู่ IP ของคุณ

ในระบบปฏิบัติการส่วนใหญ่ คุณสามารถแสดงรายการอินเทอร์เฟซเครือข่ายทั้งหมดของคุณและ IP ที่กำหนดให้กับอินเทอร์เฟซนั้นได้โดยใช้คำสั่ง ifconfig หรือ ip addr คำสั่งทั้งสองนี้จะส่งออกข้อมูลเพิ่มเติมจำนวนมาก แต่ถ้าคุณต้องการพิมพ์เฉพาะที่อยู่ IP (พูดสำหรับเชลล์สคริปต์) คุณสามารถใช้คำสั่งด้านล่าง:





$ip addr | กริปinet| awk '{ พิมพ์ $2; }'
$ip addr | กริป -ในinet| awk '{ พิมพ์ $2; }' #สำหรับสายที่มีเพียงแค่ inet ไม่ใช่ inet6 (IPv6)

คำสั่ง ip addr รับรายละเอียดทั้งหมด (รวมถึงที่อยู่ IP) จากนั้นจะถูกส่งไปยังคำสั่งที่สอง grep inet ซึ่งจะส่งออกเฉพาะบรรทัดที่มี inet อยู่ในนั้น จากนั้นจะถูกส่งไปยัง awk พิมพ์คำสั่งที่พิมพ์คำที่สองในแต่ละบรรทัด (เพื่อให้ง่าย)

PS: คุณสามารถทำสิ่งนี้ได้โดยไม่ต้องใช้ grep หากคุณรู้จัก awk เป็นอย่างดี



3. ดูความพยายาม SSH ที่ล้มเหลว

หากคุณมีเซิร์ฟเวอร์ที่เชื่อมต่อกับอินเทอร์เน็ตด้วย IP สาธารณะ มันจะถูกโจมตีอย่างต่อเนื่องด้วยความพยายาม SSH และหากคุณอนุญาตให้ผู้ใช้เข้าถึง SSH ที่ใช้รหัสผ่าน (นโยบายที่ฉันไม่แนะนำ) คุณสามารถดูความพยายามที่ล้มเหลวทั้งหมดโดยใช้ คำสั่ง grep ต่อไปนี้:

# cat /var/log/auth.log | grep ล้มเหลว
วางตัวอย่าง
ธ.ค5 16:ยี่สิบ:03 เดเบียน sshd[509]:รหัสผ่านล้มเหลวสำหรับรูทจากพอร์ต 192.168.0.10052374ssh2
ธ.ค5 16:ยี่สิบ:07 เดเบียน sshd[509]:รหัสผ่านล้มเหลวสำหรับรูทจากพอร์ต 192.168.0.10052374ssh2
ธ.ค5 16:ยี่สิบ:สิบเอ็ดเดเบียน sshd[509]:รหัสผ่านล้มเหลวสำหรับรูทจากพอร์ต 192.168.0.10052374ssh2

4. วางท่อ Grep ไปยัง Uniq

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

#แมว /ที่ไหน/บันทึก/auth.log| กริป 'ล้มเหลว' | uniq -NS 3

คำสั่ง uniq ควรพิมพ์เฉพาะบรรทัดที่ไม่ซ้ำกัน uniq -f 3 ข้ามสามฟิลด์แรก (เพื่อมองข้ามการประทับเวลาที่ไม่เคยทำซ้ำ) จากนั้นจึงเริ่มมองหาบรรทัดที่ไม่ซ้ำ

5. Grepping สำหรับข้อความแสดงข้อผิดพลาด

การใช้ Grep สำหรับการเข้าถึงและบันทึกข้อผิดพลาดไม่ได้จำกัดเฉพาะ SSH เท่านั้น บันทึกข้อผิดพลาดของเว็บเซิร์ฟเวอร์ (เช่น Nginx) และบันทึกการเข้าถึงค่อนข้างพิถีพิถัน หากคุณตั้งค่าสคริปต์การตรวจสอบที่ส่งการแจ้งเตือนถึงคุณเมื่อ grep 404 คืนค่าใหม่ ที่มีประโยชน์มากทีเดียว

# grep -w '404' /var/www/nginx/access.log

192.168.0.100 - -[06/ธ.ค/2018: 02:ยี่สิบ:29+0530] 'รับ /favicon.ico HTTP/1.1' 404 200
'http://192.168.0.102/' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML เช่น Gecko) Chrome/70.0.3538.110 Safari/537.36'


192.168.0.101 - -[06/ธ.ค/2018: 02:สี่ห้า:16+0530] 'รับ /favicon.ico HTTP/1.1' 404 143
'http://192.168.0.102/' 'Mozilla/5.0 (iPad; CPU OS 12_1 เช่น Mac OS X)
AppleWebKit/605.1.15 (KHTML เช่น Gecko) เวอร์ชัน/12.0 มือถือ/15E148 Safari/604.1'

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

6. รายการแพ็คเกจ

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

#dpkg -NS | กริป 'ฉันมา'

7. grep -v ชื่อไฟล์

เพื่อแสดงรายการบรรทัดทั้งหมดที่ อย่า มีรูปแบบที่กำหนด ใช้แฟล็ก -v โดยพื้นฐานแล้วมันตรงกันข้ามกับคำสั่ง grep ปกติ

8. grep -l

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

9. ตัวเลือกคำเดียว -w

$กริป -ใน <ลวดลาย>ชื่อไฟล์

แฟล็ก -w บอกให้ grep ค้นหารูปแบบที่กำหนดเป็นทั้งคำ ไม่ใช่แค่สตริงย่อยของบรรทัด ตัวอย่างเช่น ก่อนหน้านี้เรา grpped สำหรับที่อยู่ IP และรูปแบบ inet พิมพ์เส้นด้วยทั้ง inet และ inet6 แสดงรายการทั้งที่อยู่ IPv4 และ IPv6 แต่ถ้าเราใช้ -w ตั้งค่าสถานะเฉพาะบรรทัด with inet เป็นคำที่นำหน้าและตามด้วยช่องว่างสีขาวเป็นการจับคู่ที่ถูกต้อง

10. นิพจน์ทั่วไปแบบขยาย

คุณมักจะพบว่านิพจน์ทั่วไปของ Grep นั้นมีข้อ จำกัด เล็กน้อย ในสคริปต์และคำแนะนำส่วนใหญ่ คุณจะพบการใช้แฟล็ก -E ซึ่งจะทำให้คุณสามารถป้อนรูปแบบในสิ่งที่เรียกว่า Extended Mode

นี่คือคำสั่ง grep และ grep -E เพื่อค้นหาคำว่า Superman และ Spiderman

$กริป '(ซุปเปอร์|แมงมุม)ผู้ชาย'ข้อความ
$กริป -และ '(ซุปเปอร์|สไปเดอร์)แมน'ข้อความ

อย่างที่คุณเห็นเวอร์ชันขยายอ่านง่ายกว่ามาก

11. Grep สำหรับคอนเทนเนอร์ของคุณ

หากคุณมีคลัสเตอร์คอนเทนเนอร์ขนาดใหญ่ที่ทำงานอยู่บนโฮสต์ของคุณ คุณสามารถ grep คอนเทนเนอร์เหล่านี้ตามชื่อรูปภาพ สถานะ พอร์ตที่เปิดเผย และแอตทริบิวต์อื่นๆ อีกมากมาย ตัวอย่างเช่น,

$นักเทียบท่าปล | กริป [ชื่อภาพ]

12. Grep สำหรับฝักของคุณ

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

$kubectl รับฝัก| กริป <การปรับใช้ชื่อ>

13. ด้ามจับสำหรับข้อมูลขนาดใหญ่

บ่อยครั้งที่เรียกว่าการวิเคราะห์ Big Data นั้นเกี่ยวข้องกับการค้นหา การเรียงลำดับ และการนับรูปแบบอย่างง่ายในชุดข้อมูลที่กำหนด ยูทิลิตี้ UNIX ระดับต่ำเช่น grep, uniq, wc นั้นดีเป็นพิเศษ โพสต์บล็อกนี้แสดงตัวอย่างที่ดีของงานที่ทำสำเร็จในไม่กี่วินาทีโดยใช้ grep และยูทิลิตี้ Unix อื่น ๆ ในขณะที่ Hadoop ใช้เวลาเกือบครึ่งชั่วโมง

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

$กริป 'ผลลัพธ์'ล้านฐาน-2.22.pgn| เรียงลำดับ | uniq -ค
221 [ผลลัพธ์'*']
653728 [ผลลัพธ์'0-1']
852305 [ผลลัพธ์'1-0']
690934 [ผลลัพธ์'1 / 2-1 / 2']

ใช้เวลาประมาณ 15 วินาทีสำหรับโปรเซสเซอร์ 2-cores/4-thread อายุ 4 ปี ดังนั้น ครั้งต่อไปที่คุณกำลังแก้ปัญหาข้อมูลขนาดใหญ่ คิดว่าถ้าคุณสามารถใช้ grep แทนได้

14. grep –color=auto

ตัวเลือกนี้ช่วยให้ grep เน้นรูปแบบภายในบรรทัดที่พบ

15. grep -i

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

16. grep -n

แฟล็ก -n จะแสดงหมายเลขบรรทัด คุณจึงไม่ต้องกังวลว่าจะหาบรรทัดเดียวกันในภายหลัง

17. git grep

Git ซึ่งเป็นระบบควบคุมเวอร์ชัน เองมีคำสั่ง grep ในตัวที่ทำงานเหมือนกับ grep ปกติของคุณ แต่สามารถใช้เพื่อค้นหารูปแบบบนทรีที่คอมมิตโดยใช้ git CLI ดั้งเดิม แทนที่จะใช้ไพพ์ที่น่าเบื่อ ตัวอย่างเช่น หากคุณอยู่ในมาสเตอร์แบรนช์ของ repo คุณสามารถ grep ข้าม repo โดยใช้:

(ผู้เชี่ยวชาญ)$git grep <ลวดลาย>

18. grep -o

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

19. grep -x

แฟล็ก -x จะพิมพ์บรรทัด หากทั้งบรรทัดตรงกับ regex ที่คุณให้มา สิ่งนี้ค่อนข้างคล้ายกับแฟล็ก -w ซึ่งพิมพ์บรรทัดหากทั้งคำเท่านั้นที่ตรงกับ regex ที่ให้มา

20. grep -T

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

21. grep -q

สิ่งนี้ระงับเอาต์พุตและรันคำสั่ง grep อย่างเงียบ ๆ มีประโยชน์มากเมื่อแทนที่ข้อความ หรือการรัน grep ในสคริปต์ daemon

22. grep -P

ผู้ที่เคยชินกับไวยากรณ์นิพจน์ทั่วไปของ Perl สามารถใช้แฟล็ก -P เพื่อใช้สิ่งนั้นได้ คุณไม่จำเป็นต้องเรียนรู้นิพจน์ทั่วไปพื้นฐาน ซึ่ง grep ใช้เป็นค่าเริ่มต้น

23. grep -D [การกระทำ]

ใน Unix เกือบทุกอย่างสามารถใช้เป็นไฟล์ได้ ดังนั้น อุปกรณ์ ซ็อกเก็ต หรือสตรีมข้อมูล FIFO ใดๆ สามารถป้อนให้กับ grep ได้ คุณสามารถใช้แฟล็ก -D ตามด้วย ACTION (การดำเนินการเริ่มต้นคือ READ) อีกสองสามตัวเลือกคือ SKIP เพื่อข้ามอุปกรณ์เฉพาะอย่างเงียบ ๆ และ RECURSE เพื่อเรียกดูไดเร็กทอรีและ symlink แบบเรียกซ้ำ

24. การทำซ้ำ

หากกำลังหารูปแบบที่กำหนดซึ่งเป็นการทำซ้ำของรูปแบบที่รู้จักง่ายกว่า ให้ใช้วงเล็บปีกกาเพื่อระบุจำนวนการทำซ้ำ

$กริป -และ [0-9]{10}

พิมพ์บรรทัดที่มีสตริงที่มีความยาวตั้งแต่ 10 หลักขึ้นไป

25. ชวเลขซ้ำ

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

? : รูปแบบที่อยู่ข้างหน้าเครื่องหมายคำถามควรตรงกับศูนย์หรือครั้งเดียว

* : รูปแบบที่อยู่ข้างหน้าดาวควรตรงกัน 0 ครั้งหรือมากกว่า

+ : รูปแบบที่อยู่ข้างหน้าเครื่องหมายบวกควรตรงกันอย่างน้อยหนึ่งครั้ง

25. ไบต์ออฟเซ็ต

หากคุณต้องการทราบค่าออฟเซ็ตไบต์ของบรรทัดที่พบนิพจน์ที่ตรงกัน คุณสามารถใช้แฟล็ก -b เพื่อพิมพ์ออฟเซ็ตได้เช่นกัน ในการพิมพ์ออฟเซ็ตเฉพาะส่วนที่ตรงกันของบรรทัด คุณสามารถใช้แฟล็ก -b กับแฟล็ก -o

$กริป -NS -หรือ <ลวดลาย> [ชื่อไฟล์]

ออฟเซ็ตหมายถึงหลังจากจำนวนไบต์จากจุดเริ่มต้นของไฟล์ที่สตริงที่ตรงกันเริ่มต้นขึ้น

26. egrep, fgrep และ rgerp

คุณมักจะเห็นการเรียกใช้ egrep เพื่อใช้ไวยากรณ์นิพจน์ทั่วไปแบบขยายที่เรากล่าวถึงก่อนหน้านี้ อย่างไรก็ตาม นี่เป็นไวยากรณ์ที่เลิกใช้แล้ว และขอแนะนำให้คุณหลีกเลี่ยงการใช้รูปแบบนี้ ใช้ grep -E แทน ในทำนองเดียวกัน ใช้ grep -F แทน fgrep และ grep -r แทน rgrep

27. grep -z

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

28. grep -a [ชื่อไฟล์]

แฟล็ก -a บอกให้ grep ปฏิบัติต่อไฟล์ที่ให้มาราวกับว่ามันเป็นข้อความปกติ ไฟล์อาจเป็นไบนารี แต่ grep จะจัดการกับเนื้อหาภายในราวกับว่าเป็นข้อความ

29. grep -U [ชื่อไฟล์]

แฟล็ก -U บอกให้ grep ปฏิบัติต่อไฟล์ที่ให้มาราวกับว่าเป็นไฟล์ไบนารีและไม่ใช่ข้อความ โดยค่าเริ่มต้น grep จะเดาประเภทไฟล์โดยดูที่สองสามไบต์แรก การใช้แฟล็กนี้แทนที่การเดาที่ได้ผล

Grep -m NUM

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

บทสรุป

งานประจำวันของผู้ดูแลระบบจำนวนมากเกี่ยวข้องกับการกลั่นกรองข้อความจำนวนมาก สิ่งเหล่านี้อาจเป็นบันทึกการรักษาความปลอดภัย บันทึกจากเว็บหรือเซิร์ฟเวอร์อีเมลของคุณ กิจกรรมของผู้ใช้ หรือแม้แต่ข้อความขนาดใหญ่ของหน้าคน Grep ให้ความยืดหยุ่นเป็นพิเศษแก่คุณเมื่อต้องรับมือกับกรณีการใช้งานเหล่านี้

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