如何使用shell实时连续处理tail -f新行?
How to use shell to continuously process tail -f new lines in real time?
linux 服务器上有一个文件, 不定期 向其附加了新行。我需要处理新行,解析它并使用其他命令或脚本来处理它。定期检查文件是不可接受的,我需要一个 实时 解决方案。服务器上没有其他语言(Python、Perl)可用,只有 shell。
现在,我试图将新行分配给一个 shell 变量,然后对其进行处理。但是找不到一个好的方法来做到这一点。另一个问题是我在处理新行时需要依赖一些结果。例如,当我处理第 11 行时,可能需要第 5 行结果。所以之前需要一些变量来存储结果,我需要在循环中使用它们。
对我的情况有什么解决方案或更好的建议吗?
尝试:
tail -f filename | while read -r line; do
: # process the line
done
这将是实时的,除非线路被缓冲。如果缓冲困扰您,可以使用 stdbuf
等实用程序来缩小缓冲区。
你没有提到你的系统是否有awk。它是 Unix 系统的 POSIX 标准所要求的。如果你有它,它非常适合"calculating, replacing some characters",等等:
tail -f filename | awk 'awk code'
试试下面的代码
#!/bin/bash
process_new_line() {
local var= '' #declare some local variables here
read
while true
do
#process $REPLY
#The new line content is in the variable $REPLY
#store the result in the local variable according to your rules.
read
done
}
tail -f the_file | process_new_line
使用一个函数就可以解决你的问题。您可以使用局部变量来存储结果,$REPLY 保存新行内容。
linux 服务器上有一个文件, 不定期 向其附加了新行。我需要处理新行,解析它并使用其他命令或脚本来处理它。定期检查文件是不可接受的,我需要一个 实时 解决方案。服务器上没有其他语言(Python、Perl)可用,只有 shell。
现在,我试图将新行分配给一个 shell 变量,然后对其进行处理。但是找不到一个好的方法来做到这一点。另一个问题是我在处理新行时需要依赖一些结果。例如,当我处理第 11 行时,可能需要第 5 行结果。所以之前需要一些变量来存储结果,我需要在循环中使用它们。
对我的情况有什么解决方案或更好的建议吗?
尝试:
tail -f filename | while read -r line; do
: # process the line
done
这将是实时的,除非线路被缓冲。如果缓冲困扰您,可以使用 stdbuf
等实用程序来缩小缓冲区。
你没有提到你的系统是否有awk。它是 Unix 系统的 POSIX 标准所要求的。如果你有它,它非常适合"calculating, replacing some characters",等等:
tail -f filename | awk 'awk code'
试试下面的代码
#!/bin/bash
process_new_line() {
local var= '' #declare some local variables here
read
while true
do
#process $REPLY
#The new line content is in the variable $REPLY
#store the result in the local variable according to your rules.
read
done
}
tail -f the_file | process_new_line
使用一个函数就可以解决你的问题。您可以使用局部变量来存储结果,$REPLY 保存新行内容。