grep -v“ grep” หมายถึงอะไรและทำอะไร?


17

ฉันสงสัยว่าgrep -v "grep"มันทำอะไรและมันหมายถึงอะไร?


8
คุณสามารถman grepอ่านหน้าคู่มืออ้างอิงสำหรับคำสั่งหรือสำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งบางอย่าง (inc. grep) คุณสามารถinfo grep.... เช่น ระบบของคุณมีเอกสารซึ่งมักจะมีประโยชน์มาก
guiverc

12
grep -v "grep"มักจะใช้ในการกรอง grep ในขณะที่รายการกระบวนการและโดยทั่วไปเกี่ยวข้องกับ 3 ท่อแม้ว่าจะมีวิธีการที่ดีกว่าแน่นอนpgrepซึ่งอนุญาตให้ "ประปา" น้อย ดูunix.stackexchange.com/q/74185/85039
Sergiy Kolodyazhnyy

13
นั่นมัน ฉันโทร greprootkit
โจชัว

ปกติใช้ในบริบทที่ไม่ใช่การรักษาความปลอดภัยที่เกี่ยวข้องเช่นps aux | grep fubar | grep -v grepที่fubarเป็นสิ่งที่ฉันกำลังพัฒนาที่มีการหยุดการตอบสนองและมีรหัสที่ฉันอยากพบเพื่อให้สามารถฆ่ามัน สมมติว่ามีสองของพวกเขาจึงkillallไม่เหมาะสม
nigel222

คำตอบ:


69

grep -v "grep"รับอินพุตบรรทัดต่อบรรทัดและเอาต์พุตเฉพาะบรรทัดที่grepไม่ปรากฏ โดยไม่ต้อง-vก็จะส่งออกเพียงเส้นที่grep ไม่ปรากฏ ดูman grepรายละเอียดที่

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

grep -v grep(หรือgrep -v 'grep'หรือgrep -v "grep") มักปรากฏที่ด้านขวาของไพพ์ที่ด้านซ้ายเป็นpsคำสั่ง นั่นเป็นโอกาสที่คุณจะได้เห็นมัน ตัวอย่างเช่นฉันอาจกำลังมองหาโปรแกรมที่มีชื่อพา ธ หรืออาร์กิวเมนต์บรรทัดคำสั่งแนะนำว่าพวกเขาเกี่ยวข้องกับ Xfce:

ek@Io:~$ ps x | grep xfce
 2955 ?        Ssl    0:10 xfce4-power-manager
 2958 ?        S      0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
31901 pts/1    S+     0:00 grep --color=auto xfce

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

วิธีทั่วไปในการลบสิ่งที่ทำให้ไขว้เขวนี้คือการเพิ่มไปป์อื่นในgrep -v grep:

ek@Io:~$ ps x | grep xfce | grep -v grep
 2955 ?        Ssl    0:10 xfce4-power-manager
 2958 ?        S      0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd

grepโดยไม่-Fถือว่ารูปแบบของการเป็นนิพจน์ปกติมากกว่าสตริงคงที่ ดังนั้นอีกวิธีหนึ่งคือการเขียนนิพจน์ปกติที่ตรงกับxfceแต่เขียนแตกต่างกัน ตัวอย่างเช่น:

ek@Io:~$ ps x | grep '[x]fce'
 2955 ?        Ssl    0:10 xfce4-power-manager
 2958 ?        S      0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd

สิ่งนี้ได้ผลเพราะ[x]เป็นคลาสของตัวละครที่ตรงกับตัวอักษรxทั้งหมด


หนึ่งในวิธีการที่ได้รับความนิยมคือการที่จะกรองบรรทัดที่มีgrepแม้ว่าจะไม่ใช่grepคำสั่งที่คุณเพิ่งรันด้วยตัวเอง พวกเขาอาจจะไม่ได้เป็นgrepคำสั่ง - คำสั่งเพียงแค่มีชื่อเส้นทางหรืออาร์กิวเมนต์บรรทัดคำสั่งประกอบด้วย grepดังนั้นเป็นSergiy Kolodyazhnyy มีออกแหลมมักจะไม่มีวิธีการเหล่านั้น (หรือวิธีการอื่นใดที่เกี่ยวข้องกับท่อส่งออกของps) มันเหมาะและเป็นนิคฮาร์ทลี่กล่าวถึง , อื่น ๆ วิธีที่pgrepมักใช้ ตัวอย่างเช่น:

ek@Io:~$ pgrep -af xfce
2955 xfce4-power-manager
2958 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
  • -a แสดงบรรทัดคำสั่งแบบเต็ม งดเว้นเพื่อแสดงเฉพาะหมายเลขกระบวนการเท่านั้น
  • -f ค้นหาในบรรทัดคำสั่งแบบเต็ม งดเว้นเพื่อค้นหาเฉพาะชื่อ

10
มันอาจจะคุ้มค่าที่จะกล่าวถึงpgrepอีกทางเลือกหนึ่งสำหรับps | grep
คดีของกองทุนโมนิกา

8

grep --helpบอกเราว่า-vธงทำอะไร:

-v, --invert-match        select non-matching lines

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

$ grep -v bar /path/to/file

( อ่านเพิ่มเติม ... )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.