我有一个日志,该日志在要获取的字符串旁边的行中产生大量文本。基本上它包含以下内容:
Render camera: $Camera001 outputfile: "test.jpg" outputsize:[1920,1080] vfb:off outputHDRbitmap: true
我有个大命令:
bla bla bla packet 12 out of 432 bla bla
我想将输出重定向到文件。
为什么tail -f log.txt |grep --line-buffered "packet" |sed -n 's/.*\(packet [0-9]* out of [0-9]*\).*/\1/p' |while read log; do echo "$(date +%F_%H:%m:%S:%N) $log" ; done
不起作用?我究竟做错了什么?
答案 0 :(得分:0)
此问题的原因是sed命令将输出数据保存在缓冲区中。通过使用--line-buffered参数,对下一个管道sed命令帮助使用-u参数,可以避免grep命令(管道链中的第二个)出现数据同步问题。该命令应为:
tail -f log.txt | grep --line-buffered "packet" | sed -n -u 's/.*\(packet [0-9]* out of [0-9]*\).*/\1/p' | while read log; do echo "$(date +%F_%H:%m:%S:%N) $log" >> outputfile.log ; done
sed -n -u 's /。([0-9] 中的数据包[0-9] )。 / \ 1 / p'
代替
sed -n's /。([0-9] 中的数据包[0-9] )。 / \ 1 / p'
通过此更改,重定向到文件应该可以工作。