ubuntuusers.de

Reihenfolge gepipeter Programmaufrufe nach xargs? "xargs (grep | tail)" statt "(xargs grep) | tail"

Status: Gelöst | Ubuntu-Version: Kubuntu 11.04 (Natty Narwhal)
Antworten |

GoreToffel

Anmeldungsdatum:
30. April 2008

Beiträge: 55

Ich krieg's nicht hin, xargs mitzuteilen, dass ich für jede Datei aus einem ls ein grep und ein tail durchführen möchte und nicht ein tail das mir einmal den gesamten output aller greps beschneidet. Quasi ein:

1
ls * | xargs (grep -A 7 'Suchmuster' | tail -n 5)

(Die Klammern dienen nur zur Klarstellung, was genau gewollt ist.)

Hab zum Befehle gruppieren {}, ' ' und () probiert, und im man xargs find ich nichts dazu - hoffe, hier kann einer meine Neugier befriedigen... 😉

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

1
ls | xargs -i sh -c 'grep -A7 "Suchmuster" "$0"| tail -n5' {}

GoreToffel

(Themenstarter)

Anmeldungsdatum:
30. April 2008

Beiträge: 55

Funktioniert, danke - jetzt muss ich nur noch nachvollziehen, warum, aber das schaff ich, hoff ich... 😉

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Mit Verlaub, die Ausgabe von ls in ein xargs pipen macht man ja auch nicht !
(→ http://mywiki.wooledge.org/BashGuide/Practices#Don.27t_Ever_Do_These )

Was Du willst ist dies:

for f in * ; do   grep -A 7 'Suchmuster' "$f" | tail -n5 ;   done

Das geht nicht krachen, wenn ein Leerzeichen, Linefeed oder sonst was im Dateinamen vorkommt.

LG,

track

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

das ls * wird nur funktionieren, wenn im aktuellen Verzeichnis keine Unterverzeichnisse sind. Auch bei Dateinamen mit Leerzeichen drin etc. wird es nicht gehen.

Die xargs-Geschichten macht man am Besten mit find. Den Ärger xargs und einem Piplining kann man auch anders umgehen

find . -type f | while  read input;
do
  grep ....  | tail ....
done;

GoreToffel

(Themenstarter)

Anmeldungsdatum:
30. April 2008

Beiträge: 55

Danke euch beiden auch - wenn ich sowas mal in ein Script schreib, erinner ich mich hoffentlich dran. Hier ging's tatsächlich nur um einige ganz Linux-konform benannte Dateien, die ich per Kommandozeile ansprechen wollte. Das hat auch mit dem ls funktioniert... 😉

Antworten |