Usando il grep con espressioni regolari

Usando il grep con espressioni regolari
Questo tutorial descrive come usare entrambi grep (E egrep) to Trova il testo nei file, nella loro forma semplice e se combinato con espressioni regolari. Contiene diversi esempi E esercizi, più soluzioni, per lo spettatore da completare.

Il nome grep Viene dal comando ED (e VIM) “G/RE/P”, il che significa cercare a livello globale una data espressione e stampa regolari (display) l'output.

Regolare Espressioni

Le utility consentono all'utente di cercare file di testo per righe che corrispondono a un'espressione regolare (regexp). Un'espressione regolare è una stringa di ricerca composta da testo e uno o più di 11 caratteri speciali. Un semplice esempio è abbinare l'inizio di una linea.

File di esempio

La forma di base di grep può essere utilizzato per trovare un testo semplice all'interno di un determinato file o file. Per provare gli esempi, crea prima il file di esempio.

Utilizzare un editor come Nano o VIM per copiare il testo seguente in un file chiamato il mio file.

XYZ
xyzde
Exyzd
Dexyz
D?Gxyz
xxz
xzz
x \ z
x*z
xz
x z
XYZ
XYYZ
XYZ
XYYZ
XYYYZ
Xyyyyz

Sebbene sia possibile copiare e incollare gli esempi nel testo (si noti che le citazioni doppie potrebbero non copiare correttamente), è necessario digitare comandi per apprendenti correttamente.

Prima di provare gli esempi, visualizzare il file di esempio:

gatto myfile
XYZ
xyzde
Exyzd
Dexyz
D?Gxyz
xxz
xzz
x \ z
x*z
xz
x z
XYZ
XYYZ
XYZ
XYYZ
XYYYZ
Xyyyyz

Ricerca semplice

Per trovare il testo "XYZ" all'interno del file, eseguire quanto segue:

grep xyz myfile
XYZ
xyzde
Exyzd
Dexyz
D?Gxyz

Opzioni

Opzioni comuni utilizzate con il grep Il comando include:

  • -Trovo tutte le linee indipendentemente di caso
  • -C contare Quante righe contengono il testo
  • -n riga di visualizzazione numeri di linee corrispondenti
  • -l solo display file nomi quella partita
  • -R ricorsivo Ricerca di sotto-directory
  • -v Trova tutte le linee NON contenente il testo

Per esempio:

grep -i xyz myfile
# Trova il testo indipendentemente dal caso
XYZ
xyzde
Exyzd
Dexyz
D?Gxyz
XYZ
XYZ
grep -ic xyz myfile
# Conta le righe con il testo
7
grep -in xyz myfile
# mostra i numeri di riga
1: XYZ
2: xyzde
3: Exyzd
4: Dexyz
5 D?Gxyz
12: XYZ
14: XYZ

Crea più file

Prima di provare a cercare più file, creare diversi nuovi file:

echo xyz> myfile1
gatto myfile1
XYZ
echo -e 'xyz \ nxzz \ nxyz'> myfile2
gatto myfile2
XYZ
xzz
XYZ
echo -e 'xxx \ nyyy'> myfile3
gatto myfile3
xxx

Cerca più file

Per cercare più file utilizzando filenamames o un jolly immettere:

grep -ic xyz myfile myfile1 myfile2 myfile3
myfile: 7
myfile1: 1
myfile2: 2
myfile3: 0
# Match Filienames a partire da "My"
grep -in xyz mio*
myfile: 1: xyz
myfile: 2: xyzde
myfile: 3: exyzd
myfile: 4: dexyz
myfile: 5: D?Gxyz
myfile: 12: xyz
myfile: 14: xyz
myfile1: 1: xyz
myfile2: 1: xyz
myfile2: 3: xyz

Esercizio I

  1. Primo conteggio quante righe ci sono nel file /etc /passwd.
Suggerimento: usa wc -l /etc /passwd
  1. Ora trova tutte le occorrenze del testo var Nel file /etc /passwd.
  2. Trova quante righe nel file contengono il testo
  3. Trova quante righe non contengono il testo var.
  4. Trova la voce per il tuo accesso in /etc/passwd

Le soluzioni di esercizio possono essere trovate alla fine di questo articolo.

Usando espressioni regolari

Il comando grep può anche essere usato con espressioni regolari usando uno o più di undici caratteri speciali o simboli per perfezionare la ricerca. Un'espressione regolare è una stringa di caratteri che include caratteri speciali per consentire la corrispondenza del motivo all'interno delle utility come grep, vim E sed. Si noti che potrebbe essere necessario chiudere le stringhe in virgolette.

I caratteri speciali disponibili includono:

^ Inizio di una linea
$ Fine di una linea
. Qualsiasi carattere (tranne \ n newline)
* 0 o più dell'espressione precedente
\ Precedente un simbolo lo rende un carattere letterale

Si noti che il *, che può essere utilizzato nella riga di comando per abbinare qualsiasi numero di caratteri incluso nessuno, è non usato allo stesso modo qui.

Nota anche l'uso delle citazioni nei seguenti esempi.

Esempi

Per trovare tutte le righe che iniziano con il testo usando il carattere ^:

grep '^xyz' myfile

Per trovare tutte le righe che terminano con il testo usando il carattere $:

grep 'xyz $' myfile

Per trovare linee contenenti una stringa usando sia i caratteri ^ che $:

grep '^xyz $' myfile

Per trovare linee usando il file . per abbinare qualsiasi personaggio:

grep '^x.z 'myfile

Per trovare linee usando il * per abbinare 0 o più dell'espressione precedente:

grep '^xy*z' myfile

Per trovare linee usando .* per abbinare 0 o più di qualsiasi personaggio:

grep '^x.*z 'myfile

Per trovare linee usando il file \ per sfuggire al * personaggio:

grep '^x \*z' myfile

Per trovare l'uso \ personaggio:

grep '\\' myfile

Espressione grep - egrep

IL grep Il comando supporta solo un sottoinsieme delle espressioni regolari disponibili. Tuttavia, il comando egrep:

  • consente il pieno uso di tutte le espressioni regolari
  • può contemporaneamente cercare più di un'espressione

Si noti che le espressioni devono essere racchiuse in una coppia di citazioni.

Per cercare più di uno Regex IL egrep Il comando può essere scritto su più righe. Tuttavia, questo può essere fatto anche usando questi personaggi speciali:

| Alternanza, l'una o l'altra
(...) Raggruppamento logico di parte di un'espressione
egrep '(^root |^uucp |^mail)' /etc /passwd

Questo estrae le righe che iniziano con root, UUCP o posta dal file, il | simbolo che significa una delle opzioni.

Il seguente comando lo farà non lavoro, sebbene non venga visualizzato alcun messaggio, poiché il base grep Il comando non supporta tutte le espressioni regolari:

grep '(^root |^uucp |^mail)' /etc /passwd

Tuttavia, sulla maggior parte dei sistemi Linux il comando grep -e è lo stesso che usare egrep:

grep -e '(^root |^uucp |^mail)' /etc /passwd

Usando i filtri

Tubatura è il processo di invio dell'output di un comando come input in un altro comando ed è uno degli strumenti Linux più potenti disponibili.

I comandi che vengono visualizzati in una pipeline vengono spesso indicati come filtri poiché in molti casi setacciano o modificano l'ingresso passato loro prima di inviare il flusso modificato all'output standard.

Nell'esempio seguente, output standard da ls -l viene passato come input standard al grep comando. Output da grep Il comando viene quindi passato come input al Di più comando.

Questo visualizzerà solo directory in /eccetera:

ls -l /etc | grep '^d' | di più

I seguenti comandi sono esempi di utilizzo dei filtri:

PS -ef | grep cron
chi | grep kdm

File di esempio

Per provare l'esercizio di revisione, crea prima il seguente file di esempio.

Utilizzare un editor come Nano o VIM per copiare il testo seguente in un file chiamato persone:

Personale j.Smith 25000
Personale e.Smith 25400
Formazione a.Brown 27500
Allenamento c.Browen 23400
(Amministratore) r.Bron 30500
Goodsout t.Smyth 30000
Personale f.Jones 25000
Allenamento* c.Evans 25500
Goodsout w.Papa 30400
Groundfloor t.Smythe 30500
Personale j.Maler 33000

Esercizio II

  1. Visualizza il file persone ed esaminare il suo contenuto.
  2. Trova tutte le righe contenenti la stringa fabbro Nel file persone.Suggerimento: usa il comando grep ma ricorda che per impostazione predefinita è sensibile alla maiuscolo.
  3. Crea un nuovo file, npeople, contenente tutte le righe che iniziano con la stringa Personale Nel file delle persone.Suggerimento: usa il comando grep con>.
  4. Conferma il contenuto del file npeople elencando il file.
  5. Ora aggiungono tutte le righe in cui il testo termina con la stringa 500 Nel file persone al file npeople.Suggerimento: usa il comando grep con >>.
  6. Ancora una volta, conferma il contenuto del file npeople elencando il file.
  7. Trova l'indirizzo IP del server che è archiviato nel file /etc/host.Suggerimento: usa il comando grep con $ (nome host)
  8. Utilizzo egrep per estrarre dal /etc/passwd righe dell'account file contenenti LP o il tuo ID utente.

Le soluzioni di esercizio possono essere trovate alla fine di questo articolo.

Espressioni più regolari

Un'espressione regolare può essere pensata come jolly su steroidi.

Ci sono undici caratteri con significati speciali: le staffe quadrate di apertura e chiusura [], The Backslash \, The Caret ^, The Dollar Sign $, il periodo o Dot ., La barra verticale o il simbolo del tubo |, il punto interrogativo ?, l'asterisco o la stella *, il segno più + e la staffa di apertura e chiusura del round . Questi personaggi speciali sono spesso chiamati anche metacharacter.

Ecco il set completo di personaggi speciali:

^ Inizio di una linea
$ Fine di una linea
. Qualsiasi carattere (tranne \ n newline)
* 0 o più dell'espressione precedente
| Alternanza, l'una o l'altra
[…] Set esplicito di personaggi da abbinare
+ 1 o più dell'espressione precedente
? 0 o 1 dell'espressione precedente
\ Precedente un simbolo lo rende un carattere letterale
Notazione di quantificatore esplicita
(...) Raggruppamento logico di parte di un'espressione

La versione predefinita di grep ha solo un supporto di espressione regolare limitato. Affinché tutti i seguenti esempi funzionino, usa egrep invece o grep -e.

Per trovare linee usando il file | per abbinare entrambe le espressioni:

egrep 'xxz | xzz' myfile

Per trovare linee usando | Per abbinare entrambe le espressioni all'interno di una stringa usa anche ():

egrep '^x (yz | yz)' myfile

Per trovare linee usando [] per abbinare qualsiasi personaggio:

egrep '^x [yy] z' myfile

Per trovare linee usando [] per non abbinare alcun carattere:

egrep '^x [^yy] z' myfile

Per trovare linee usando il * per abbinare 0 o più dell'espressione precedente:

egrep '^xy*z' myfile

Per trovare linee usando il + per abbinare 1 o più dell'espressione precedente:

egrep '^xy+z' myfile

Per trovare linee usando il file ? per abbinare 0 o 1 dell'espressione precedente:

egrep '^xy?z 'myfile

Esercizio III

  1. Trova tutte le righe contenenti i nomi Evans O Maler Nel file persone.
  2. Trova tutte le righe contenenti i nomi Smith, Smyth O Smythe Nel file persone.
  3. Trova tutte le righe contenenti i nomi Brown, Browen O Bron Nel file persone.Se hai tempo:
  4. Trova la linea contenente la stringa (amministratore), comprese le parentesi, nel file persone.
  5. Trova la riga contenente il carattere * nel file persone.
  6. Combina 5 e 6 sopra per trovare entrambe le espressioni.

Altri esempi

Per trovare linee usando . e * per abbinare qualsiasi insieme di personaggi:

egrep '^xy.*z 'myfile

Per trovare le righe usando per abbinare il numero n di caratteri:

egrep '^xy 3 z' myfile
egrep '^xy 4 z' myfile

Per trovare righe usando per abbinare n o più volte:

egrep '^xy 3, z' myfile

Per trovare righe usando per abbinare n volte ma non più di m:

egrep '^xy 2,3 z' myfile

Conclusione

In questo tutorial abbiamo guardato per la prima volta usando grep Nel suo semplice modulo trovare il testo in un file o in più file. Abbiamo quindi combinato il testo da cercare con semplici espressioni regolari e quindi più complesse usando egrep.

Prossimi passi

Spero che metterai a frutto le conoscenze acquisite. Provare grep Comandi sui tuoi dati e ricorda, espressioni regolari come descritto qui possono essere utilizzate nella stessa forma in vi, sed E Awk!

Soluzioni di esercizio

Esercizio I

Primo conteggio quante righe ci sono nel file /etc/passwd.

wc -l /etc /passwd

Ora trova tutte le occorrenze del testo var Nel file /etc /passwd.

grep var /etc /passwd

Trova quante righe nel file contengono il testo var

grep -c var /etc /passwd

Trova quante righe non contengono il testo var.

grep -cv var /etc /passwd

Trova la voce per il tuo accesso in /etc/passwd file

grep kdm /etc /passwd


Esercizio II

Visualizza il file persone ed esaminare il suo contenuto.

Persone gatto

Trova tutte le righe contenenti la stringa fabbro nel file persone.

Grep 'Smith' People

Crea un nuovo file, npeople, contenente tutte le linee che iniziano con la stringa Personale nel persone file

Grep '^Personal' People> npeople

Conferma il contenuto del file npeople elencando il file.

Cat npeople

Ora aggiungono tutte le righe in cui il testo termina con la stringa 500 nel file persone al file npeople.

Grep '500 $' persone >> npeople

Ancora una volta, conferma il contenuto del file npeople elencando il file.

Cat npeople

Trova l'indirizzo IP del server che è archiviato nel file /etc/host.

grep $ (nome host) /etc /host

Utilizzo egrep per estrarre dal /etc/passwd righe dell'account file contenenti LP o il tuo ID utente.

egrep '(lp | kdm :)' /etc /passwd


Esercizio III

Trova tutte le righe contenenti i nomi Evans O Maler nel file persone.

Egrep 'Evans | Maler' People

Trova tutte le righe contenenti i nomi fabbro, Smyth O Smythe nel file persone.

egrep 'sm (i | y) il?' persone

Trova tutte le righe contenenti i nomi Marrone, Browen O Bron Nel file persone.

Egrep 'Brow?e?N 'People

Trova la linea contenente la stringa (amministratore), comprese le staffe, nel file persone.

$ egrep '\ (admin \)' People

Trova la linea contenente il carattere * Nel file persone.

egrep '\*' persone

Combina 5 e 6 sopra per trovare entrambe le espressioni.

egrep '\ (admin \) | \*' People