Există o modalitate mai simplă de a face acest lucru? grep -v foo file | grep -v bar

Probabil că există modalități foarte elegante de a face acest lucru cu egrep, dar cum să mergeți cu grep vechi simplu?

EDIT: grep -v "foo\|bar" file pare să funcționeze numai cu GNU grep. Eu „m pe Solaris. Orice soluție pentru asta?

Comentarii

  • Întrebare ciudată, deoarece în primul exemplu faceți ȘI potrivire, iar în al doilea faceți SAU potrivire . Rezultatul va fi același numai în condiții foarte specifice.
  • Nu, nu chiar. În al doilea exemplu, semnalizatorul -v este o negație. not(A or B) == not(A) and not(B)

Răspuns

Puteți avea mai multe teste într-un comandă grep simplă prin trecerea fiecărei expresii cu un argument -e în loc de primul argument de non-opțiune așa cum vedeți în mod normal:

$ grep -v -e foo -e bar file 

Aceasta spune același lucru pe care îl face comanda dvs.: imprimați linii din file care nu conțin nici „foo” și nici „bar” .

Rețineți că eliminarea -v inversează complet acest lucru; schimbă și operația logică! Veți obține toate liniile care conțin „foo” sau „bară”.

Răspuns

grep -Ev "word1|word2" ar trebui să funcționeze bine

Comentarii

  • Ca alternativă, puteți utiliza egrep și lăsați bara inversă pentru caracter de țeavă: egrep -v 'word1|word2
  • Se pare că acest lucru nu funcționează cu grep Solaris. Am instalat grep-ul GNU și am funcționat perfect. ' Voi edita întrebarea mea pentru a o face specifică Solaris.
  • @rahmu \| este un grep GNU extensie, dar puteți realiza același lucru într-un mod portabil cu -E și cu operatorul |.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *