Nel nostro precedente articolo sulle espressioni regolari, parte 1, abbiamo esaminato la reg-ex di base con esempi pratici.
Ma possiamo fare molto di più con le espressioni regolari. Spesso è possibile eseguire attività complesse con una singola espressione regolare invece di scrivere più righe di codice.
Quando si applica un'espressione regolare a una stringa, il motore dell'espressione regolare si avvia dal primo carattere della stringa. Proverà tutte le possibili permutazioni dell'espressione regolare al primo carattere. Solo se tutte le possibilità sono state provate e risultano fallite, il motore regex continuerà con il secondo carattere nel testo.
La regex proverà tutte le possibili permutazioni della regex, esattamente nello stesso ordine. Il risultato è che il motore regex-directed restituirà la corrispondenza più a sinistra.
In questo articolo, esaminiamo alcune espressioni regolari avanzate con esempi.
Esempio 1. Operazione OR (|)
Il carattere pipe (|) in grep viene utilizzato per specificare che una delle due sottoespressioni intere si trova in una posizione. "sottoespressione1|sottoespressione2" corrisponde a sottoespressione1 o sottoespressione2.
L'esempio seguente rimuoverà tre diversi tipi di righe di commento in un file utilizzando OR in un comando grep.
Innanzitutto, crea un file di esempio chiamato "commenti".
$ cat comments This file shows the comment character in various programming/scripting languages ### Perl / shell scripting If the Line starts with single hash symbol, then its a comment in Perl and shell scripting. ' VB Scripting comment The line should start with a single quote to comment in VB scripting. // C programming single line comment. Double slashes in the beginning of the line for single line comment in C.
Il file chiamato "commenti" ha righe di commento perl, script VB e programmazione C. Ora il seguente comando grep cerca la riga che non inizia con # o virgolette singole (') o doppie barre (//).
$ grep -v "^#\|^'\|^\/\/" comments This file shows the comment character in various programming/scripting languages If the Line starts with single hash symbol, then its a comment in Perl and shell scripting. The line should start with a single quote to comment in VB scripting. Double slashes in the beginning of the line for single line comment in C.
Esempio 2. Espressione di classe di caratteri
Come abbiamo visto nel nostro precedente articolo regex, esempio 9, l'elenco dei caratteri può essere menzionato tra parentesi quadre in modo che corrisponda solo a uno su più caratteri. Il comando Grep supporta alcune classi di caratteri speciali che denotano determinati intervalli comuni. Pochi di loro sono elencati qui. Fare riferimento alla pagina man di grep per conoscere le varie espressioni di classi di caratteri.
[:digit:] Only the digits 0 to 9 [:alnum:] Any alphanumeric character 0 to 9 OR A to Z or a to z. [:alpha:] Any alpha character A to Z or a to z. [:blank:] Space and TAB characters only.
Questi sono sempre utilizzati all'interno di parentesi quadre nella forma [[:digit:]]. Ora eseguiamo il grep di tutti gli ID di processo del processo daemon ntpd usando un'espressione di classe di caratteri appropriata.
$ grep -e "ntpd\[[[:digit:]]\+\]" /var/log/messages.4 Oct 28 11:42:20 gstuff1 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Oct 28 11:42:20 gstuff1 ntpd[2241]: synchronized to 15.11.13.123, stratum 3 Oct 28 12:33:31 gstuff1 ntpd[2241]: synchronized to LOCAL(0), stratum 10 Oct 28 12:50:46 gstuff1 ntpd[2241]: synchronized to 15.11.13.123, stratum 3 Oct 29 07:55:29 gstuff1 ntpd[2241]: time reset -0.180737 s
Esempio 3. Da M a N occorrenze ({m,n})
Un'espressione regolare seguita da {m,n} indica che l'elemento precedente ha una corrispondenza almeno m volte, ma non più di n volte. I valori di m e n devono essere non negativi e inferiori a 255.
L'esempio seguente stampa la riga se è compresa tra 0 e 99999.
$ cat number 12 12345 123456 19816282 $ grep "^[0-9]\{1,5\}$" number 12 12345
Il file chiamato "numero" ha l'elenco dei numeri, il comando grep sopra corrisponde solo al numero che va da 1 (il minimo è 0) a 5 cifre (massimo 99999).
Nota :per esempi di comandi grep di base, leggi 15 Esempi pratici di comandi Grep.
Esempio 4. Occorrenza M esatta ({m})
Un'espressione regolare seguita da {m} corrisponde esattamente a m occorrenze dell'espressione precedente. Il seguente comando grep visualizzerà solo il numero che ha 5 cifre.
$ grep "^[0-9]\{5\}$" number 12345
Esempio 5. M o più occorrenze ({m,})
Un'espressione regolare seguita da {m,} corrisponde a m o più occorrenze dell'espressione precedente. Il seguente comando grep visualizzerà il numero che ha 5 o più cifre.
$ grep "[0-9]\{5,\}" number 12345 123456 19816282
Nota :Sapevi che puoi usare il comando bzgrep per cercare una stringa o un pattern (espressione regolare) su file compressi bzip2.
Esempio 6. Limite di parole (\b)
\b corrisponde a un limite di parola. \b corrisponde a qualsiasi carattere all'inizio (\bxx) e/o alla fine (xx\b) di una parola, quindi \bil\b troverà il ma non quello, ma \blo troverà.
# grep -i "\bthe\b" comments This file shows the comment character in various programming/scripting languages If the Line starts with single hash symbol, The line should start with a single quote to comment in VB scripting. Double slashes in the beginning of the line for single line comment in C.
Esempio 7. Riferimenti arretrati (\n)
Il raggruppamento delle espressioni per un ulteriore utilizzo è disponibile in grep tramite i riferimenti a ritroso. Ad esempio, \([0-9]\)\1 corrisponde a un numero a due cifre in cui entrambe le cifre sono lo stesso numero come 11,22,33 ecc.,
# grep -e '^\(abc\)\1$' abc abcabc abcabc
Nel comando grep sopra, accetta l'input STDIN. quando legge l'input "abc" non corrisponde, La riga "abcabc" corrisponde all'espressione data, quindi viene stampata. Se si desidera utilizzare l'espressione regolare estesa, è sempre preferibile utilizzare il comando egrep. grep con l'opzione -e funziona anche come egrep, ma devi evitare i caratteri speciali come le parentesi.
Nota :puoi anche usare il comando zgrep per cercare all'interno di un file compresso gz.
Esempio 8. Abbina il modello "Orientato all'oggetto"
Finora abbiamo visto diversi suggerimenti nel comando grep, ora usando questi suggerimenti, abbiniamo "orientato agli oggetti" in vari formati.
$ grep "OO\|\([oO]bject\( \|\-\)[oO]riented\)"
Il comando grep sopra corrisponde a "OO", "orientato agli oggetti", "orientato agli oggetti" e così via,
Esempio 9. Stampa la riga “vocale singlecharacter samevowel”
Il seguente comando grep stampa tutte le righe contenenti una vocale (a, e, i, o o u) seguita da un singolo carattere seguito di nuovo dalla stessa vocale. Quindi troverà eve o adam ma non vera.
$ cat input evening adam vera $ grep "\([aeiou]\).\1" input evening adam
Esempio 10. Indirizzo IP valido
Il seguente comando grep corrisponde solo all'indirizzo IP valido.
$ cat input 15.12.141.121 255.255.255 255.255.255.255 256.125.124.124 $ egrep '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' input 15.12.141.121 255.255.255.255
Nell'espressione regolare data sopra, ci sono condizioni diverse. Queste partite condizionate dovrebbero verificarsi tre volte e un'altra classe viene menzionata separatamente.
- Se inizia con 25, il numero successivo dovrebbe essere compreso tra 0 e 5 (da 250 a 255)
- Se inizia con 2, il numero successivo potrebbe essere 0-4 seguito da 0-9 (da 200 a 249)
- zero occorrenze di 0 o 1, 0-9, quindi zero occorrenze di qualsiasi numero compreso tra 0-9 (da 0 a 199)
- Quindi carattere punto
Per la prima parte di questo articolo, leggi Espressioni regolari in Grep Command con 10 esempi – Parte I