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
我有一个 *.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