Ich habe eine Reihe von Zeilen aus einer Datei abgerufen, nachdem der Befehl grep wie folgt ausgeführt wurde:
var=`grep xyz abc.txt`
Nehmen wir an, ich habe 10 Zeilen, die als Ergebnis aus xyz bestehen.
Jetzt muss ich jede Zeile verarbeiten, die ich als Ergebnis des Befehls grep erhalten habe. Wie gehe ich vor?
grep -o
für solche Dinge. Das-o
Flag gibt nur den übereinstimmenden Text mit einer Übereinstimmung pro Ausgabezeile zurück. (Es ist nicht erschöpfend,echo aaa |grep 'a*'
gibt Ihnen also nur "aaa" und lässt die drei Teilübereinstimmungen "", "a" und "aa" weg))Antworten:
Eine der einfachen Möglichkeiten besteht darin, die Ausgabe nicht in einer Variablen zu speichern, sondern sie direkt mit einer while / read-Schleife zu durchlaufen.
Etwas wie:
Es gibt Variationen dieses Schemas, je nachdem, wonach Sie suchen.
Wenn Sie Variablen innerhalb der Schleife ändern müssen (und diese Änderung außerhalb der Schleife sichtbar sein soll), können Sie die Prozessersetzung verwenden, wie in der Antwort von fedorqui angegeben :
quelle
while read p || [[ -n $p ]]; do ...
(ausgeliehen von stackoverflow.com/questions/1521462/… )Sie können die folgende
while read
Schleife ausführen, die vom Ergebnis desgrep
Befehls mit der sogenannten Prozesssubstitution gespeist wird :Auf diese Weise müssen Sie das Ergebnis nicht in einer Variablen speichern, sondern die Ausgabe direkt in die Schleife "einspeisen".
Beachten Sie die Verwendung von
IFS=
undread -r
gemäß den Empfehlungen in BashFAQ / 001: Wie kann ich eine Datei (Datenstrom, Variable) Zeile für Zeile (und / oder Feld für Feld) lesen? ::Die Prozessersetzung wird auf der Seite mit den Bash-Hackern erläutert :
quelle
for
Version angestrichen . Es wurde versucht, eine Schleife"${$(grep xyz abc.txt)[@]}"
wie in stackoverflow.com/a/14588210/1983854 durchzuführen , konnte dies jedoch nicht. Also lasse ich einfach die erste Version.zsh
, wo diese Art der Verschachtelung wahrscheinlich funktioniert).while IFS= read -r result <&3
unddone 3< <(grep ...
Ich würde vorschlagen, hier awk anstelle von grep + etwas anderes zu verwenden.
awk '$0~/xyz/{ //your code goes here}' abc.txt
quelle
//your code goes here
?Ohne Iteration mit der Option --line-buffered grep:
Beispiel aus dem wirklichen Leben mit einem Symfony PHP Framework-Router-Debug-Befehl ouput, um alle "API" -bezogenen Routen zu erfassen:
quelle
tail -f some.log
in meinem Fall) ...Oft spielt die Reihenfolge der Verarbeitung keine Rolle. GNU Parallel ist für diese Situation gemacht:
Wenn Ihre Verarbeitung eher wie folgt ist:
und
myprogram
ist langsam dann kannst du laufen:quelle
Durchlaufen Sie die grep-Ergebnisse mit einer while / read-Schleife. Mögen:
quelle
Für diejenigen, die einen Einzeiler suchen:
quelle