使用 bash,如何计算过去 1 分钟内添加到文件的新行?
如果您想同时计算多个文件中最后 1 分钟的新行并获取输出,什么才是最明智的做法?
我尝试了一些方法,但找不到好的解决方案。
我可能会尝试使用编程语言来代替 Bash
答案1
使用wc -l
两次并减去结果。
before=$(wc -l < yourfile)
sleep 60
after=$(wc -l < yourfile)
let dif=after-before
echo "$dif"
您也可以只打印最后$dif
几行:
tail -n$dif yourfile
尽管可以同时添加更多行,但这里没有任何操作是原子的。
wc -l
如果您想跟踪增量变化(至少是添加的行数),只需记录每分钟的输出即可。但是,如果您事先不知道您将需要此功能,则无法执行此操作。除非每一行都有时间戳,否则您无法知道文件的哪一部分是何时添加的。
答案2
这是我的最终解决方案:
#!/bin/bash
for i in *access_log; do
(
before=$(wc -l < $i)
sleep 10
after=$(wc -l < $i)
let dif=after-before
echo "$i: $dif"
) &
done
答案3
{
tail -c 1 > /dev/null
sleep 60
wc -l
} < your-file
和ksh93
:
{ sleep 60; wc -l; } < your-file <#((EOF))
打开文件,查找末尾(在第一个读取并丢弃一个字节中),然后休眠 60 秒,然后调用wc -l
计算 1 分钟前位置和 ( 之间的换行符数量)新)文件末尾(如果更大)。
请注意,它仅读取这 60 秒内添加的部分。如果文件已被完全重写,则不会考虑文件原始部分中换行符数量的最终变化。
此外,它还会检查对原始文件的更改,即使该文件已被删除和/或已重新创建同名文件或链接到最初打开该文件的目录。
如果您想知道以何种速率将行添加到日志文件中,另一个选项是使用pv -l
with tail -f
:
for f in *access_log; do
tail -fn0 -- "$f" | pv -cN "$f" -ral > /dev/null &
done
wait
-ra
当前利率和平均利率。-l
所以比率以数量表示线每秒。