Usare grep (e egrep) con le espressioni regolari

Using Grep With Regular Expressions



Questo tutorial descrive come usare entrambi presa (e egrep) t o trovare testo nei file, nella loro forma semplice e quando combinato con espressioni regolari. Ne contiene diversi esempi e esercizi , Di più soluzioni , per il completamento da parte dello spettatore.

Il nome presa deriva dal comando ed (e vim) g/re/p, che significa cercare globalmente una data espressione regolare e stampare (visualizzare) l'output.







Regolare espressioni

Le utilità consentono all'utente di cercare nei file di testo le righe che corrispondono a un'espressione regolare ( espressione regolare ). Un'espressione regolare è una stringa di ricerca composta da testo e uno o più di 11 caratteri speciali. Un semplice esempio è la corrispondenza dell'inizio di una riga.



File di esempio

La forma base di presa può essere utilizzato per trovare testo semplice all'interno di uno o più file particolari. Per provare gli esempi, creare prima il file di esempio.



Usa un editor come nano o vim per copiare il testo qui sotto in un file chiamato il mio file .





xyz
xyzde
exyzd
dexyz
d?gxyz
xxz
xzz
xz
x*z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Sebbene tu possa copiare e incollare gli esempi nel testo (nota che le doppie virgolette potrebbero non essere copiate correttamente), i comandi devono essere digitati per impararli correttamente.

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



$gattoil mio file

Ricerca semplice

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

$presaxyz miofile

Uso dei colori

Per visualizzare i colori, usa –color (un doppio trattino) o crea semplicemente un alias. Per esempio:

$presa --colorexyz miofile

o

$alias presa= 'presa--colore'
$presaxyz miofile

Opzioni

Opzioni comuni utilizzate con il presa comando include:

  • -trovo tutte le righe a prescindere del caso
  • -C contare quante righe contengono il testo
  • -n riga di visualizzazione numeri di linee abbinate
  • -l display only file nomi quella partita
  • -R ricorsivo ricerca di sottodirectory
  • -v trova tutte le righe NON contenente il testo

Per esempio:

$presa -ioxyz miofile# trova il testo indipendentemente dal caso

$presa -circuito integratoxyz miofile# conta le righe con il testo

$presa -inxyz miofile# mostra i numeri di riga

Crea più file

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

$buttato fuorixyz>miofile1
$buttato fuori -exyz xzz XYZ>miofile2
$buttato fuori -exxx yyy>miofile3
$gattomiofile1
$gattomiofile2
$gattomiofile3

Cerca più file

Per cercare più file utilizzando nomi di file o un carattere jolly, immettere:

$presa -circuito integratoxyz miofile miofile1 miofile2 miofile3
$presa -inxyz mio*
# corrisponde a nomi di file che iniziano con 'mio'

Esercizio I

  1. Prima conta quante righe ci sono nel file /etc/passwd.
Suggerimento: utilizzareWC -l /eccetera/passwd
  1. Ora trova tutte le occorrenze del testo dove nel file /etc/passwd .
  2. Trova quante righe nel file contengono il testo
  3. Trova quante righe NON contengono il testo dove .
  4. Trova la voce per il tuo login nel /etc/passwd

Le soluzioni per gli esercizi si trovano alla fine di questo articolo.

Utilizzo delle espressioni regolari

Il comando presa può essere utilizzato anche con le espressioni regolari utilizzando uno o più degli undici caratteri speciali o simboli per affinare la ricerca. Un'espressione regolare è una stringa di caratteri che include caratteri speciali per consentire la corrispondenza dei modelli all'interno di utilità come presa , sono venuto e sed . Si noti che potrebbe essere necessario racchiudere le stringhe tra virgolette.

I caratteri speciali disponibili includono:

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

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

Si noti inoltre l'uso delle virgolette negli esempi seguenti.

Esempi

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

$presa'^xyz' miofile

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

$presa'xyz$' miofile

Per trovare righe contenenti una stringa utilizzando entrambi i caratteri ^ e $:

$presa'^xyz$' miofile

Per trovare le linee usando il . per abbinare qualsiasi carattere:

$presa'^x.z' miofile

Per trovare le righe utilizzando * in modo che corrispondano a 0 o più dell'espressione precedente:

$presa'^xy*z 'miofile

Per trovare le righe usando .* per trovare 0 o più caratteri qualsiasi:

$presa'^ X.*z 'miofile

Per trovare le linee usando il per sfuggire al carattere *:

$presa'^X*z 'miofile

Per trovare il carattere usa:

$presa'\' il mio file

Espressione grep – egrep

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

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

Notare che le espressioni devono essere racchiuse tra virgolette.

Per usare i colori, usa –color o crea ancora un alias:

$alias egrep='egrep --colore'

Per cercarne più di uno regex il egrep comando può essere scritto su più righe. Tuttavia, questo può essere fatto anche usando questi caratteri speciali:

| Alternanza, l'uno o l'altro
(…) Raggruppamento logico di parte di un'espressione
$egrep '(^root|^uucp|^mail)' /eccetera/passwd

Questo estrae le righe che iniziano con root, uucp o mail dal file, il | simbolo che indica una delle opzioni.

Il seguente comando sarà non funziona, anche se non viene visualizzato alcun messaggio, poiché la base presa Il comando non supporta tutte le espressioni regolari:

$presa '(^root|^uucp|^mail)' /eccetera/passwd

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

$presa -E '(^root|^uucp|^mail)' /eccetera/passwd

Utilizzo dei filtri

Tubazioni è 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 appaiono in una pipeline sono spesso indicati come filtri poiché in molti casi setacciano o modificano l'input passato loro prima di inviare il flusso modificato allo standard output.

Nell'esempio seguente, l'output standard da ls -l viene passato come input standard al presa comando. Uscita dal presa il comando viene quindi passato come input al Di più comando.

Questo mostrerà solo le directory in /eccetera :

$ls -l /eccetera|presa'^d'|Di più

I seguenti comandi sono esempi di utilizzo dei filtri:

$ps -ef|presacron

$chi|presakdm

File di esempio

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

Usa un editor come nano o vim per copiare il testo qui sotto in un file chiamato le persone:

J.Smith personale 25000
E.Smith personale 25400
Allenamento A.Brown 27500
Formazione C.Brown 23400
(Amministratore) R.Bron 30500
Goodsout T.Smyth 30000
Personale F.Jones 25000
formazione* C.Evans 25500
Goodsout W.Papa 30400
Piano terra T.Smythe 30500
Staff J.Maler 33000

Esercizio II

  1. Visualizza il file le persone ed esaminarne il contenuto.
  2. Trova tutte le righe che contengono la stringa fabbro nel file people.Hint: usa il comando grep ma ricorda che per impostazione predefinita fa distinzione tra maiuscole e minuscole.
  3. Crea un nuovo file, npeople, contenente tutte le righe che iniziano con la stringa Personale nel file people.Suggerimento: usa il comando grep con >.
  4. Conferma il contenuto del file npeople elencando il file.
  5. Ora aggiungi tutte le righe in cui il testo termina con la stringa 500 nel file people nel file npeople.Hint: 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 è memorizzato nel file /etc/host .Suggerimento: usa il comando grep con $(hostname)
  8. Utilizzo egrep estrarre da /etc/passwd file di righe di account contenenti lp o il tuo ID utente .

Le soluzioni per gli esercizi si trovano alla fine di questo articolo.

Più espressioni regolari

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

Ci sono undici caratteri con significati speciali: le parentesi quadre di apertura e chiusura [ ], la barra rovesciata , l'accento circonflesso ^, il simbolo del dollaro $, il punto o punto ., il simbolo della barra verticale o della barra verticale |, il punto interrogativo ?, il asterisco o stella *, il segno più + e la parentesi tonda di apertura e chiusura { }. Questi caratteri speciali sono spesso chiamati anche metacaratteri.

Ecco il set completo di caratteri speciali:

^ Inizio di una linea
$ Fine di una linea
. Qualsiasi carattere (tranne newline)
* 0 o più dell'espressione precedente
| Alternanza, l'uno o l'altro
[…] Set esplicito di caratteri da abbinare
+ 1 o più dell'espressione precedente
? 0 o 1 dell'espressione precedente
Precedere un simbolo lo rende un carattere letterale
{...} Notazione quantificatrice esplicita
(…) Raggruppamento logico di parte di un'espressione

La versione predefinita di presa ha solo un supporto limitato per le espressioni regolari. Affinché tutti i seguenti esempi funzionino, utilizzare egrep invece o grep -E .

Per trovare le linee usando il | per abbinare una delle due espressioni:

$egrep'xxz|xzz' miofile

Per trovare le righe usando | per abbinare entrambe le espressioni all'interno di una stringa utilizzare anche ( ):

$egrep'^X(Yz|yz)' il mio file

Per trovare le righe usando [ ] per trovare una corrispondenza con qualsiasi carattere:

$egrep'^X[]z 'miofile

Per trovare le righe usando [ ] per NON corrispondere a nessun carattere:

$egrep'^X[^ Sì]z 'miofile

Per trovare le righe utilizzando * in modo che corrispondano a 0 o più dell'espressione precedente:

$egrep'^xy*z 'miofile

Per trovare le righe usando il + per far corrispondere 1 o più dell'espressione precedente:

$egrep'^xy+z' miofile

Per trovare le righe utilizzando ? per far corrispondere 0 o 1 dell'espressione precedente:

$egrep'^xy?z' miofile

Esercizio III

  1. Trova tutte le righe che contengono i nomi Evans o pittore nel file persone.
  2. Trova tutte le righe che contengono i nomi Smith, Smith o Smythe nel file persone.
  3. Trova tutte le righe che contengono i nomi Marrone, Marrone o Fonte nel file persone. Se hai tempo:
  4. Trova la riga 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 le linee usando . e * per abbinare qualsiasi set di caratteri:

$egrep'^xy.*z 'miofile

Per trovare le righe utilizzando { } per abbinare N numero di caratteri:

$egrep'^xy{3}z 'miofile
$egrep'^xy{4}z 'miofile

Per trovare le righe utilizzando { } per abbinare N o più volte:

$egrep'^xy{3,}z 'miofile

Per trovare le righe usando { } per trovare N volte ma non più di M volte:

$egrep'^xy{2,3}z 'miofile

Conclusione

In questo tutorial abbiamo prima esaminato l'utilizzo presa nella sua forma semplice per trovare il testo in un file o in più file. Abbiamo quindi combinato il testo da cercare con semplici espressioni regolari e poi con espressioni più complesse utilizzando egrep .

Prossimi passi

Spero che metterete a frutto le conoscenze acquisite qui. Provalo presa comandi sui tuoi dati e ricorda, le espressioni regolari descritte qui possono essere usate nella stessa forma in noi , sed e awk !

Soluzioni per esercizi

Esercizio I

Prima conta quante righe ci sono nel file /etc/passwd .
$ wc -l /etc/passwd
Ora trova tutte le occorrenze del testo dove nel file /etc/passwd.
$ grep var /etc/passwd
Trova quante righe nel file contengono il testo dove

presa -Cdove/eccetera/passwd

Trova quante righe NON contengono il testo dove .

presa -CVdove/eccetera/passwd

Trova la voce per il tuo login nel /etc/passwd file
grep kdm /etc/passwd

Esercizio II

Visualizza il file le persone ed esaminarne il contenuto.
$ cat people
Trova tutte le righe che contengono la stringa fabbro nel file le persone .
$ grep 'Smith' people
Crea un nuovo file, npersone , contenente tutte le righe che iniziano con la stringa Personale nel le persone file
$ grep '^Personal' people> npeople
Conferma il contenuto del file npersone elencando il file.
$ cat npeople
Ora aggiungi tutte le righe in cui il testo termina con la stringa 500 nel file le persone al file npersone .
$ grep '500$' people>>npeople
Ancora una volta, conferma il contenuto del file npersone elencando il file.
$ cat npeople
Trova l'indirizzo IP del server che è memorizzato nel file /etc/host .
$ grep $(hostname) /etc/hosts
Utilizzo egrep estrarre da /etc/passwd file di righe di account contenenti lp o il tuo ID utente.
$ egrep '(lp|kdm:)' /etc/passwd

Esercizio III

Trova tutte le righe che contengono i nomi Evans o pittore nel file le persone .
$ egrep 'Evans|Maler' people
Trova tutte le righe che contengono i nomi fabbro , Smyth o Smythe nel file le persone .
$ egrep 'Sm(i|y)the?' people
Trova tutte le righe che contengono i nomi Marrone , Brown o Fonte nel file persone.
$ egrep 'Brow?e?n' people
Trova la riga contenente la stringa (amministratore), comprese le parentesi, nel file le persone .

$egrep '(Amministratore)'le persone

Trova la riga contenente il carattere * nel file persone.
$ egrep '*' people
Combina 5 e 6 sopra per trovare entrambe le espressioni.

$egrep '(Ammin)|*'le persone