GNU/Linux >> Linux Esercitazione >  >> Linux

Grep Command in Linux (Trova testo nei file)

Il grep command sta per "stampa di espressioni regolari globali" ed è uno dei comandi più potenti e comunemente usati in Linux.

grep ricerca in uno o più file di input le righe che corrispondono a un determinato modello e scrive ciascuna riga corrispondente nell'output standard. Se non vengono specificati file, grep legge dallo standard input, che di solito è l'output di un altro comando.

In questo articolo, ti mostreremo come utilizzare il grep comando attraverso esempi pratici e spiegazioni dettagliate del più comune GNU grep opzioni.

grep Sintassi del comando #

La sintassi per grep il comando è il seguente:

grep [OPTIONS] PATTERN [FILE...]

Gli elementi tra parentesi quadre sono facoltativi.

  • OPTIONS - Zero o più opzioni. Grep include una serie di opzioni che ne controllano il comportamento.
  • PATTERN - Modello di ricerca.
  • FILE - Zero o più nomi di file di input.

Per poter cercare il file, l'utente che esegue il comando deve avere accesso in lettura al file.

Cerca una stringa nei file #

L'utilizzo più elementare di grep il comando consiste nel cercare una stringa (testo) in un file.

Ad esempio, per visualizzare tutte le righe contenenti la stringa bash dal /etc/passwd file, eseguiresti il ​​seguente comando:

grep bash /etc/passwd

L'output dovrebbe essere simile a questo:

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Se la stringa include spazi, è necessario racchiuderla tra virgolette singole o doppie:

grep "Gnome Display Manager" /etc/passwd

Inverti corrispondenza (escludi) #

Per visualizzare le righe che non corrispondono a un modello, utilizzare il -v ( o --invert-match ) opzione.

Ad esempio, per stampare le righe che non contengono la stringa nologin useresti:

grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Utilizzo di Grep per filtrare l'output di un comando #

L'output di un comando può essere filtrato con grep attraverso le tubazioni e sul terminale verranno stampate solo le linee che corrispondono a un determinato motivo.

Ad esempio, per scoprire quali processi sono in esecuzione sul tuo sistema come utente www-data puoi usare il seguente ps comando:

ps -ef | grep www-data
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

Puoi anche concatenare più tubi a comando. Come puoi vedere nell'output sopra c'è anche una riga contenente il grep processi. Se non vuoi che quella riga venga mostrata, passa l'output a un altro grep istanza come mostrato di seguito.

ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

Per cercare ricorsivamente un pattern, invoca grep con il -r opzione (o --recursive ). Quando viene utilizzata questa opzione grep cercherà in tutti i file nella directory specificata, saltando i collegamenti simbolici che si incontrano ricorsivamente.

Per seguire tutti i link simbolici, invece di -r , usa il -R opzione (o --dereference-recursive ).

Ecco un esempio che mostra come cercare la stringa linuxize.com in tutti i file all'interno di /etc directory:

grep -r linuxize.com /etc

L'output includerà le righe corrispondenti precedute dal percorso completo del file:

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;

Se usi il -R opzione, grep seguirà tutti i collegamenti simbolici:

grep -R linuxize.com /etc

Notare l'ultima riga dell'output di seguito. Quella riga non viene stampata quando grep viene invocato con -r perché i file all'interno di sites-enabled di Nginx directory sono collegamenti simbolici ai file di configurazione all'interno di sites-available directory.

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;
/etc/nginx/sites-enabled/linuxize.com:    server_name linuxize.com   www.linuxize.com;

Mostra solo il nome file #

Per eliminare l'impostazione predefinita grep emetti e stampa solo i nomi dei file contenenti il ​​modello abbinato, usa il -l ( o --files-with-matches ) opzione.

Il comando seguente cerca in tutti i file che terminano con .conf nella directory di lavoro corrente e stampa solo i nomi dei file contenenti la stringa linuxize.com :

grep -l linuxize.com *.conf

L'output sarà simile a questo:

tmux.conf
haproxy.conf

Il -l opzione è solitamente usata in combinazione con l'opzione ricorsiva -R :

grep -Rl linuxize.com /tmp

Per impostazione predefinita, grep fa distinzione tra maiuscole e minuscole. Ciò significa che i caratteri maiuscoli e minuscoli vengono trattati come distinti.

Per ignorare maiuscole e minuscole durante la ricerca, invoca grep con il -i opzione (o --ignore-case ).

Ad esempio, durante la ricerca di Zebra senza alcuna opzione, il seguente comando non mostrerà alcun output, ovvero ci sono righe corrispondenti:

grep Zebra /usr/share/words

Ma se esegui una ricerca senza distinzione tra maiuscole e minuscole utilizzando -i opzione, corrisponderà a lettere maiuscole e minuscole:

grep -i Zebra /usr/share/words

Specificando "Zebra" corrisponderà a "zebra", "ZEbrA" o qualsiasi altra combinazione di lettere maiuscole e minuscole per quella stringa.

zebra
zebra's
zebras

Cerca parole complete #

Durante la ricerca di una stringa, grep visualizzerà tutte le righe in cui la stringa è incorporata in stringhe più grandi.

Ad esempio, se cerchi "gnu", tutte le righe in cui "gnu" è incorporato in parole più grandi, come "cygnus" o "magnum", verranno abbinate:

grep gnu /usr/share/words
cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut

Per restituire solo quelle righe in cui la stringa specificata è una parola intera (racchiusa da caratteri non di parola), usa il -w ( o --word-regexp ) opzione.

I caratteri delle parole includono caratteri alfanumerici (a-z , A-Z e 0-9 ) e trattini bassi (_ ). Tutti gli altri caratteri sono considerati caratteri non di parole.

Se esegui lo stesso comando di cui sopra, incluso il -w opzione, il grep il comando restituirà solo quelle righe in cui gnu è incluso come una parola separata.

grep -w gnu /usr/share/words
gnu

Mostra numeri di riga #

Il -n ( o --line-number ) l'opzione dice a grep per mostrare il numero di riga delle righe che contengono una stringa che corrisponde a un modello. Quando viene utilizzata questa opzione, grep stampa le corrispondenze sullo standard output con il prefisso del numero di riga.

Ad esempio per visualizzare le righe da /etc/services file contenente la stringa bash preceduto dal numero di riga corrispondente è possibile utilizzare il seguente comando:

grep -n 10000 /etc/services

L'output sottostante ci mostra che le corrispondenze si trovano alle righe 10423 e 10424.

10423:ndmp            10000/tcp
10424:ndmp            10000/udp

Conta corrispondenze #

Per stampare un conteggio delle righe corrispondenti sull'output standard, utilizzare il -c ( o --count ) opzione.

Nell'esempio seguente, stiamo contando il numero di account che hanno /usr/bin/zsh come una conchiglia.

regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4

Modalità silenziosa #

Il -q (o --quiet ) dice a grep per funzionare in modalità silenziosa per non visualizzare nulla sullo standard output. Se viene trovata una corrispondenza, il comando esce con lo stato 0 . Questo è utile quando usi grep negli script di shell in cui vuoi controllare se un file contiene una stringa ed eseguire una determinata azione a seconda del risultato.

Ecco un esempio di utilizzo di grep in modalità silenziosa come comando di prova in un if dichiarazione:

if grep -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi

Espressione regolare di base #

GNU Grep ha tre set di funzioni per le espressioni regolari, Basic, Extended e Perl-compatibili.

Per impostazione predefinita, grep interpreta il modello come un'espressione regolare di base in cui tutti i caratteri tranne i metacaratteri sono in realtà espressioni regolari che corrispondono a se stesse.

Di seguito è riportato un elenco dei metacaratteri più comunemente utilizzati:

  • Usa il ^ simbolo (caret) per abbinare l'espressione all'inizio di una riga. Nell'esempio seguente, la stringa kangaroo corrisponderà solo se si verifica all'inizio di una riga.

    grep "^kangaroo" file.txt
  • Usa il $ simbolo (dollaro) per abbinare l'espressione alla fine di una riga. Nell'esempio seguente, la stringa kangaroo corrisponderà solo se si trova alla fine di una riga.

    grep "kangaroo$" file.txt
  • Usa il . simbolo (punto) per abbinare qualsiasi singolo carattere. Ad esempio, per abbinare tutto ciò che inizia con kan quindi ha due caratteri e termina con la stringa roo , potresti usare il seguente schema:

    grep "kan..roo" file.txt
  • Usa [ ] (parentesi) per far corrispondere ogni singolo carattere racchiuso tra parentesi. Ad esempio, trova le righe che contengono accept o “accent , potresti usare il seguente schema:

    grep "acce[np]t" file.txt
  • Usa [^ ] per abbinare ogni singolo carattere non racchiuso tra parentesi. Il seguente modello corrisponderà a qualsiasi combinazione di stringhe contenente co(any_letter_except_l)a , come coca , cobalt e così via, ma non corrisponderà alle righe contenenti cola ,

    grep "co[^l]a" file.txt

Per sfuggire al significato speciale del carattere successivo, usa il \ simbolo (barra rovesciata).

Espressioni regolari estese #

Per interpretare il modello come un'espressione regolare estesa, usa -E ( o --extended-regexp ) opzione. Le espressioni regolari estese includono tutti i metacaratteri di base, insieme a metacaratteri aggiuntivi per creare modelli di ricerca più complessi e potenti. Di seguito sono riportati alcuni esempi:

  • Abbina ed estrai tutti gli indirizzi email da un determinato file:

    grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
  • Abbina ed estrai tutti gli indirizzi IP validi da un determinato file:

    grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

Il -o l'opzione viene utilizzata per stampare solo la stringa corrispondente.

Cerca stringhe multiple (modelli) #

È possibile unire due o più modelli di ricerca utilizzando l'operatore OR | .

Per impostazione predefinita, grep interpreta il modello come un'espressione regolare di base in cui i metacaratteri come | perdono il loro significato speciale e devono essere utilizzate le loro versioni con barra rovesciata.

Nell'esempio seguente stiamo cercando tutte le occorrenze delle parole fatal , error e critical nel file loggerror di Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

Se utilizzi l'opzione di espressione regolare estesa -E , quindi l'operatore | non deve essere evitato, come mostrato di seguito:

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Per stampare un numero specifico di righe prima di abbinare le righe, usa il -B ( o --before-context ) opzione.

Ad esempio, per visualizzare cinque righe di contesto iniziale prima delle righe corrispondenti, utilizzare il comando seguente:

grep -B 5 root /etc/passwd

Per stampare un numero specifico di righe dopo aver abbinato le righe, usa il -A ( o --after-context ) opzione.

Ad esempio, per visualizzare cinque righe di contesto finale dopo la corrispondenza delle righe, utilizzare il comando seguente:

grep -A 5 root /etc/passwd

Conclusione #

Il grep Il comando consente di cercare un modello all'interno dei file. Se viene trovata una corrispondenza, grep stampa le righe contenenti il ​​modello specificato.

C'è molto altro da sapere su Grep nella pagina del manuale dell'utente di Grep.

Se hai domande o feedback, sentiti libero di lasciare un commento.


Linux
  1. Come utilizzare il comando Grep per trovare testo nei file

  2. Come trovare file con il comando fd in Linux

  3. Comando Linux:come "trovare" solo file di testo?

  4. Come trovare file di testo che non contengono testo su Linux?

  5. Come trovo tutti i file contenenti testo specifico su Linux?

Come trovare file con il comando fd in Linux

Trova testo nei file su Linux usando grep

Tutorial comando trova Linux (con esempi)

Come trovare le cartelle in Linux

Comando Grep in Linux/UNIX

comando ls in Linux/UNIX