输出“监视”命令作为列表


27

我想对添加到日志文件中的每分钟行数进行一些简单的计算。

我还想存储每秒的计数。

我需要的是以下命令的输出作为列表,该列表将每秒更新一次:

watch -n1 'wc -l my.log'

如何将“监视”命令的“更新”输出为列表?

Answers:


24

您可以使用导致其不打印标题的-t开关watch。但是,这仍然可以清除屏幕,因此使用简单的Shell循环可能会更好:

while sleep 1; do
    wc -l my.log
done

优点之一是,您可以轻松添加其他命令(例如date)和/或通过管道传递输出sed以重新格式化它。顺便说一句,如果您在循环中sleep 1与交换wc,它将在错误时自动终止。


但是请注意,它不会做它到底每秒(与zsh的或ksh93的,你可以调整睡眠时间,以考虑通过在循环中运行的命令所产生的漂移,虽然)
斯特凡Chazelas

2
@StephaneChazelas也不会wait-只需尝试watch -n 1 "sleep 5"
彼得

确实(我已经检查了procps和busybox的实现)。我以为那是唯一watch有用的东西,但是它甚至没有给您带来什么好处,因此您的解决方案与基于表的解决方案一样好,但是都没有非常准确地回答“日志文件增长的速度”问题。
斯特凡Chazelas

好吧,如果每分钟的行数是最终目标,那么每10秒采样一次就足够了,恕我直言-因此开销并不是那么可怕(当然,除非文件变大了)。实际上,从循环内部,可以打印定时信息(即使必要,甚至可以在命令完成之前和之后),然后即使对于较大的文件,精度也可以提高(数量级)。
彼得

1
@peterph watch有一个-p选项,如果可能的话,它将正确地执行此操作(很明显,如果不允许同时执行多个命令,那么您将无法执行每1秒花费5秒的命令)。我知道,是我写的:-P
derobert

8

一个老问题,但我刚刚找到了一个很简单的答案:

watch -n1 'wc -l my.log | tee -a statistics.log'

这将每秒执行wc一次,将其输出添加到statistics.log文件,并在屏幕上显示。
因此,您将得到一个充满数字的文件,代表的连续行数my.log


请注意,该命令watch "($MYCMD | tee -a $MYLOG)"不是watch "($MYCMD)" | tee -a $MYLOG。如果您像我一样弄错了,输出将非常混乱。这里要注意的另一件事是,该命令默认情况下不会添加每个命令执行的时间戳,因此循环的答案可能仍对您更好。
ffledgling


3

请尝试以下操作:

watch -n1 'wc -l my.log >> statistics.log'

1

当我尝试从中获得更好的/记录的输出时,遇到了这个问题du -sh $data_path。我使用了此处找到的“ while命令,请执行睡眠”模式,但使用了一些复杂的AWK来提供所需的输出。

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

我实际上是作为oneliner进行此操作的,这就是为什么要使用分号的原因。但是为了使其可读性,我将其发布。输出如下:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

您可以创建一个脚本来帮您。我打电话给我keep(喜欢,继续做),然后把它放在bin路上。

这是我的脚本:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
您应该"$@"用来执行命令(参数),而不要使用unquoted $*。这样,您将使外壳程序保留引号引起来的参数,等等。FTFY。
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.