Come realizzare una barra verticale lavorare in grep?


10

Ecco un esempio di una riga di comando grep che ho provato:

grep '(565172|565173|565175)' /var/log/cups/error_log

Non produce alcun output, anche se tutti e 3 i valori sono nel file più volte.

Ho provato a sfuggire alle barre e questo ha migliorato un po 'le cose: è stato rilevato il valore medio ma non il primo o l'ultimo.

grep '(565172\|565173\|565175)' /var/log/cups/error_log

Ho anche provato doppie fughe e sono tornato a non ottenere risultati.

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

Che cosa sto facendo di sbagliato? Grazie.

Risposte:


14

La sintassi che stai cercando di usare appartiene a espressioni regolari estese, quindi la risposta è molto semplice, usa egrepo includi il -Eflag.


17

Quello che stai incontrando è la differenza tra espressioni regolari di base ed estese. Dalla pagina del manuale di grep:

Nelle espressioni regolari di base i meta-caratteri?, +, {, |, (E) perdono il loro significato speciale; utilizzare invece le versioni rovesciate \ ?, +, {, \ |, (e).

Pertanto, è possibile effettuare una delle seguenti operazioni:

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

o

grep -E '(565172|565173|565175)' /var/log/cups/error_log

Il flag -E attiva espressioni regolari "estese". GNU grep supporta anche espressioni regolari compatibili con perl.


Mi sono distratto quando ho scritto la mia risposta. Sembra che Adam mi abbia battuto a pugni.
Steven D,

4
Ma hai aggiunto alla spiegazione - il motivo per cui non sono riuscito a farlo funzionare è che stavo sfuggendo solo al bar e non alle parentesi.
Mark Ransom,

1
Non sapevo che puoi sfuggire ancora una volta a questi personaggi speciali per ottenere lo stesso risultato, quindi +1 per te!
Adam Byrtek,

1
Quanto sopra è la serie di scambi più civile che abbia mai visto in SO / SE.
mike rodent,
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.