【问题标题】:awk or sed: Best way to grab [this text]awk 或 sed:获取 [this text] 的最佳方式
【发布时间】:2010-10-20 01:21:35
【问题描述】:

我正在尝试从日志文件中解析各种信息,其中一些放在方括号内。例如:

Tue, 06 Nov 2007 10:04:11 INFO     processor:receive: [someuserid], [somemessage]  msgtype=[T]

使用 sed、awk 或其他 unix 实用程序从这些行中获取“someuserid”的优雅方法是什么?

【问题讨论】:

    标签: regex sed awk


    【解决方案1】:

    cut
    像这样使用它:cut -f2 -d[ | cut -f1 -d]

    bart@hal9k:~> YOURTEXT="Tue, 06 Nov 2007 10:04:11 INFO     processor:receive: [someuserid], [somemessage]  msgtype=[T]"
    bart@hal9k:~> SOMEID=`echo $YOURTEXT | cut -f2 -d[ | cut -f1 -d]`
    bart@hal9k:~> echo $SOMEID
    someuserid
    

    【讨论】:

    • 很好,我不知道剪切。效果很好。
    • 是的,它是如此基本,但人们忘记了它的存在。
    【解决方案2】:

    如果你想对 all 括号内的字段做点什么,我会使用 Perl:

    perl -lne '
        my @fields = /\[(.*?)\]/g;
        # do something with @fields, like:
        print join(":", @fields);
    ' logfile ...
    

    【讨论】:

      【解决方案3】:

      使用 bash 外壳

      while read -r line
      do
         case "$line" in
              *processor*receive* ) 
                  t=${line#*[}
                  echo ${t%%]*}
                  ;;
         esac
      done < "file"
      

      【讨论】:

        【解决方案4】:
        sed -n '/INFO/{s/.[^[]*\[//;s/\].*//p}' file
        

        【讨论】:

          【解决方案5】:

          使用 AWK:

          cat file | awk -F[\]\[] '{print $2}'
          

          我发现多个分隔符在某些旧版本的 AWK 中不起作用。如果没有,您可以使用两个 awk:

          cat file | awk -F[ '{print $2}' | awk -F] '{print $1}'
          

          【讨论】:

            猜你喜欢
            • 2013-03-01
            • 2012-06-20
            • 2017-04-23
            • 1970-01-01
            • 2014-06-17
            • 1970-01-01
            • 1970-01-01
            • 2013-11-11
            • 1970-01-01
            相关资源
            最近更新 更多