не могли бы вы использовать 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 / \ S =. * //; p} '| stdbuf -o0 awk '! seen [$ 0] ++' >> outfile.txt
man sed;
-u, --unbuffered
загружать минимальные объемы данных из входных файлов и очищать выходные данные { {1}} буферизует чаще
man 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
Чтобы удалить bar-version-someFirstLevelFolder
, вам нужно использовать опцию --strip-components=1
в tar
. Таким образом, ваш плейбук должен выглядеть как
- name: Extract archive
unarchive:
src: file.tar.gz
dest: /foo/bar
extra_opts: [--strip-components=1]