如何监视bash shell中每秒添加到文件的平均行数?

时间:2016-11-02 02:07:07

标签: bash shell unix

我希望监控将行添加到bash shell中的日志文件的平均速率。

我当前可以通过命令

监控文件中每行的行数
watch -n 1 'wc -l log.txt'

然而,当我更喜欢费率时,这给了我总行数。换句话说,我想要一个命令,每次经常输出自执行命令以来已经添加到文件中的行数除以命令运行的秒数。

3 个答案:

答案 0 :(得分:4)

对于每秒粗略计算的行数,请尝试:

tail -f log.txt | { count=0; old=$(date +%s); while read line; do ((count++)); s=$(date +%s); if [ "$s" -ne "$old" ]; then echo "$count lines per second"; count=0; old=$s; fi; done; }

(需要Bash。)

或者,分布在多行:

tail -f log.txt | {   
    count=0
    old=$(date +%s)
    while read line
    do
        ((count++))
        s=$(date +%s)
        if [ "$s" -ne "$old" ]
        then
            echo "$count lines per second"
            count=0
            old=$s
        fi
    done
}

这使用date以秒为单位记录时间。同时,它计算tail -f log.txt生成的行数。每当另一秒通过时,就会打印出在该秒期间看到的行数。

示范

一个终端,运行命令:

while sleep 0.1; do echo $((count++)); done >>log.txt

此命令每隔大约十分之一秒将一行写入文件log.txt

在另一个终端中,运行:

$ tail -f log.txt | { count=0; old=$(date +%s); while read line; do ((count++)); s=$(date +%s); if [ "$s" -ne "$old" ]; then echo "$count lines per second"; count=0; old=$s; fi; done; }
15 lines per second
10 lines per second
10 lines per second
10 lines per second
9 lines per second
10 lines per second

由于缓冲,第一次计数关闭。后续计数相当准确。

答案 1 :(得分:0)

您可以部署的简单脚本:

Filename="log.txt"
ln_1=`wc -l $Filename | awk '{print $1}'`

while true
do
    ln_2=${ln_1}
    sleep 1
    ln_1=`wc -l $Filename | awk '{print $1}'`
    echo $(( ln_1-ln_2 )) lines increased
done

答案 2 :(得分:0)

selenium.common.exceptions.WebDriverException: Message: session not created exception 命令支持通过var emailList = (from a in _db.FO_BA join b in _db.EmailSentError on a.CompanyCode equals b.CompanyCode where a.BACode == vbacode select b.Emails) 选项查看附加行,该选项接受文件描述符或文件名。使用此选项,tail会定期检查文件更改。检查的间隔取决于内核是否支持--follow。基于Inotify的实现会及时检测到这些变化(我会说,几乎是即时的)。但是,如果内核不支持tail,则inotify会定期进行定期检查。在后一种情况下,inotify默认情况下会休眠一秒钟。可以使用tail选项更改睡眠间隔。

然而,我不会依赖计算中的睡眠间隔:

  

当'tail'使用inotify时,通常会忽略此轮询相关选项。

特别是因为Bash有一个内置的秒计数器,tail变量(见--sleep-interval):

  

此变量扩展为自​​shell启动以来的秒数。对此变量的赋值会将计数重置为指定的值,并且展开的值将成为分配的值加上自分配以来的秒数。

因此,您可以将SECONDS初始化为info bash SECONDS,运行循环读取SECONDS的输出,并将速度计算为1。但这会产生整个执行时间的平均值。最后tail秒的平均值更加实用。它也很容易实现,因为Bash允许重置秒计数器。

示例

以下示例实现了该想法。它还具有number_of_lines / $SECONDS - 就像交互模式下的输出一样。

N

P.S。

还有很多其他方法可以在几秒钟内获得偏移量。例如,您可以使用内置的watch函数获取当前的Unix时间:

# The number of seconds for which we calculate the average speed
timespan=8

# The number of lines
lines=0

# We'll assume that the shell is running in interactive mode,
# if the standard output descriptor (1) is attached to the terminal.
# See http://www.tldp.org/LDP/abs/html/intandnonint.html
if [ -t 1 ]; then
  is_interactive=1
  format='%d lines/sec'
else
  is_interactive=
  format='%d lines/sec\n'
fi

# Reset the built-in seconds counter.
# Also, prevent division by zero in the calculation below.
SECONDS=1

# Save cursor position, if interactive
test -n "$is_interactive" && tput sc

while read line; do
  if [[ $(( $SECONDS % $timespan )) -eq 0 ]]; then
    SECONDS=1
    lines=0
  fi

  if test -n "$is_interactive"; then
    # Restore cursor position, then delete line
    tput rc; tput el1
  fi
  printf "$format" $(( ++lines / SECONDS ))
done < <(tail -n0 -F log.txt)

另一种方法是调用printf命令:# -1 represents the current time # %s is strftime's format string for the number of seconds since the Epoch timestamp=$(builtin printf '%(%s)T' -1)

但我相信从date变量中读取更快更清洁。