Come usare grep per 2 linee diverse


15

Come posso cercare due frasi diverse quando sono su due righe diverse usando un singolo grepcomando?

Per esempio

Linea 1: questo è un dolce.

Linea 2: limone.

Ho usato questo ma nessun risultato

grep "sweet.*lemon" file_type

Risposte:


20

Per usare grepdue linee diverse, cerca entrambi i motivi

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

Oppure usa l'alternanza

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

Per ottenere la riga successiva dopo un modello, è possibile utilizzare l'opzione di contesto

$ grep -A1 sweet file_type
This is a sweet
lemon.

Ma se siete alla ricerca in modo esplicito per un modello più righe, è perché difficile greppensa in linee ... . Potrai .*prendere tutto tra "dolce" e "limone" sulla linea . Possiamo ottenere "lemon" sulla riga successiva -Pusando \nper abbinare la newline e dicendo che grepil file è nullo separato da -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

Appunti:

  • -EUsa espressioni regolari estese (per usare il |carattere per l'alternanza senza dover scappare)
  • -An Stampa linee aggiuntive dopo il motivo, dove n è il numero di linee finali da stampare
  • -PUsa espressioni regolari in stile perl ("sperimentale" in grep- install pcregrepinvece per un migliore supporto perl regex)
  • -zUsa il carattere null come separatore (fingendo solo in questo caso, ma grepprenderà la nostra parola per farlo)
  • -o stampa solo la parte corrispondente

Mentre il grep -zPcomando funzionerebbe in questo caso specifico (un file composto esattamente da due righe), in generale considererebbe qualsiasi file ordinario separato da una nuova riga come una singola riga, quindi scarica l'intero contenuto del file (se c'è una corrispondenza da qualche parte) o niente; di solito non è quello che la gente usa grep.
Marc van Leeuwen,

Sì, questo è utile solo con -o... modificato ...
Zanna,

Nel caso in cui venga provato su altre distro, potresti riscontrare un: grep: The -P and -z options cannot be combined- ad es. Grep (GNU grep) 2.5.1 su RHEL
Jason Pyeron,

6

Come questo:

grep "sweet\|lemon"

scusate ma questo corrisponderà esattamente "dolce | limone"
αғsнιη il

4
@KasiyA Questa linea funziona bene. grepper le opere di default in "modalità standard", in cui "i caratteri speciali", come |, +, *sono interpretati letteralmente a meno che stanno mascherati con un backslash. Vedi ad esempio questa risposta . Per usare il modo in cui sei probabilmente abituato, che i "caratteri speciali" devono essere mascherati per essere interpretati letteralmente, devi passare alla "modalità estesa" ( grep -E). Forse Madneon potrebbe approfondire un po 'di più le sue risposte, ad esempio a cosa avrebbero provato i PO ?
Henning Kockerbeck il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.