2017-07-10 18 views
0
开头的每一行的最后一个字

我有一个* .dat文件,它可以递增增长几个小时。我想及时监测一定的价值,以便我可以比较它们,观察它的趋势等等。Bash:存储以

我有什么至今:

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 

这需要这样的每一行的最后一个 “字” 的txt到控制台:

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

但我还没有成功将这两个放在一起。这只是不工作(不能打印出最后的“话”作为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”的每一行的最后一个“单词”,并存储它们或保存到文件中供以后比较/评估。而这一切都是“在线”。随着* .dat的不断增长。

非常感谢!

+0

减少问题。 – ceving

+0

好点,谢谢... Althoug有点无用。 – Jewenile

+0

这非常有用,因为它提高了获得答案的机会。 – ceving

回答

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 
+0

非常感谢!这使它简单得多!以这种方式获得的东西可以存储到一个列表(例如)或一个文件的进一步(仍然在线)处理?谢谢! – Jewenile

+0

是的,我已经更新了答案。 – randomir

+0

现在它几乎是完美的。 * .dat只是必须已经存在。让我们假设它会在稍后创建。当只是看,我通常使用一会儿!尾巴-f muj_soubor.sta;做睡1;完成,但无法想象在这种情况下如何陪伴。我可以要求提供最后一个提示吗?谢谢! – Jewenile