grep

30 esempi di Grep

30 esempi di Grep
Puoi trovare grep presente nel profondo del cervello animale dei sistemi operativi Unix e simili a Unix. È un programma di base utilizzato per il pattern matching ed è stato scritto negli anni '70 insieme al resto dello strumento UNIX che conosciamo e amiamo (o odiamo).

L'apprendimento dei linguaggi formali e delle espressioni regolari è un argomento entusiasmante. Imparare grep ha molto di più delle regex. Per iniziare e vedere la bellezza e l'eleganza di grep devi prima vedere alcuni esempi del mondo reale.

Esempi che sono utili e ti semplificano la vita. Ecco 30 casi d'uso e opzioni simili a grep.

1. ps aux | grep

Il ps aux elenca tutti i processi e i loro pid associati. Ma spesso questa lista è troppo lunga per essere esaminata da un essere umano. Convogliando l'output a un comando grep è possibile elencare i processi in esecuzione con un'applicazione molto specifica in mente. Ad esempio il potrebbe essere sshd o nginx o httpd.

# ps aux | grep sshd
radice    400  0.0  0.2  69944  5624 ?       Ss   17:47   0:00 /usr/sbin/sshd -D
radice  1076  0.2  0.3  95204  6816 ?       Ss   18:29   0:00 sshd: root@pts/0
radice   1093  0.0  0.0  12784 932 punti/0    S+   18:29   0:00 grep sshd

2. Grepping dei tuoi indirizzi IP

Nella maggior parte dei sistemi operativi puoi elencare tutte le tue interfacce di rete e l'IP assegnato a quell'interfaccia usando il comando ifconfig o ip addr. Entrambi questi comandi produrranno molte informazioni aggiuntive. Ma se vuoi stampare solo l'indirizzo IP (diciamo per gli script di shell), puoi usare il comando seguente:

$ indirizzo ip | grep inet | awk ' print $2; '
$ indirizzo ip | grep -w inet | awk ' print $2; ' #Per le righe con solo inet e non inet6 (IPv6)

Il comando ip addr ottiene tutti i dettagli (inclusi gli indirizzi IP), viene quindi reindirizzato al secondo comando grep inet che restituisce solo le righe con inet al loro interno. Questo viene quindi reindirizzato in awk print l'istruzione che stampa la seconda parola in ogni riga (per dirla semplicemente).

P.S: Puoi anche farlo senza il grep se conosci awk bene lo sai.

3. Guardando i tentativi SSH falliti

Se disponi di un server rivolto a Internet, con un IP pubblico, sarà costantemente bombardato da tentativi SSH e se consenti agli utenti di accedere a SSH basato su password (una politica che non consiglierei) puoi vedere tutti questi tentativi falliti utilizzando il seguente comando grep:

# cat /var/log/auth.registro | grep “Fallire”
Campione in uscita
5 dic 16:20:03 debian sshd[509]: password non riuscita per root da 192.168.0.100 porte 52374 ssh2
5 dic. 16:20:07 debian sshd[509]: password non riuscita per root da 192.168.0.100 porte 52374 ssh2
5 dic 16:20:11 debian sshd[509]:password non riuscita per root da 192.168.0.100 porte 52374 ssh2

4. Tubazioni Grep a Uniq

A volte, grep produrrà molte informazioni. Nell'esempio sopra, un singolo IP potrebbe aver tentato di entrare nel tuo sistema. Nella maggior parte dei casi, ci sono solo una manciata di questi IP offensivi che devi identificare in modo univoco e inserire nella lista nera.

# cat /var/log/auth.registro | grep "Fallire" | uniq -f 3

Il comando uniq dovrebbe stampare solo le righe univoche. L'uniq -f 3 salta i primi tre campi (per trascurare i timestamp che non vengono mai ripetuti) e poi inizia a cercare linee univoche.

5. Grepping per i messaggi di errore

L'uso di Grep per i log di accesso e di errore non è limitato solo a SSH. I server Web (come Nginx) registrano gli errori e i registri di accesso in modo abbastanza meticoloso. Se imposti script di monitoraggio che ti inviano avvisi quando grep  "404" restituisce un nuovo valore. Può essere molto utile.

# grep -w "404" /var/www/nginx/access.log
192.168.0.100 - - [06/dic/2018:02:20:29 +0530] "OTTIENI /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, come Gecko) Cromo/70.0.3538.110 Safari/537.36"
192.168.0.101 - - [06/Dic/2018:02:45:16 +0530] "OTTIENI /favicon.ico HTTP/1.1" 404 143
"http://192.168.0.102/" "Mozilla/5.0 (iPad; CPU OS 12_1 come Mac OS X)
AppleWebKit/605.1.15 (KHTML, come Gecko) Versione/12.0 Cellulare/15E148 Safari/604.1"

L'espressione regolare potrebbe non essere "404", ma qualche altro filtro dell'espressione regolare solo per i client mobili o solo i dispositivi Apple che visualizzano una pagina web. Ciò ti consente di avere una visione più approfondita del rendimento della tua app.

6. Elenco dei pacchetti

Per i sistemi basati su Debian, dpkg -l elenca tutti i pacchetti installati sul tuo sistema. Puoi reindirizzarlo in un comando grep per cercare pacchetti appartenenti a un'applicazione specifica. Per esempio:

# dpkg -l | grep "vim"

7. grep -v nomi di file

Per elencare tutte le righe che non farlo contengono un dato pattern, usa il flag -v. È fondamentalmente l'opposto di un normale comando grep.

8. grep -l

Elenca tutti i file che contengono almeno un'occorrenza del modello fornito. Questo è utile quando stai cercando un modello all'interno di una directory con più file. Stampa solo il nome del file e non la riga specifica con il motivo.

9. Opzione parola singola -w

$ grep -w nomi file

Il flag -w dice a grep di cercare il modello dato come una parola intera e non solo una sottostringa di una riga. Ad esempio, in precedenza abbiamo eseguito il grep per l'indirizzo IP e il modello inet stampato le linee con entrambi inet e inet6 elencando sia gli indirizzi IPv4 che IPv6. Ma se usassimo -w flagga solo le righe con inet come una parola preceduta e seguita da spazi bianchi è una corrispondenza valida.

10. Espressione regolare estesa

Scoprirai spesso che le espressioni regolari native di Grep sono un po' limitanti. Nella maggior parte degli script e delle istruzioni troverai l'uso del flag -E e questo ti permetterà di inserire il modello in quella che viene chiamata la modalità estesa.

Ecco i comandi grep e grep -E per cercare le parole Superman e Spiderman.

$ grep "\(Super|Uomo Ragno\)" testo
$ grep -E "(Super|Uomo Ragno)" testo

Come puoi vedere, la versione estesa è molto più facile da leggere.

11. Grep per i tuoi contenitori

Se disponi di un grande cluster di contenitori in esecuzione sul tuo host, puoi eseguirne il grep per nome dell'immagine, stato, porte che stanno esponendo e molti altri attributi. Per esempio,

$ docker ps | grep [nomeimmagine]

12. Grep per i tuoi baccelli

Già che siamo in tema di contenitori. Kubernetes spesso tende a lanciare più pod in una determinata distribuzione. Sebbene ogni pod abbia un nome univoco, in un dato spazio dei nomi, iniziano con il nome della distribuzione, in genere. Possiamo grep di questo ed elencare tutti i pod associati a una determinata distribuzione.

$ kubectl ottieni pod | grep

13. Grep per Big Data

Spesso l'analisi dei cosiddetti "Big Data" implica una semplice ricerca, ordinamento e conteggio dei modelli in un determinato set di dati. Le utilità UNIX di basso livello come grep, uniq, wc sono particolarmente brave in questo. Questo post sul blog mostra un bell'esempio di un'attività eseguita in pochi secondi usando grep e altre utility Unix mentre Hadoop ha impiegato quasi mezz'ora.

Ad esempio, questo set di dati è superiore a 1.7 GB di dimensione. Contiene informazioni su una moltitudine di partite di scacchi, comprese le mosse fatte, chi ha vinto, ecc. Siamo interessati solo ai risultati, quindi eseguiamo il seguente comando:

$ grep "Risultato" millionbase-2.22.pgn | ordina | uniq -c
221 [Risultato "*"]
653728 [Risultato "0-1"]
852305 [Risultato "1-0"]
690934 [Risultato "1/2-1/2"]

Questo ha richiesto circa 15 secondi su un processore a 2 core/4 thread di 4 anni. Quindi la prossima volta che risolverai un problema di "big data". Pensa se puoi usare grep invece.

14. grep -color=auto

Questa opzione consente a grep di evidenziare il motivo all'interno della linea in cui è stato trovato.

15. grep -i

La corrispondenza del modello Grep è intrinsecamente sensibile alle maiuscole e minuscole. Ma se non ti interessa, l'uso del flag -i renderà grep insensibile alle maiuscole e minuscole.

16. grep -n

Il flag -n mostrerà i numeri di riga in modo da non doverti preoccupare di trovare la stessa riga in seguito.

17. git grep

Git, il sistema di controllo della versione, ha di per sé un comando grep integrato che funziona più o meno come il normale grep. Ma può essere usato per cercare modelli su qualsiasi albero impegnato usando la CLI nativa di git, invece di noiose pipe. Ad esempio, se ti trovi nel ramo principale del tuo repository, puoi eseguire il grep attraverso il repository utilizzando:

(master) $ git grep

18. grep -o

Il flag -o è davvero utile quando si tenta di eseguire il debug di un'espressione regolare. Stamperà solo la parte corrispondente della riga, invece dell'intera riga. Quindi, nel caso in cui ricevi troppe linee indesiderate per un modello fornito, e non riesci a capire perché ciò stia accadendo. Puoi usare il flag -o per stampare la sottostringa incriminata e ragionare sulla tua regex a ritroso da lì.

19. grep -x

Il flag -x stamperebbe una riga, se e solo se l'intera riga corrisponde all'espressione regolare fornita supplied. Questo è in qualche modo simile al flag -w che stampava una riga se e solo di una parola intera corrispondeva alla regex fornita.

20. grep -T

Quando hai a che fare con i log e gli output di uno script di shell, è più che probabile che incontri schede rigide per distinguere tra diverse colonne di output. Il flag -T allineerà accuratamente queste schede in modo che le colonne siano disposte in modo ordinato, rendendo l'output leggibile dall'uomo.

21. grep -q

Questo sopprime l'output ed esegue silenziosamente il comando grep. Molto utile quando si sostituisce il testo o si esegue grep in uno script demone.

22. grep -P

Le persone che sono abituate alla sintassi delle espressioni regolari perl possono usare il flag -P per usare esattamente questo. Non devi imparare l'espressione regolare di base, che grep usa per impostazione predefinita.

23. grep -D [AZIONE]

In Unix, quasi tutto può essere trattato come un file. Di conseguenza, qualsiasi dispositivo, socket o flusso di dati FIFO può essere inviato a grep. Puoi usare il flag -D seguito da un'AZIONE (l'azione predefinita è READ). Alcune altre opzioni sono SKIP per saltare silenziosamente dispositivi specifici e RECURSE per passare ricorsivamente attraverso directory e collegamenti simbolici.

24. Ripetizione

Se stai cercando un modello dato che è una ripetizione di un modello più semplice noto, usa le parentesi graffe per indicare il numero di ripetizioni

$ grep -E “[0-9]10”

Questo stampa righe contenenti stringhe lunghe 10 o più cifre.

25. Stenografie di ripetizione

Alcuni caratteri speciali sono riservati a un tipo specifico di ripetizione del motivo. Puoi usarli al posto delle parentesi graffe, se si adattano alle tue esigenze.

? : il modello che precede il punto interrogativo deve corrispondere a zero o una volta.

* : Il motivo che precede la stella deve corrispondere a zero o più volte.

+ : Il modello che precede il segno più deve corrispondere una o più volte.

25. Offset di byte

Se vuoi sapere vedere l'offset in byte delle righe in cui si trova l'espressione corrispondente, puoi usare il flag -b per stampare anche gli offset. Per stampare l'offset solo della parte corrispondente di una linea, puoi usare il flag -b con il flag -o.

$ grep -b -o [nome del file]

Offset significa semplicemente, dopo quanti byte dall'inizio del file inizia la stringa corrispondente.

26. egrep, fgrep e rgerp

Vedrai spesso l'invocazione di egrep, per utilizzare la sintassi estesa dell'espressione regolare di cui abbiamo discusso in precedenza. Tuttavia, questa è una sintassi deprecata e si consiglia di evitare di utilizzarla. Usa invece grep -E. Allo stesso modo, usa grep -F, invece di fgrep e grep -r invece di rgrep.

27. grep -z

A volte l'input di grep non è costituito da righe che terminano con un carattere di nuova riga. Ad esempio, se stai elaborando un elenco di nomi di file, potrebbero provenire da fonti diverse. Il flag -z dice a grep di trattare il carattere NULL come fine di riga. Ciò ti consente di trattare il flusso in entrata come un normale file di testo.

28. grep -a [nome del file]

Il flag -a dice a grep di trattare il file fornito come se fosse testo normale. Il file potrebbe essere un binario, ma grep tratterà i contenuti all'interno, come se fossero testo.

29. grep -U [nome del file]

Il flag -U dice a grep di trattare i file forniti come se fossero file binari e non di testo. Di default grep indovina il tipo di file guardando i primi byte. L'uso di questo flag prevale sul funzionamento dell'ipotesi.

30. grep -m NUM

Con file di grandi dimensioni, il grepping per un'espressione può richiedere un'eternità. Tuttavia, se vuoi controllare solo i primi NUM numeri di corrispondenze puoi usare il flag -m per farlo. È più veloce e anche l'output è spesso gestibile.

Conclusione

Gran parte del lavoro quotidiano di un amministratore di sistema prevede il vagliare grandi porzioni di testo. Questi possono essere registri di sicurezza, registri dal tuo server web o di posta, attività dell'utente o anche testo di grandi dimensioni di pagine man. Grep ti dà quel tocco in più di flessibilità quando hai a che fare con questi casi d'uso.

Si spera che i pochi esempi e casi d'uso sopra riportati ti abbiano aiutato a comprendere meglio questo fossile vivente di un software.

Emula i clic del mouse passando il mouse utilizzando il mouse senza clic in Windows 10
L'uso di un mouse o di una tastiera nella postura sbagliata di un uso eccessivo può causare molti problemi di salute, tra cui tensione, sindrome del t...
Aggiungi i gesti del mouse a Windows 10 utilizzando questi strumenti gratuiti
Negli ultimi anni computer e sistemi operativi si sono notevolmente evoluti greatly. C'è stato un tempo in cui gli utenti dovevano usare i comandi per...
Controlla e gestisci il movimento del mouse tra più monitor in Windows 10
Gestore mouse con doppio display ti consente di controllare e configurare il movimento del mouse tra più monitor, rallentando i suoi movimenti vicino ...