基于匹配正则表达式的Awk脚本值提取

基于匹配正则表达式的Awk脚本值提取,awk,grep,Awk,Grep,我正在尝试编写一个awk脚本,在其中捕获一个API响应。响应如下所示 id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChan

我正在尝试编写一个
awk
脚本,在其中捕获一个API响应。响应如下所示

id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?} 
在上面,我只想打印下面的
profile:login

karry.t@john.com

我怎样才能打印这个。对于不同的用户,此响应可能有所不同。因此,我必须根据
profile.login
进行过滤,并将其打印到csv文件旁边。感谢您的帮助。

您可以使用此命令(使用
tr
awk
):

样本:

AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | tr ' ' '\n' | awk -F: '/profile:login/{print $NF}'
karry.t@john.com
AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | awk -vRS=' ' '/profile:login/{sub(/.*:/, ""); print}'
karry.t@john.com
或者只使用
awk

tr ' ' '\n' | awk -F: '/profile:login/{print $NF}'
awk -vRS=' ' '/profile:login/{sub(/.*:/, ""); print}'
样本:

AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | tr ' ' '\n' | awk -F: '/profile:login/{print $NF}'
karry.t@john.com
AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | awk -vRS=' ' '/profile:login/{sub(/.*:/, ""); print}'
karry.t@john.com

您可以使用此命令执行此操作(使用
tr
awk
):

样本:

AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | tr ' ' '\n' | awk -F: '/profile:login/{print $NF}'
karry.t@john.com
AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | awk -vRS=' ' '/profile:login/{sub(/.*:/, ""); print}'
karry.t@john.com
或者只使用
awk

tr ' ' '\n' | awk -F: '/profile:login/{print $NF}'
awk -vRS=' ' '/profile:login/{sub(/.*:/, ""); print}'
样本:

AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | tr ' ' '\n' | awk -F: '/profile:login/{print $NF}'
karry.t@john.com
AMD$ echo "id:0tesss status:ACTIVE created:2016-12-06T13:24:50.000Z activated:2016-12-06T13:26:06.000Z statusChanged:2016-12-06T13:26:06.000Z lastLogin:2017-06-13T06:32:41.000Z lastUpdated:2017-06-13T06:32:58.000Z passwordChanged:null profile:lastName:tack profile:secondEmail:null profile:mobilePhone:null profile:email:karry.t@john.com profile:login:karry.t@john.com profile:firstName:Karry profile:displayName:Karry tack credentials:recovery_question:{question:Who's a ?}" | awk -vRS=' ' '/profile:login/{sub(/.*:/, ""); print}'
karry.t@john.com

awk
可以提取文件中所需的内容

$ awk '{match($0,/profile:login[^\ ]+/);print substr($0,RSTART+14,RLENGTH-14)}' file
karry.t@john.com
简要说明

  • match($0,/profile:login[^\]+/)
    :在
    $0
    中找到与正则表达式匹配的模式,并将起点存储在
    RSTART
    中,长度以
    RLENGTH
  • substr($0,RSTART+14,RLENGTH-14)}
    :打印忽略先前不需要的模式的子字符串

    • awk
      可以从文件中提取所需内容

      $ awk '{match($0,/profile:login[^\ ]+/);print substr($0,RSTART+14,RLENGTH-14)}' file
      karry.t@john.com
      
      简要说明

      • match($0,/profile:login[^\]+/)
        :在
        $0
        中找到与正则表达式匹配的模式,并将起点存储在
        RSTART
        中,长度以
        RLENGTH
      • substr($0,RSTART+14,RLENGTH-14)}
        :打印忽略先前不需要的模式的子字符串

      哎呀,你忘记发布代码了!StackOverflow是关于帮助人们修复代码的。这不是免费的编码服务。有代码总比没有代码好。即使你不知道如何编写程序,元代码也会证明你认为程序应该如何工作。哎呀,你忘了发布代码了!StackOverflow是关于帮助人们修复代码的。这不是免费的编码服务。有代码总比没有代码好。即使您不知道如何编写程序,元代码也会演示您认为程序应该如何工作。