仅输出日志文件中的部分(函数名称及其参数值)

时间:2017-02-01 12:20:52

标签: bash awk sed grep logfiles

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

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

如何使用单行(不是脚本)来完成此操作?

4 个答案:

答案 0 :(得分:2)

如果这不是你所需要的全部:

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

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

答案 1 :(得分: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),如果任何字段具有这些值,则只需打印下一个字段根据您的要求提供价值。请告诉我这是否对您有所帮助。

答案 2 :(得分:1)

Perl One Liner

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

答案 3 :(得分:0)

  

Func<HttpContext, bool> isApiRequest = (HttpContext context) => context.Request.Path.ToString().Contains("/api/"); app.UseWhen(context => !isApiRequest(context), appBuilder => { appBuilder.UseStatusCodePagesWithRedirects("~/Error/{0}"); }); 表示函数名称的开头,条形符号表示   这个街区的结尾。所以我想搜索“foo”这个词,提取   下一个单词(函数名称),然后搜索param2和   只提取值。

假设您的日志文件如下所示

<强>要么

foo

或使用换行符

$ 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使用$ awk -F'[ =]' '{f=""; for(i=1;i<=NF;i++){if($i=="foo")f=$(i+1); if(f && $i=="para2")print f,$(i+1)}}' mylog

查看记录中字段的方式
-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)

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