我没有找到类似这个特定情况的问题,我有一个这样的日志文件:
"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并仅提取值。
如何使用单行(不是脚本)来完成此操作?
答案 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)
如果您的真实输入是其他内容,请发布输入和预期输出