GNU/Linux >> Linux Esercitazione >  >> Linux

Comando Grep in Linux (con esempi)

In questo tutorial imparerai come usare l'essenziale grep comando in Linux. Esamineremo perché questo comando è importante da padroneggiare e come puoi utilizzarlo nelle tue attività quotidiane dalla riga di comando.

Entriamo subito con alcune spiegazioni ed esempi.

Perché usiamo grep?

Grep è uno strumento da riga di comando che gli utenti Linux utilizzano per cercare stringhe di testo. Puoi usarlo per cercare in un file una determinata parola o combinazione di parole, oppure puoi reindirizzare l'output di altri comandi Linux a grep, quindi grep può mostrarti solo l'output che devi vedere.

Diamo un'occhiata ad alcuni esempi davvero comuni. Supponiamo che tu debba controllare il contenuto di una directory per vedere se esiste un determinato file lì. È qualcosa per cui useresti il ​​comando "ls".

Ma, per rendere l'intero processo di controllo del contenuto della directory ancora più veloce, puoi reindirizzare l'output del comando ls al comando grep. Cerchiamo nella nostra home directory una cartella chiamata Documenti.

E ora, proviamo a controllare di nuovo la directory, ma questa volta usando grep per controllare in modo specifico la cartella Documenti.

$ ls | grep Documents

Come puoi vedere nello screenshot qui sopra, l'uso del comando grep ci ha fatto risparmiare tempo isolando rapidamente la parola che abbiamo cercato dal resto dell'output non necessario prodotto dal comando ls.

Se la cartella Documenti non esistesse, grep non restituirebbe alcun output. Quindi, se grep non restituisce nulla, significa che non è riuscito a trovare la parola che stai cercando.

Trova una stringa

Se devi cercare una stringa di testo, piuttosto che una singola parola, dovrai racchiudere la stringa tra virgolette. Ad esempio, cosa succede se dovessimo cercare la directory "Documenti" anziché la directory "Documenti" a una sola parola?

$ ls | grep 'My Documents'

Grep accetterà sia virgolette singole che virgolette doppie, quindi avvolgi la stringa di testo con entrambi.

Sebbene tu possa usare grep per cercare l'output convogliato da altri strumenti della riga di comando, puoi anche usarlo per cercare direttamente i documenti. Ecco un esempio in cui cerchiamo una stringa in un documento di testo.

$ grep 'Class 1' Students.txt

Trova più stringhe

Puoi anche usare grep per trovare più parole o stringhe. È possibile specificare più modelli utilizzando l'opzione -e. Proviamo a cercare in un documento di testo due stringhe diverse:

$ grep -e 'Class 1' -e Todd Students.txt

Nota che abbiamo solo bisogno di usare le virgolette attorno alle stringhe che contenevano spazi.

Differenza tra grep, egrep fgrep, pgrep, zgrep

Storicamente, vari switch grep sono stati inclusi in diversi binari. Sui moderni sistemi Linux, troverai queste opzioni disponibili nel comando grep di base, ma è comune vedere che le distribuzioni supportano anche gli altri comandi.

Dalla pagina man di grep:

egrep è l'equivalente di grep -E

Questa opzione interpreterà un modello come un'espressione regolare estesa. Ci sono un sacco di cose diverse che puoi fare con questo, ma ecco un esempio di come appare usare un'espressione regolare con grep.

Cerchiamo in un documento di testo le stringhe che contengono due lettere "p" consecutive:

$ egrep p\{2} fruits.txt

o

$ grep -E p\{2} fruits.txt

fgrep è l'equivalente di grep -F

Questa opzione interpreterà un pattern come un elenco di stringhe fisse e proverà a far corrispondere una di esse. È utile quando devi cercare i caratteri delle espressioni regolari. Ciò significa che non devi sfuggire ai caratteri speciali come faresti con un normale grep.

pgrep è un comando per cercare il nome di un processo in esecuzione sul sistema e restituire i rispettivi ID di processo. Ad esempio, puoi usarlo per trovare l'ID di processo del demone SSH:

$ pgrep sshd

Questo è simile in funzione al semplice piping dell'output del comando "ps" su grep.

Puoi utilizzare queste informazioni per interrompere un processo in esecuzione o risolvere problemi con i servizi in esecuzione sul tuo sistema.

Puoi usare zgrep per cercare un modello nei file compressi. Ti consente di cercare i file all'interno di un archivio compresso senza dover prima decomprimere quell'archivio, risparmiando sostanzialmente uno o due passaggi in più.

$ zgrep apple fruits.txt.gz

zgrep funziona anche sui file tar, ma sembra solo arrivare a dirti se è stato in grado di trovare una corrispondenza o meno.

Ne parliamo perché i file compressi con gzip sono molto comunemente archivi tar.

Differenza tra find e grep

Per coloro che hanno appena iniziato con la riga di comando di Linux, è importante ricordare che find e grep sono due comandi con due funzioni molto diverse, anche se li usiamo entrambi per "trovare" qualcosa che l'utente specifica.

È utile usare grep per trovare un file quando lo usi per cercare nell'output del comando ls, come mostrato nei primi esempi del tutorial.

Tuttavia, se hai bisogno di cercare ricorsivamente il nome di un file – o parte del nome del file se usi un carattere jolly (asterisco) – sei molto avanti per usare il comando 'trova'.

$ find /path/to/search -name name-of-file

L'output sopra mostra che il comando trova è stato in grado di individuare correttamente il file che abbiamo cercato.

Cerca ricorsivamente

Puoi usare l'opzione -r con grep per cercare ricorsivamente in tutti i file in una directory e nelle sue sottodirectory per uno schema specificato.

$ grep -r pattern /directory/to/search

Se non specifichi una directory, grep cercherà semplicemente la tua directory di lavoro attuale. Nello screenshot qui sotto, grep ha trovato due file che corrispondono al nostro modello e restituisce i loro nomi di file e la directory in cui risiedono.

Cattura spazio o tab

Come accennato in precedenza nella nostra spiegazione su come cercare una stringa, puoi racchiudere il testo tra virgolette se contiene spazi. Lo stesso metodo funzionerà per le schede, ma spiegheremo come inserire una scheda nel comando grep in un attimo.

Metti uno spazio o più spazi tra virgolette per fare in modo che grep cerchi quel carattere.

$ grep " " sample.txt

Esistono diversi modi per cercare una scheda con grep, ma la maggior parte dei metodi sono sperimentali o possono essere incoerenti tra diverse distribuzioni.

Il modo più semplice è cercare semplicemente il carattere di tabulazione stesso, che puoi produrre premendo ctrl+v sulla tastiera, seguito da tab.

Normalmente, premendo tab in una finestra di terminale si dice al terminale che si desidera completare automaticamente un comando, ma premendo prima la combinazione ctrl+v il carattere tab verrà scritto come ci si aspetterebbe normalmente in un editor di testo .

$ grep "    " sample.txt

Conoscere questo piccolo trucco è particolarmente utile quando si sfogliano i file di configurazione in Linux poiché le schede vengono spesso utilizzate per separare i comandi dai loro valori.

Utilizzo di espressioni regolari

La funzionalità di Grep è ulteriormente estesa utilizzando le espressioni regolari, consentendoti una maggiore flessibilità nelle tue ricerche. Ne esistono diversi e ne esamineremo alcuni tra i più comuni negli esempi seguenti:

[ ] parentesi vengono utilizzati per trovare una corrispondenza tra un insieme di caratteri.

$ grep "Class [123]" Students.txt

Questo comando restituirà tutte le righe che dicono "Classe 1", "Classe 2" o "Classe 3".

[-] parentesi con un trattino può essere utilizzato per specificare un intervallo di caratteri, sia numerici che alfabetici.

$ grep "Class [1-3]" Students.txt

Otteniamo lo stesso output di prima, ma il comando è molto più facile da digitare, soprattutto se abbiamo una gamma più ampia di numeri o lettere.

^ punto di inserimento viene utilizzato per cercare un modello che si verifica solo all'inizio di una riga.

$ grep "^Class" Students.txt

[^] parentesi con accento circonflesso vengono utilizzati per escludere caratteri da un modello di ricerca.

$ grep "Class [^1-2]" Students.txt

Simbolo $ dollaro viene utilizzato per cercare un modello che si verifica solo alla fine di una riga.

$ grep "1$" Students.txt

. punto viene utilizzato per abbinare qualsiasi carattere, quindi è un carattere jolly ma solo per un singolo carattere.

$ grep "A….a" Students.txt

File Grep gz senza decomprimere

Come mostrato in precedenza, puoi utilizzare il comando zgrep per cercare tra i file compressi senza doverli prima decomprimere.

$ zgrep word-to-search /path/to/file.gz

Puoi anche utilizzare il comando zcat per visualizzare il contenuto di un file gz e quindi reindirizzare l'output a grep per isolare le righe contenenti la stringa di ricerca.

$ zcat file.gz | grep word-to-search

Indirizzi email Grep da un file zip

Possiamo usare un'espressione regolare di fantasia per estrarre tutti gli indirizzi email da un file zip.

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

Il flag -o estrarrà l'indirizzo email solo , anziché mostrare l'intera riga che contiene l'indirizzo e-mail. Ciò si traduce in un output più pulito.

Come con la maggior parte delle cose in Linux, c'è più di un modo per farlo. Potresti anche usare egrep e un diverso insieme di espressioni. Ma l'esempio sopra funziona perfettamente ed è un modo abbastanza semplice per estrarre gli indirizzi email e ignorare tutto il resto.

Indirizzi IP Grep

Grep per gli indirizzi IP può diventare un po' complesso perché non possiamo semplicemente dire a grep di cercare quattro numeri separati da punti:beh, potremmo, ma quel comando ha il potenziale per restituire anche indirizzi IP non validi.

Il comando seguente troverà e isolerà solo indirizzi IPv4 validi:

$ 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]?)" /var/log/auth.log

L'abbiamo usato sul nostro server Ubuntu solo per vedere da dove sono stati fatti gli ultimi tentativi SSH.

Per evitare la ripetizione delle informazioni e impedire che inondino lo schermo, potresti voler reindirizzare i tuoi comandi grep a "uniq" e "more" come abbiamo fatto nello screenshot qui sopra.

Grep o condizione

Esistono diversi modi in cui puoi utilizzare una condizione o con grep, ma ti mostreremo quella che richiede il minor numero di sequenze di tasti ed è più facile da ricordare:

$ grep -E 'string1|string2' filename

oppure, tecnicamente l'utilizzo di egrep comporta ancora meno sequenze di tasti:

$ egrep 'string1|string2' filename

Ignora la distinzione tra maiuscole e minuscole

Per impostazione predefinita, grep fa distinzione tra maiuscole e minuscole, il che significa che devi essere preciso nella scrittura in maiuscolo della stringa di ricerca. Puoi evitarlo dicendo a grep di ignorare il caso con l'opzione -i.

$ grep -i string filename

Ricerca con distinzione tra maiuscole e minuscole

Cosa succede se vogliamo cercare una stringa in cui la prima può essere maiuscola o minuscola, ma il resto della stringa dovrebbe essere minuscolo? Ignorare il caso con l'opzione -i non funzionerà in questo caso, quindi un modo semplice per farlo sarebbe con le parentesi.

$ grep [Ss]tring filename

Questo comando dice a grep di fare distinzione tra maiuscole e minuscole tranne che per la prima lettera.

Corrispondenza esatta Grep

Nei nostri esempi sopra, ogni volta che cerchiamo nel nostro documento la stringa "apple", grep restituisce anche "ananas" come parte dell'output. Per evitare ciò, e cercare rigorosamente "mela", puoi usare questo comando:

$ grep "\<apple\>" fruits.txt

Puoi anche usare l'opzione -w, che dirà a grep che la stringa deve corrispondere all'intera riga. Ovviamente, questo funzionerà solo in situazioni in cui non ti aspetti che il resto della riga abbia del testo.

Escludi pattern

Per vedere il contenuto di un file ma escludere i modelli dall'output, puoi utilizzare l'opzione -v.

$ grep -v string-to-exclude filename

Come puoi vedere nello screenshot, la stringa che abbiamo escluso non viene più mostrata quando eseguiamo lo stesso comando con l'opzione -v.

Grep e sostituisci

Un comando grep inviato tramite pipe a sed può essere utilizzato per sostituire tutte le istanze di una stringa in un file. Questo comando sostituirà “string1” con “string2” in tutti i file relativi alla directory di lavoro attuale:

$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

Grep con numero di riga

Per mostrare il numero di riga che contiene la tua stringa, usa l'opzione -n:

$ grep -n string filename

Mostra le righe prima e dopo

Se hai bisogno di un po' più di contesto per l'output di grep, puoi mostrare una riga prima e dopo la stringa di ricerca specificata con l'opzione -c:

$ grep -c 1 string filename

Specifica il numero di righe che desideri mostrare:in questo esempio abbiamo fatto solo 1 riga.

Ordina il risultato

Pipe greps genera l'output del comando sort per ordinare i risultati in una sorta di ordine. L'impostazione predefinita è alfabetica.

$ grep string filename | sort

Spero che il tutorial ti sia utile. Continua a tornare.


Linux
  1. Comando wc Linux con esempi

  2. Comando di ordinamento Linux con esempi

  3. Comando Tee Linux con esempi

  4. Comando testa di Linux con esempi

  5. Comando JQ in Linux con esempi

15 Comando Linux ps con esempi

Comando CD Linux con esempi

Comando Linux watch con esempi

Attendi comando in Linux con esempi

Comando di esportazione Linux con esempi

Comando IP Linux con esempi