2017-02-01 90 views
1

我没有找到像这种特定情况下的一个问题,我有这样一个日志文件:输出日志文件(一个函数名和它的参数值的方式),只有部分

"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并只提取值。

我怎么能做到这一点用一行代码(不是脚本)?

+1

在日志文件中,bar和foo之间是否存在换行符? –

+0

不是在foo和bar之间,而是在下一个foo - bar块之间 – Simi

+0

在输入文件的开始和结尾是否真的有双引号? –

回答

1

@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 

我在这里做现场分离器作为空间或=或(“),然后我遍历一行的所有字段,然后搜索字符串(foo,para2),如果任何字段具有这些值,则s意味着根据您的要求打印下一个字段的值。让我知道这是否有助于你。

0

foo指示函数名称的开始,并且bar是 该块结束的符号。所以我想搜索单词“foo”,提取下一个单词(函数名称) ,然后搜索param2和 只提取值。

随着一些假设,如果你的日志文件看起来像下面然后

要么

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

:或断行

$ 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 

如果你真正的输入是另一回事,请邮寄输入和预期输出

1

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 
2

如果这不是你所需要的:

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

然后编辑您的问题,以澄清您的要求,并提供更有意义和真正具有代表性的样本输入/输出。

相关问题