2009-10-03 1 views
14

Supponiamo di avere più stringhe: str1 e str2 e str3.grep egrep multiple-string

  • Come trovare le linee che hanno tutte le stringhe?
  • Come trovare le linee che possono avere qualcuno di loro?
  • E come trovare le linee che hanno str1 e uno di str2 e str3 [ma non entrambi?]?

risposta

-2

Personalmente, lo faccio in perl piuttosto che provare a mettere insieme qualcosa con grep.

Ad esempio, per il primo:

while (<FILE>) 
{ 
    next if ! m/pattern1/; 
    next if ! m/pattern2/; 
    next if ! m/pattern3/; 

    print $_; 
} 
+3

-1: La ricerca non lo è: qual è lo strumento migliore per farlo, ma come faccio a farlo con grep. – quosoo

+3

E la risposta è "Non farlo con grep, impazzisci" –

+0

@quosoo: tra i programmatori Unix, "grep" può riferirsi specificamente al programma grep o al problema generale di cercare un corpo di testo per stringhe o motivi. Non è chiaro quale sia l'uso di Tim, quindi penso che la risposta di Paul Tomblin sia giusta. –

8

Non si può ragionevolmente fare il "tutto" o "questo oltre a uno di quei" casi perché grep non supporta lookahead. Usa Perl. Per il caso "qualsiasi", è egrep '(str1|str2|str3)' file.

Il modo irragionevole per fare il caso "tutto" è:

egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file 

cioè a costruire le permutazioni. Questa è, ovviamente, una cosa ridicola da fare.

Per il "questo oltre a uno di quelli", simile:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file 
27

Questo appare come tre domande. Il modo più semplice per mettere insieme questi tipi di espressioni è con pipe multiple. Non c'è vergogna, soprattutto perché un'espressione regolare (usando egrep) sarebbe sgraziata dal momento che sembra implicare che si desidera l'indipendenza dall'ordine.

Così, al fine,

  1. grep str1 | grep str2 | grep str3

  2. egrep '(str1 | str2 | str3)'

  3. grep str1 | egrep '(str2 | str3)'

si può fare la "e" forma in modo indipendente ordine utilizzando egrep, ma penso che sarà più facile da ricordare di fare ordine ands indipendenti utilizzando greps convogliato e ordinare indipendentemente o usando espressioni regolari.

+1

Ben fatto. +1 –

+0

3 non soddisfa il requisito "ma non entrambi", ma tale requisito è difficile da soddisfare. Avrai bisogno di ciascun lato dell'alternanza per avere un prefisso e un suffisso accuratamente predisposti che escluda l'altra stringa dall'apparire in qualsiasi altro punto della linea. –

+0

@ Michael E: il bit 'ma non entrambi' è in corsivo e ha un punto interrogativo dopo di esso perché quando ho modificato la domanda, non ero sicuro di cosa fosse il mittente. @Groundhog ha scritto la sua (buona) risposta prima di perfezionare/rivedere la domanda con un commento/emendamento che dovrebbe, forse, essere rimosso. –

3

grep -E --color "stringa1 | string2 | string3 ...."

ad esempio per trovare se il nostro sistema utilizzando AMD (SVM) o Intel (VMX) e se è a 64 bit (lm) lm sta per lungo Mode- che significa 64bit ...

comando di esempio:

grep -E --color "lm | SVM | VMX"/proc/cpuinfo

-E è necessario per trova più stringhe