Как перенаправить скриптовый awk-скрипт - PullRequest
1 голос
/ 18 января 2020

У меня проблема с перенаправлением stdout из скрипта awk.

Этот скрипт хорошо работает:

ping dns.google | awk '{print(substr($7,5));}'

И вывод выводится по очереди за раз.

Теперь я хочу перенаправить вывод в файл путем перенаправления:

ping dns.google | awk '{print(substr($7,5));}' >> latency.log

Это не работает и latency.log пусто.

Я пытался быть умным, и перенаправьте вывод внутри скрипта awk следующим образом:

ping dns.google | awk '{print(substr($7,5) >> "latency.log");}'

Снова latency.log пусто.

Моя awk версия:

$ awk -V
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2016 Free Software Foundation.

Моя Linux версия:

$ cat /etc/*release
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19.3
DISTRIB_CODENAME=tricia
DISTRIB_DESCRIPTION="Linux Mint 19.3 Tricia"
NAME="Linux Mint"
VERSION="19.3 (Tricia)"
ID=linuxmint
ID_LIKE=ubuntu
PRETTY_NAME="Linux Mint 19.3"
VERSION_ID="19.3"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.ubuntu.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=tricia
UBUNTU_CODENAME=bionic

Как перенаправить вывод awk в файл?

1 Ответ

2 голосов
/ 18 января 2020

Конвейер процесса с перенаправлением неинтерактивен (то есть не связан с терминалом) и, таким образом, awk s STDOUT буферизуется и не доставляется в ваш файл, пока буфер канала не накапливается достаточно для очистки.

Один из способов обойти это - использовать unbuffer. Чтобы использовать его в конвейере, добавьте флаг -p:

ping dns.google | unbuffer -p awk '{print(substr($7,5));}' >> latency.log

Как правило, вы найдете команду unbuffer в пакете expect.

Другой альтернативой является используйте stdbuf:

ping dns.google | stdbuf -oL awk '{print(substr($7,5));}' >> latency.log
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...