Комбинированные команды Linux не записывают outfile.txt

Комбинированные команды Linux не записывают outfile.txt

Я хочу выполнить поиск в файле журнала (в режиме реального времени) содержимого msg="yxyxyx", а затем записать уникальные значения в outfile.txt

Я написал это:

tail -f /var/log/firewall.log | sed -n '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | awk '!seen[$0]++' >> outfile.txt

Outfile создан, но пуст. Пишет в консоль отлично, без части >> outfile.txt.

Спасибо!

решение1

можете ли вы использовать stdbuf -oL или stdbuf -o0 перед командой awk, как показано ниже;

tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

tail -f firewall.log | sed -nu '/msg=/{s/.msg=//;с/\С=.*//;p}' | stdbuf -o0 awk '!seen[$0]++' >> outfile.txt

человек сед;

-u, --небуферизованный

загружать минимальные объемы данных из входных файлов и чаще очищать выходные буферы

человек stdbuf;

stdbuf - Запустить КОМАНДУ с измененными операциями буферизации для ее стандартных потоков.

-o, --output=MODE настроить буферизацию стандартного выходного потока

Если MODE равен 'L', соответствующий поток будет буферизирован построчно. Эта опция недопустима для стандартного ввода.

Если MODE равен «0», соответствующий поток не будет буферизирован.

Например;

сначала запустите это;

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

запустите это на другом терминале; echo msg="1" >> firewall.log, вывод, как показано ниже;

user@h$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt
1

запустить еще раз то же самое echo msg="1" >> firewall.log, вывод не изменился;

После запуска этого ; echo msg="2" >> firewall.log, вывод будет таким, как показано ниже;

user@host$ tail -f firewall.log | sed -nu '/msg=/{s/.*msg=//;s/\S*=.*//;p}' | stdbuf -oL awk '!seen[$0]++' >> outfile.txt

user@host$ cat outfile.txt

1
2

Связанный контент