【问题标题】:Grep multiple and find multiple patternsgrep 多个并找到多个模式
【发布时间】:2021-01-09 17:29:24
【问题描述】:

我有以下格式的日志,我正在尝试从中获取多个字段。

2020-09-23 INFO  [http-nio-8080-exec-428] localhost.com CLIENT_ID=abc CLIENT_IP=1.2.3 CLASS_NAME=ABCIMPL METHOD_NAME=789{Roles} REQUEST=[<Request>
some text
</Request>
2020-09-23 INFO  [http-nio-8080-exec-428] localhost.com CLIENT_ID=mno CLIENT_IP=1.2.4 CLASS_NAME=MNOP METHOD_NAME=1234{Decisions} REQUEST=[<Request>
some text
</Request>

我想以以下格式在文本文件中捕获 3 个字段。

CLIENT_ID=abc , CLASS_NAME=ABCIMPL , METHOD_NAME=789{Roles}
CLIENT_ID=mno ,  CLASS_NAME=MNOP ,  METHOD_NAME=1234{Decisions}

我能够捕获一个字段,但不能捕获所有字段。

问候

【问题讨论】:

  • 你有没有尝试过?
  • 我尝试使用 awk .. 类似 awk -F[ CLIENT_ID ] '{print $2}' 但它不起作用
  • @user2854333,请务必在您的问题中添加您的努力,而不是在 cmets 中。
  • -F'[ CLIENT_ID ]' 等价于-F'[ CLIENT_D]' 或-F' |C|L|I|E|N|T|_|D',即指定一组字符用作FS,而不是字符串。

标签: shell awk sed grep


【解决方案1】:

您可以使用sed 捕获感兴趣的字段:

sed  -nE 's/.* (CLIENT_ID=[^[:space:]]*).* (CLASS_NAME=[^[:space:]]*).* (METHOD_NAME=[^[:space:]]*).*/\1, \2, \3/p' file
CLIENT_ID=abc, CLASS_NAME=ABCIMPL, METHOD_NAME=789{Roles}
CLIENT_ID=mno, CLASS_NAME=MNOP, METHOD_NAME=1234{Decisions}

【讨论】:

  • GNU sed 中的 [^[:space:]] 可以替换为 \S。
【解决方案2】:

您能否尝试在 GNU awk 中使用所示示例进行跟踪、编写和测试。

awk '
BEGIN{
  OFS=" , "
}
match($0,/CLIENT_ID[^ ]*/){
  val=substr($0,RSTART,RLENGTH)
  match($0,/CLASS_NAME[^ ]*/)
  val1=substr($0,RSTART,RLENGTH)
  match($0,/METHOD_NAME[^ ]*/)
  print val,val1,substr($0,RSTART,RLENGTH)
  val=val1=""
}' Input_file

【讨论】:

    【解决方案3】:

    由于它是日志文件,因此您的字段位置是固定的。你可以使用这个简单的 awk:

    awk -v OFS=' , ' '$1 ~ /^[0-9]{4}(-[0-9]{2}){2}$/{ print $5, $6, $8}' file.log
    
    CLIENT_ID=abc , CLIENT_IP=1.2.3 , METHOD_NAME=789{Roles}
    CLIENT_ID=mno , CLIENT_IP=1.2.4 , METHOD_NAME=1234{Decisions}
    

    【讨论】:

      【解决方案4】:

      您可以使用这个 awk 脚本。您可以定义任何打印模式及其分隔符。此外,我在感兴趣的行的开头匹配了一个日期,如果还不够,您也可以根据您的要求进行修改。

      BEGIN { p["CLIENT_ID="]; p["CLASS_NAME="]; p["METHOD_NAME="] }
       
       /^[0-9]{4}-[0-9]{2}-[0-9]{2}/ {
          r = ""
          for (i=1;i<=NF;i++) for (x in p) if ($i ~ x) r = r? r ", " $i: $i
          print r
      }
      

      用法:

      > awk -f tst.awk file
      CLIENT_ID=abc, CLASS_NAME=ABCIMPL, METHOD_NAME=789{Roles}
      CLIENT_ID=mno, CLASS_NAME=MNOP, METHOD_NAME=1234{Decisions}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 2021-12-18
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        相关资源
        最近更新 更多