2016-04-25 21 views
0

Ich versuche, Zeilen, die bestimmte Zeichen enthalten, zu egrep. Wenn ich einzelne egrep ausführen, funktioniert es gutegrep mit dynamischem Ausgang

egrep -w -h -R 'name' /path/file1.txt > /path/file2.txt 

Aber wenn ich mehrere egrep mit for-Schleife durchzuführen, waren die Ausgabe alle leer.

Ich überprüft die Ausgabedateien durch einzelne egrep, es sollte einige Informationen in jeder der Ausgabedatei haben. Ich mache hier etwas falsch, aber ich konnte nicht herausfinden, was es ist.

Vielen Dank für Ihre Hilfe!

+0

Welche Shell verwenden Sie? Bash sollte keine geschweiften Klammern um die Liste herum benötigen, und Sie müssten "$ i" statt "i" verwenden. – jkiiski

+0

Ich benutze Bash. Ich habe gerade versucht, das "i" durch "$ i" zu ersetzen, und es hat funktioniert !! DANKE!!! –

Antwort

2

Das ist extrem ineffizient, da Sie grep aufrufen und die gesamte Eingabedatei einmal pro Name analysieren (siehe https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice).

Lesen Sie die Eingabedatei einmal:

awk -v names='Adam Bob Chuck Dan Eli Frank' ' 
    BEGIN { split(names,list) } 
    { 
     for (i in list) { 
      if ($0 ~ ("\\<" list[i] "\\>")) { 
       print > ("/path/name" i ".txt") 
      } 
     } 
    } 
' /path/file1.txt 

Die oben verwendet GNU awk für Wortgrenzen (\< und \>), mit anderen awks würden Sie müssen nur den regulären Ausdruck Vergleich zu ändern: $0 ~ ("(^|[^[:alnum:]_])" list[i] "([^[:alnum:]_]|$)").