web-dev-qa-db-fra.com

Comment grep et exécuter une commande (pour chaque match)

Comment grep dans un fichier et exécuter pour chaque match une commande?

Fichier:

foo
bar
42
foo
bar

Je veux exécuter pour exécuter par exemple date pour chaque correspondance sur foo.

Après essayer ne fonctionne pas:

grep file foo | date %s.%N

Comment faire ça?

30
Razer
grep file foo | while read line ; do echo "$line" | date %s.%N ; done

Plus lisiblement dans un script:

grep file foo | while read line
do
    echo "$line" | date %s.%N
done

read insère la valeur dans la variable $line et l'instruction while exécute le corps de la boucle entre do et done. Comme la valeur est maintenant dans une variable et non pas dans stdin, j'ai utilisé echo pour le repousser dans stdin, mais vous pouvez simplement faire date %s.%N "$line", en supposant que la date fonctionne de cette façon.

Évitez d’utiliser for line in `grep file foo`, qui est similaire, car for saute toujours sur les espaces et cela devient un cauchemar pour la lecture de listes de fichiers:

 find . -iname "*blah*.dat" | while read filename; do ....

échouerait avec for.

31
Phil H

Ce dont vous avez vraiment besoin, c’est d’une commande xargs. http://en.wikipedia.org/wiki/Xargs

grep file foo | xargs date %s.%N

exemple de correspondance de certains fichiers et de conversion de correspondances en chemin Windows complet dans l'environnement Cygwin

$ find $(pwd) -type f -exec ls -1 {} \; | grep '\(_en\|_es\|_zh\)\.\(path\)$' | xargs cygpath -w
11
Marko Kukovec
grep command_string file | sh - 
0
James

Pourrait être utile à quelqu'un:

git branch | grep -v 'master' | xargs git branch -D

Cela supprime toutes les branches sauf le maître

0
Ced