我有一个* .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不断增长。
非常感谢!
答案 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