2013-12-03 2 views
12

У меня есть Баш скрипт, который имеет следующие две команды:как перенаправить вывод нескольких команд в один файл

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

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

Как я могу сделать вывод обеих команд будут направлены в тот же файл.

+1

Имейте в виду, что если обе команды работают в фоновом режиме, вы не можете предсказать как вывод из двух команд будет чередоваться в '/ some/file'. – chepner

ответ

13

Примечание вы можете уменьшить количество SSH звонков:

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

пример:

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

как я могу получить pid этого? – user2864207

+0

Если вы используете все это ('> outputfile &'), pid будет в '$!' –

+0

да, но мой ssh ​​находится внутри двух для циклов, $! не дает мне права pids – user2864207

21

Либо использовать 'Append' с >> или использовать фигурные скобки, чтобы охватить переназначения ввода/вывода, или (иногда) использовать exec:

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

или:

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

или:

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

После exec стандартный вывод сценария т в целом составляет /some/file. Я редко использую эту технику; Вместо этого я обычно использую метод { ...; }.

Примечание: вам нужно быть осторожным с обозначением скобок. То, что я показал, будет работать. Пытаясь сгладить его на одну строку, вам нужно обработать {, как если бы это была команда (за которой следует пробел, например), а также для обработки }, как если бы это была команда. У вас должен быть терминатор команд до }. Я использовал новую строку, но & для фона или ; тоже будет работать.

Таким образом:

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

Я также не рассматривал вопрос о том, почему у вас есть два отдельных tail -f операций, запущенных на одном удаленный файл и почему вы не используете awk власти как супер- grep, чтобы справиться с этим все в одном - я только обратился к поверхностному вопросу о том, как перенаправить ввод/вывод двух команд в один файл.

+0

Ничего из этого не работает. Я также пробовал {command1; command 2}>/some/file, но он не работает – user2864207

+2

@ user2864207, обратите внимание, что однострочное использование '{list of commands; внутри брекетов; } '** должен заканчиваться точкой с запятой, как показано в последнем предложении Джонатана. –

+0

да да, извините, я этого не написал – user2864207

2

Лучший ответ на это, чтобы, вероятно, избавиться от ssh .... | grep ... линии, и изменить awk сценарий в другой команде, чтобы добавить функциональность вы получаете от команды grep ...

Это избавит любых проблем с перемежением в качестве бонусного побочного эффекта.

+0

Я не могу избавиться от ssh .. | линия grep. Это целая точка сценария – user2864207

Смежные вопросы