将时间大于 100 毫秒的 ping 输出到文件并附加时间戳

将时间大于 100 毫秒的 ping 输出到文件并附加时间戳

我想将时间大于 100 毫秒的每个 ping 保存在一个文件中,并在每一行附加一个时间戳。

搜索我已经设法得到这个:

ping HOST | grep --line-buffered "time=[0-9][0-9][0-9]" | perl -nle 'print scalar(localtime), " ", $_' > outputFile

首先,我遇到了 grep 缓冲区的问题,用--line-buffered.我猜想 perl 也会发生类似的情况,因为我在 shell 中得到了输出,但在输出文件中没有任何内容。

答案1

没有 Perl:

ping -c 10 -D HOST | grep -E "time=[1-9][0-9]{2,}" >> output.txt

答案2

perl默认情况下缓冲输出,除非您通过将$|aka设置$OUTPUT_AUTOFLUSH为非零值来告诉它不要这样做。有关详细信息,请参阅man perlvar并搜索 AUTOFLUSH。

另外,如果您使用 perl,则也不需要 grep。

尝试这样的事情:

ping HOST | perl -nle 'BEGIN { $|=1 } ;
    if (/time=\d\d\d/) { print scalar(localtime), " ", $_}' > outputFile

顺便说一句,您还可以重写脚本,以便 perl 从 ping 打开一个管道并循环遍历该管道的输入,而不是将 ping 的输出通过管道传输到 perl 中。例如:

#! /usr/bin/perl 

# turn off output buffering
$|=1;

# get hostname to ping from command line or use default-hostname
$host=shift || 'default-hostname';

open(IN,'-|',"ping $host") || die "couldn't open pipe from ping: $!\n";
while(<IN>) {
  if (/time=\d\d\d/) { print scalar(localtime), " ", $_ };
};
close(IN);

相关内容