web-dev-qa-db-fra.com

comment rediriger la sortie de plusieurs commandes vers un seul fichier

j'ai un script bash, qui a les deux commandes suivantes:

ssh Host tail -f /some/file | awk ..... > /some/file &

ssh Host tail -f /some/file | grep .... > /some/file &

Comment puis-je faire en sorte que la sortie des deux commandes soit dirigée vers le même fichier.

20
user2864207

Notez que vous pouvez réduire le nombre d'appels ssh:

{  ssh Host tail -f /some/file | 
     tee >(awk ...) >(grep ...) >/dev/null
} > /some/file &

exemple:

{ echo foobar | tee >(sed 's/foo/FOO/') >(sed 's/bar/BAR/') > /dev/null; } > outputfile
cat outputfile 
fooBAR
FOObar
17
glenn jackman

Soit utilisez 'append' avec >> ou utilisez des accolades pour englober les redirections d'E/S, ou (occasionnellement) utilisez exec:

ssh Host tail -f /some/file | awk ..... >  /some/file &
ssh Host tail -f /some/file | grep .... >> /some/file &

ou:

{
ssh Host tail -f /some/file | awk ..... &
ssh Host tail -f /some/file | grep .... &
} > /some/file

ou:

exec > /some/file
ssh Host tail -f /some/file | awk ..... &
ssh Host tail -f /some/file | grep .... &

Après le exec, la sortie standard du script dans son ensemble va à /some/file. J'utilise rarement cette technique; J'utilise habituellement le { ...; } technique à la place.

Remarque: Vous devez être prudent avec la notation des accolades. Ce que j'ai montré fonctionnera. Essayer de l'aplatir sur une seule ligne vous oblige à traiter le { comme s'il s'agissait d'une commande (suivie d'un espace, par exemple) et aussi pour traiter le } comme s'il s'agissait d'une commande. Vous devez avoir un terminateur de commande avant le } - J'ai utilisé une nouvelle ligne, mais un & pour le fond ou ; fonctionnerait aussi.

Donc:

{ command1;  command2;  } >/some/file
{ command1 & command2 & } >/some/file

Je n'ai pas non plus abordé la question de savoir pourquoi vous avez deux tail -f opérations exécutées sur un seul fichier distant et pourquoi vous n'utilisez pas awk power en tant que super -grep pour tout gérer en un - je n'ai abordé que la question de surface de savoir comment rediriger les E/S des deux commandes vers un seul fichier.

30
Jonathan Leffler

La meilleure réponse à cela est probablement de se débarrasser du ssh .... | grep ... line, et modifiez le script awk dans l'autre commande pour ajouter la fonctionnalité que vous obteniez de la commande grep ...

Cela éliminera tous les problèmes d'entrelacement comme effet secondaire bonus.

2
twalberg