使用awk从日志中提取字段,并将其聚合为新命令
我有这样的日志:使用awk从日志中提取字段,并将其聚合为新命令,awk,grep,zsh,cut,Awk,Grep,Zsh,Cut,我有这样的日志: 2018-10-05 09:12:38 286 <190>1 2018-10-05T09:12:38.474640+00:00 app web - - Class uuid=uuid-number-one cp=xxx action='xxxx' 2018-10-05 10:11:23 286 <190>1 2018-10-05T10:11:23.474640+00:00 app web - - Class uuid=uuid-number-two cp
2018-10-05 09:12:38 286 <190>1 2018-10-05T09:12:38.474640+00:00 app web - - Class uuid=uuid-number-one cp=xxx action='xxxx'
2018-10-05 10:11:23 286 <190>1 2018-10-05T10:11:23.474640+00:00 app web - - Class uuid=uuid-number-two cp=xxx action='xxxx'
2018-10-05 09:12:38 286 1 2018-10-05T09:12:38.474640+00:00应用程序web--类uuid=uuid第一号cp=xxx action='xxxx'
2018-10-05 10:11:23 286 1 2018-10-05T10:11:23.474640+00:00应用程序web--类uuid=uuid第二号cp=xxx action='xxxx'
我需要提取uuid
并使用以下内容运行第二个查询:
/getlogs——搜索“uuid编号1或uuid编号2”
对于第一个查询,我这样做是为了提取uuid
:
/getlogs | grep'uuid'| awk'BEGIN{FS=“=”}{print$2}}| cut-d'-f1
我的三个问题:
- 我想我可以摆脱
和grep
而只使用cut
awk
- 如何仅捕获
的值。我尝试了uuid
或awk'/uuid=\S*/{print$1}'
但失败了awk'BEGIN{FS=“uuid=\\S*”}{print$1}'
- 如何聚合结果并将其转换为一个shell变量,以便在新命令之后使用
uid
中没有空间,请使用以下命令
awk '{sub(/.*uuid=/,"");sub(/ .*/,"")} 1' Input_file
shell_var=$(awk 'match($0,/uuid=[^ ]*/){val=val?val OFS substr($0,RSTART+5,RLENGTH-5):substr($0,RSTART+5,RLENGTH-5)} END{print val}' Input_file)
解决方案3:使用以下sed
可能会对您有所帮助(考虑到uid的值中没有任何空格)
第四种解决方案:使用awk
字段分隔法对显示的样本进行分隔
awk -F'uuid=| cp' '{print $2}' Input_file
要将所有值连接到shell变量中,请使用以下命令
awk '{sub(/.*uuid=/,"");sub(/ .*/,"")} 1' Input_file
shell_var=$(awk 'match($0,/uuid=[^ ]*/){val=val?val OFS substr($0,RSTART+5,RLENGTH-5):substr($0,RSTART+5,RLENGTH-5)} END{print val}' Input_file)
您可以定义两个字段分隔符:
$ awk -F['= '] '/uuid/{print $12}' file
结果:
uuid-number-one
uuid-number-two
问题2:
awk中的模式部分只是选择要处理的行。它不会更改内部变量,如$1
或NF
。您需要在之后进行更换:
$ awk '/uuid=/{print gensub(/.*uuid=(\S*).*/, "\\1", "")}' file
问题3:
var=$(awk -F['= '] '/uuid/{r=r","$12}END{print substr(r,2)}' file)
实现每行的实际聚合(这里是
r=r“,“$12
)。@Mio,我最后添加了解决方案,以获得所有UID值并在最后打印它们,将它们也分配到一个shell变量中,如果您在这里有任何查询,请告诉我。效果很好。我发现另一个答案更具可读性,但你的答案也是有效的!ThanksIt工作得很好。在zsh上,我必须运行setopt+onmatch
才能避免错误。但它在bash上工作得非常好。