Bash:从每行提取多个条目

Gre*_*een 6 awk gnu unix-text-processing

我有一个日志文件,看起来有点像这样grep my_function $LOG_FILE

[0] my_function took 96.78581194020808 ms
[1] my_function took 82.0779490750283 ms
[2] my_function took 187.79653799720109 ms
[1] my_function took 98.69955899193883 ms
[0] my_function took 10.296131949871778 ms[1] my_function took 2.5152561720460653 ms
[1] my_function took 2.210912061855197 ms
[2] my_function took 3.418975044041872 ms
Run Code Online (Sandbox Code Playgroud)

从这个文件中,我只想提取每行中的数字。通常,我会这样做awk '{print $4}',但此日志包含几行和两个条目。但是,在这里,我有时需要从一行中选择两个单独的条目。我如何使用bash/GNU 工具适当地选择这些?

The*_*ird 5

有时,您似乎在第一行之后有具有相同格式的第二行,其中感兴趣的值位于第四列中。

如果情况总是如此,您可以打印每一列,而不是打印第四列column_number % 4 == 0

awk '{ for (i=1; i<=NF; i++) if (i%4 == 0) print $i }' file
Run Code Online (Sandbox Code Playgroud)

输出

96.78581194020808
82.0779490750283
187.79653799720109
98.69955899193883
10.296131949871778
2.5152561720460653
2.210912061855197
3.418975044041872
Run Code Online (Sandbox Code Playgroud)

  • 很好地利用模来解决这个问题 (2认同)

Rav*_*h13 4

对于您显示的示例,请尝试以下awk解决方案。我们不需要grep先搜索字符串,然后打印所需的值,我们可以自己完成这两个操作awk

这里使用GNU awk

awk '
{
  while(match($0,/my_function took (\S+)/,arr)){
     print arr[1]
     $0=substr($0,RSTART+RLENGTH)
  }
}
' Input_file
Run Code Online (Sandbox Code Playgroud)

第二个解决方案:RS按照my_function took (\\S+)GNU 中的设置awk并稍后RTsplit

awk -v RS='my_function took (\\S+)' 'RT && split(RT,arr,FS){print arr[3]}' Input_file
Run Code Online (Sandbox Code Playgroud)