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?
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
.
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
grep command_string file | sh -
Pourrait être utile à quelqu'un:
git branch | grep -v 'master' | xargs git branch -D
Cela supprime toutes les branches sauf le maître