仅输出日志文件的部分(函数名称和它的参数值)

Output only parts from a logfile (a function name and a param value of it)

我没有找到类似这个特定案例的问题,我有一个这样的日志文件:

"foo function1 para1=abc para2=def para3=ghi bar 
foo function2 para1=jkl para2=mno para3=pqr bar"

现在我想在 gnu bash 上执行单行代码,输出如下:

function1 def
function2 mno

foo表示函数名的开始,bar是这个块结束的标志。所以我想搜索单词 "foo",提取下一个单词(函数名称),然后搜索 param2 并仅提取值。

如何使用一行代码(而不是脚本)完成此操作?

foo indicates the start for the function name and bar is the sign for the end of this block. So i want to search for the word "foo", extract the next word (the function name) and then search for the param2 and extract only the value.

根据一些假设,如果您的日志文件如下所示,那么

或者

$ cat mylog
foo function1 para1=abc para2=def para3=ghi bar foo function2 para1=jkl para2=mno para3=pqr bar

或与line-break

$ cat mylog
foo function1 para1=abc para2=def para3=ghi bar
foo function2 para1=jkl para2=mno para3=pqr bar

输出

$ awk -F'[ =]' '{for(i=1;i<=NF;i++)if($i=="foo")print $(i+1),$(i+5) }' mylog
function1 def
function2 mno

如果你的 para2 不正常,你可以使用这个

$ awk -F'[ =]' '{f=""; for(i=1;i<=NF;i++){if($i=="foo")f=$(i+1); if(f && $i=="para2")print f,$(i+1)}}' mylog

这就是 awk 使用 -F'[ =]'

查看记录中字段的方式
 With -F'[ =]' awk would see fields in record like below

 foo function1 para1=abc para2=def para3=ghi bar
  ^   ^         ^     ^   ^     ^
  1   2         3     4   5     6
  i  (i+1)                     (i+5)

说明

 awk -F'[ =]' ' # Set field separator space and =
              { 
               # Loop through no of fields in record,
               # NF gives no of fields in current record

               for(i=1;i<=NF;i++)

                   # If field equal to foo then
                   if($i=="foo")
                             # print next(i+1) and 5th(i+5) field from current field index
                             print $(i+1),$(i+5) 
              }
             ' mylog       # input file

如果您的真实输入是其他内容,请post 输入和预期输出

@Simi:尝试:

awk -F'[ ="]' '{for(i=1;i<=NF;i++){if($i=="foo"){printf("%s",$(i+1))};if($i=="para2"){printf(" %s\n",$(i+1))}}}'  Input_file

在这里,我将字段分隔符设为 space 或 = 或 ("),然后遍历一行的所有字段,然后搜索字符串 (foo,para2)(如果任何字段具有这些值)然后根据您的要求简单地打印下一个字段的值。如果这对您有帮助,请告诉我。

Perl 一行

perl -lane 'print "$F[1] ",(split(/=/,$F[3]))[1]' logfile

输入

"foo function1 para1=abc para2=def para3=ghi bar  
foo function2 para1=jkl para2=mno para3=pqr bar"  

输出

function1 def  
function2 mno

如果这不是您所需要的:

$ awk -F'[ =]' '{print , }' file
function1 def
function2 mno

然后编辑您的问题以阐明您的要求并提供更有意义和真正具有代表性的样本 input/output。