我有一个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执行此操作!
答案 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