ЧТЕНИЕ stderr изнутри Awk - PullRequest
       18

ЧТЕНИЕ stderr изнутри Awk

3 голосов
/ 24 марта 2010

Я хочу хранить отладочную информацию SSH отдельно (и регистрируется) от других входных данных. Однако, если я просто перенаправлю stderr в файл журнала, я рискну объединить вывод из SSH и вывод из удаленного процесса на хост-машине (чтобы мог отправить что-то в stderr):

$ ssh -v somemachine 2> file.log

Итак, я хочу отфильтровать только те строки, которые соответствуют «debug1»:

$ ssh -v somemachine | awk '/debug1/ {print > "file.log"; next} {print}'

Хорошо, пока отладочный вывод ssh идет в stderr. Итак ...

$ ssh -v somemachine 2>& | awk '/debug1/ {print > "file.log"; next} {print}'

Свернул снова! Я не хочу смешивать стандартный вывод и стандартный вывод. BAD!

Что делает такой ребенок, как я? Я собирался пойти по пути именованных каналов или чего-то подобного, но на самом деле все, что мне нужно знать, это как получить awk, чтобы соответствовать шаблонам ТОЛЬКО от stderr.

Ответы [ 3 ]

6 голосов
/ 24 марта 2010

Awk на самом деле не может видеть ввод от stderr - труба только трубы stdout. Тебе придётся обойтись с перенаправлением, чтобы делать то, что ты хочешь. Ответ очень прост, если вам не важно, что находится на stdout:

(ssh -v hostname somecommand > /dev/null) 2>&1 | awk '/debug1/ ...'

Если вы заботитесь о том, что находится на stdout, вам придется сделать что-то более сложное. Я считаю, что это будет работать:

((ssh -v hostname somecommand 1>&3) 2>&1 | awk '/debug1/ ...' 1>&2) 3>&1

В порядке, те перенаправления:

  • перенаправить исходный стандартный вывод в сторону файлового дескриптора 3
  • перенаправить stderr на стандартный вывод для awk, чтобы увидеть
  • перенаправить стандартный вывод обратно в stderr (где он был изначально)
  • перенаправить файловый дескриптор 3 обратно на стандартный вывод (где он был изначально)

P.S. Это решение зависит от sh / bash. Джонатан Леффлер говорит, что это должно работать и с ksh. Если вы используете другую оболочку, вы можете попытаться найти синтаксис для выполнения с ней тех же перенаправлений, но если эта другая оболочка - csh / tcsh, вы, вероятно, просто облажались. Общеизвестно, что cshells плохо работают с stdout / stderr.

0 голосов
/ 14 августа 2012

Спасибо большое ..! Я использовал ls с awk и не смог перенаправить.

Я использовал:

FILES=`ls -lrt *.txt | awk '{print $9}' 2>> /dev/null`

Сейчас:

FILES=`ls -lrt *.txt 2>> /dev/null | awk '{print $9}'`
0 голосов
/ 24 марта 2010

Попробуйте (без подоболочек):

{ ssh -v somemachine 2>&1 1>&3- | awk '/debug1/ {print > "file.log"; next} {print}'; } 3>&1

или

{ ssh -v somemachine 2>&1 1>&3- | grep debug1 > file.log; } 3>&1

См. это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...