使用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变量,以便在新命令之后使用

请尝试以下内容(在显示的样本和BASH环境中进行测试)

解决方案2:如果您的
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上工作得非常好。