gim*_*cpu 11 linux unix awk command-line logging
我正在尝试通过管道将 tail -f 导入 awk 以实时监视日志文件,但根据示例,应该没有问题,但我无法使其正常工作。
这是我正在运行的命令
tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'
Run Code Online (Sandbox Code Playgroud)
但是当我使用 nano add a line 编辑我的文件时,它不是实时打印的,如果我直接运行 awk 命令,我的新行会出现在结果中。
Joh*_*024 14
您不会实时看到它,因为为了提高效率,管道被缓冲。 tail -f
在将输出传递给awk
.
解决方法是使用 unbuffer 命令,它是 expect 包的一部分:
unbuffer tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'
Run Code Online (Sandbox Code Playgroud)
这tail
让人误以为它正在写入交互式终端。因此,它不会缓冲。
有关更多信息,请参阅https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe
或者,如果您有 GNU coreutils 7.5 或更高版本,则可以使用 stdbuf 命令禁用输出缓冲:
stdbuf -o0 tail -f logfile.log | awk -F" " '{print $1, $2, $7, $8}'
Run Code Online (Sandbox Code Playgroud)
@John1024 的替代答案不太正确,因为stdbuf -o0
前缀放错了位置。它属于awk
命令的前缀,而不是tail -f
命令,所以正确的命令应该是:
tail -f logfile.log | stdbuf -o0 awk -F" " '{print $1, $2, $7, $8}'
Run Code Online (Sandbox Code Playgroud)
这对我有用,但只有在我找到可以合作的 awk 版本之后。所以请注意,并非所有版本的 awk 都允许这样做! 我不得不尝试 nawk、gawk、mawk 等,直到找到一个有效的方法。如果您需要该特定命令字符串按所写的方式运行,请继续尝试各种 awk/gawk/mawk 版本,方法是明确说明 awk 二进制文件的路径,甚至下载其他版本,直到找到一个有效的版本。
小智 5
在 Ubuntu 20.10 上,awk
链接到mawk
版本 1.3.4,
添加-W interactive
。例如tail -f $file | awk -W interactive '{print}'
(感谢其他人的回答,他们的回答让我阅读了寻找 的手册页buffer
。)
归档时间: |
|
查看次数: |
21129 次 |
最近记录: |