Я хочу выполнить поиск в файле журнала (в режиме реального времени) содержимого 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