获取文本文件和管道中的匹配项到新文件

时间:2017-02-04 17:55:15

标签: bash

我有一个grep(或awk)的bash问题。我正试图在Delay行中获取TOTAL的每个实例。因此,在下面的情况中,它将是0的5个实例。这些匹配的实例也可以通过管道传输到一个新文件,其中每个实例都应该在它自己的新行上。

Timestamp         Stream    Packets   Losses Misorder       Rate    Delay
17/02/01.10:58:26 stream_0      625        0        0    5.00  M  38473.2 F
17/02/01.10:58:26 TOTAL                           625        0        0    5.00  M
-------------------------------------------------------------------------------------
17/02/01.10:58:27 stream_0      625        0        0    5.00  M  38473.2
17/02/01.10:58:27 TOTAL                           625        0        0    5.00  M
-------------------------------------------------------------------------------------
17/02/01.10:58:28 stream_0      625        0        0    5.00  M  38473.2 F
17/02/01.10:58:28 TOTAL                           625        0        0    5.00  M
-------------------------------------------------------------------------------------
17/02/01.10:58:29 stream_0      625        0        0    5.00  M  38473.2
17/02/01.10:58:29 TOTAL                           625        0        0    5.00  M
-------------------------------------------------------------------------------------
17/02/01.10:58:30 stream_0      625        0        0    5.00  M  38473.3
17/02/01.10:58:30 TOTAL                           625        0        0    5.00  M
-------------------------------------------------------------------------------------

所以我正在寻找以下匹配(用< -this编码):

Timestamp         Stream    Packets   Losses Misorder       Rate    Delay
17/02/01.10:58:26 stream_0      625        0        0    5.00  M  38473.2 F
17/02/01.10:58:26 TOTAL                           625        0        0(<-this) 5.00  M
-------------------------------------------------------------------------------------

输出文件示例(文件名无关紧要):

0
0
0
0
0

我是一名JavaScript程序员,但我只允许通过bash执行此操作!

2 个答案:

答案 0 :(得分:1)

使用*.php,您可以按包含TOTAL的行进行过滤,并打印第5列:

awk

答案 1 :(得分:0)

您也可以执行所有Bash解决方案:

regex="TOTAL[[:blank:]]+([[:digit:]]+)[[:blank:]]+([[:digit:]]+)[[:blank:]]+([[:digit:]]+)"
while IFS= read -r line || [[ -n "$line" ]]; do
    if [[ "$line" =~ $regex ]]
    then
        echo "${BASH_REMATCH[3]}"
    fi  
    done <file >output_file 

或者,只需匹配TOTAL,通过放入数组来打破空格上的字段,然后打印第四个字段:

while IFS= read -r line || [[ -n "$line" ]]; do
    if [[ "$line" =~ TOTAL ]]
    then
        arr=($line)
        echo "${arr[4]}"
    fi  
    done <file >output_file