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.
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
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.
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.