Почему GNU GAWK 3.1.5 на Solaris 5.10 не соответствует шаблону? - PullRequest
0 голосов
/ 21 марта 2019

Я анализирую вывод SFTP 'ls -l' через awk, чтобы распечатать результаты только для существующих каталогов (да, я знаю, что Python лучше, а синтаксический анализ ls не очень хорошая идея, технические ограничения задачи).Вот вывод, который я получаю:

bash-3.2$ sftp my-server < batch_ls.sftp | gawk 'BEGIN{d=-1;wd=1}/^sftp> c/{d++;wd=0}/Coul/{wd=1}wd==0{print $0,d,wd}'

Connecting to my-server...
sftp> cd /ik/sftp_source/alpha 0 0
sftp> ls -l 0 0
drwxr-xr-x    2 65740    102          4096 Mar 21 05:15 . 0 0
drwxr-xr-x    4 65740    102          4096 Mar 21 04:21 .. 0 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 0452984832A8.234 0 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 0989855744A8.234 0 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 1258291200A8.234 0 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 1862270976A8.234 0 0
sftp> cd /ik/sftp_source/belta 1 0
Couldn't canonicalise: No such file or directory
sftp> ls -l 1 0
drwxr-xr-x    2 65740    102          4096 Mar 21 05:15 . 1 0
drwxr-xr-x    4 65740    102          4096 Mar 21 04:21 .. 1 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 0452984832A8.234 1 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 0989855744A8.234 1 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 1258291200A8.234 1 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 1862270976A8.234 1 0
sftp> cd /ik/sftp_source/delta 2 0
sftp> ls -l 2 0
drwxr-xr-x    2 65740    102          4096 Mar 21 05:15 . 2 0
drwxr-xr-x    4 65740    102          4096 Mar 21 04:21 .. 2 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 0335544320A8.234 2 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 0419430400A8.234 2 0
-rw-r--r--    1 65740    102            35 Mar 21 05:15 1073741824A8.234 2 0
-rw-r--r--    1 65740    102            34 Mar 21 05:15 1392508928A8.234 2 0

Здесь:

  • d - счетчик каталогов

  • wd - это флаг, чтобы узнать, обрабатываем ли мы вывод правильного каталога, или нам не удалось «cd» перейти к следующему, а мы все еще в предыдущем.

Похоже, что он не улавливает часть строки "Не удалось".Может ли кто-нибудь помочь мне найти лучшее решение и объяснить, почему это происходит?Большое спасибо!

PS Обратите внимание, что строка "Не удалось канонизировать ..." не имеет значений d и wd в конце.

1 Ответ

4 голосов
/ 21 марта 2019

Часть команды после канала не может видеть эти строки, потому что вы перенаправляете stdout, но sftp отправляет ошибки на stderr.

Если вы хотите перенаправить их оба наgawk, вы должны добавить 2>&1 к вашей команде:

bash-3.2$ sftp my-server < batch_ls.sftp 2>&1 | gawk 'BEGIN{d=-1;wd=1}/^sftp> c/{d++;wd=0}/Coul/{wd=1}wd==0{print $0,d,wd}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...