Cosa significano e fanno grep -v “grep”?


17

Mi chiedevo cosa grep -v "grep"fa e cosa significa?


8
È possibile man grepleggere la pagina del manuale di riferimento per il comando o per ulteriori informazioni su determinati comandi (incluso grep), è possibile info grep.... vale a dire. il tuo sistema ha una documentazione che è spesso molto utile.
Guiverc,

12
grep -v "grep"viene spesso utilizzato per filtrare grep stesso mentre elenca i processi e ciò comporta in genere 3 condotte, anche se ovviamente esistono metodi migliori come quelli pgrepche consentono molto meno "impianti idraulici". Vedi unix.stackexchange.com/q/74185/85039
Sergiy Kolodyazhnyy

13
Questo lo fa. Sto chiamando il mio rootkit grep.
Joshua,

Normalmente utilizzato in un contesto non legato alla sicurezza, ad esempio ps aux | grep fubar | grep -v grepdove si fubartrova qualcosa che sto sviluppando, che ha smesso di rispondere e il cui ID voglio trovare in modo da poterlo uccidere. Supponiamo che ce ne siano due, quindi killallè inappropriato.
nigel222,

Risposte:


69

grep -v "grep"prende input riga per riga e genera solo le righe in cui grepnon appare. Senza -v, sarebbe uscita solo le linee in cui grep non apparire. Vedi man grepper i dettagli.

Per quanto riguarda l' greputilità stessa, non è importante che il modello greppassato ad esso come argomento sia uguale al suo nome. Ma nella maggior parte dei casi in cui grep -v grepappare effettivamente, questa non è una coincidenza.

grep -v grep(o grep -v 'grep'o grep -v "grep") appare spesso sul lato destro di un tubo il cui lato sinistro è un pscomando. Questo è probabilmente dove l'hai visto. Ad esempio, potrei essere in cerca di programmi in esecuzione i cui nomi, percorsi o argomenti della riga di comando suggeriscono che sono correlati a 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

Il mio grepcomando è stato mostrato nell'output, ma non è quello che sto cercando. Sto cercando informazioni sui processi che erano già in esecuzione quando ho esaminato ciò che era in esecuzione, non il processo che è in esecuzione solo a causa del mio sforzo di esaminare ciò che è in esecuzione.

Un modo comune per rimuovere questa distrazione è aggiungere un'altra pipe a 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

grepsenza -Fconsidera il suo schema come un'espressione regolare piuttosto che una stringa fissa . Quindi un altro approccio è quello di scrivere un'espressione regolare che corrisponda esattamente xfcema sia scritta diversamente. Per esempio:

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

Questo funziona perché [x]è una classe di caratteri che corrisponde esattamente alla lettera x.


Un difetto di questi metodi popolari è che filtreranno le righe che contengono grepanche quando non sono il grepcomando che hai appena eseguito. Potrebbero anche non essere grepcomandi: solo comandi i cui nomi, percorsi o argomenti della riga di comando contengono grep . Quindi, come ha sottolineato Sergiy Kolodyazhnyy , spesso nessuno dei due modi (né nessun altro approccio che coinvolge il piping dell'output di ps) è davvero l'ideale e, come diceva Nic Hartley , altri modi spesso usano pgrep. Per esempio:

ek@Io:~$ pgrep -af xfce
2955 xfce4-power-manager
2958 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
  • -a mostra l'intera riga di comando. Omettilo per mostrare solo il numero ID del processo.
  • -f cerca nella riga di comando completa. Omettilo per cercare solo i nomi.

10
Potrebbe anche valere la pena menzionare pgrepun'altra alternativa aps | grep
Fund Monica's Lawsuit,

8

grep --helpci dice cosa -vfa la bandiera:

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

Puoi usare -vflag per stampare inverte la partita; cioè, corrisponde solo a quelle righe che non contengono la parola data. Ad esempio, stampa tutte le righe che non contengono la barra delle parole:

$ grep -v bar /path/to/file

( leggi di più ... )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.