计算文件最后 1 分钟的新行数

计算文件最后 1 分钟的新行数

使用 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 -lwith tail -f

for f in *access_log; do
  tail -fn0 -- "$f" | pv -cN "$f" -ral > /dev/null &
done
wait

-ra当前利率和平均利率。-l所以比率以数量表示线每秒。

相关内容