Bash:存储每行开头的最后一个单词

时间:2017-07-10 12:24:43

标签: bash grep monitoring

我有一个* .dat文件,会逐渐增长几个小时。我希望及时监控某个值,以便我可以比较它们,观察它的趋势等等。

到目前为止我所拥有的:

LTIME=$(stat -c %Z test2.dat)

while true    
do
   ATIME=$(stat -c %Z test2.dat)

   if [[ "$ATIME" != "$LTIME" ]]
   then    
       grep "15 RT" test2.dat > test_grep2.txt
       LTIME=$ATIME
   fi
   sleep 60
done

使用* .dat的每个增量更新一个人工文本文件。返回类似的东西:

         15 RT    0.000       0.000       0.000       0.000       0.000     -1.4666E+04
         15 RT    0.000       0.000       0.000       0.000       0.000     -1.7073E+04
         15 RT    0.000       0.000       0.000       0.000       0.000     -1.9379E+04
         15 RT    0.000       0.000       0.000       0.000       0.000     -2.1583E+04

我也有这个:

while read line
do [ -z "$line" ] && continue ;echo ${line##* }
done < test_grep2.txt

取最后一个&#34;&#34;将这种txt的每一行放入控制台:

1.0225E+04
1.1738E+04
1.3219E+04
1.4668E+04
1.6083E+04
2.4867E+04
2.5943E+04

但我还没有把这两者放在一起。这不起作用(最后&#34;单词&#34;由于grep txt不断更新而不打印出来):

[ -e test_grep.txt ] && rm test_grep.txt

LTIME=$(stat -c %Z test2.dat)

while true    
do
   ATIME=$(stat -c %Z test2.dat)

   if [[ "$ATIME" != "$LTIME" ]]
   then
    grep -i "15 RT" test.dat > test_grep.txt

    LTIME=$ATIME
   fi
   sleep 5
done

datime=$(stat -c %Z test_grep.txt)


while true    
do
   datime2=$(stat -c %Z test_grep.txt)

   if [[ "$datime2" != "$datime" ]]
   then
        while read line 

    do [ -z "$line" ] && continue ;echo ${line##* }
    done < test_grep.txt  


    datime=$datime2
   fi
   sleep 5
done

我相信使用临时文件必须有一种更有效和更优雅的方式。

我可以请求你帮忙吗?采购最后一个&#34;字&#34;每行包含字符串&#34; 15 RT&#34;并存储它们或保存到文件中以供以后比较/评估。所有这些&#34;在线&#34;。随着* .dat不断增长。

非常感谢!

1 个答案:

答案 0 :(得分:2)

是的,应该这样做:

tail -f growing.dat | awk '/15 RT/ {print $NF}'

tail -f非常有效,因为它会监听文件修改事件,并且只在添加时输出新行(无需循环并不断检查文件是否被修改)。 awk脚本只会为包含15 RT的每一行输出最后一个字段。

修改即可。此外,如果您希望将该输出存储到文件中,并监视终端中的值,您可以使用tee

tail -f growing.dat | awk '/15 RT/ {print $NF}' | tee values.log

由于awk正在缓冲输出,要实时查看值,您可以在每次更新后刷新输出:

tail -f growing.dat | awk '/15 RT/ {print $NF; fflush()}' | tee values.log

编辑2 。如果文件最初不存在,则应使用tail -F

tail -F growing.dat | awk '/15 RT/ {print $NF}'

这样,tail将继续重试打开文件,如果它不可访问,它看起来像这样(消息打印到stderr):

tail: cannot open 'growing.dat' for reading: No such file or directory
tail: 'growing.dat' has appeared;  following new file
-5.1583E+04