Bash:存储以开头的每一行的最后一个字

Bash: Store the last word of each line starting with

我有一个 *.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 的每次增量更新人工文本文件。 Returns 类似的东西:

         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

它将每行文本的最后 "word" 带入控制台:

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

但我还没有成功地将这两个放在一起。这只是行不通(最后的 "words" 没有打印出来,因为 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

而且我相信一定有一种比使用临时文件更高效、更优雅的方法。

我可以向你寻求帮助吗?获取包含字符串“15 RT”的每一行的最后 "word" 并将它们存储或保存到文件以供以后使用 comparison/evaluation。而这一切 "online"。随着 *.dat 不断增长。

非常感谢!

是的,应该这样做:

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