【问题标题】:extract the value from the log using shell script使用 shell 脚本从日志中提取值
【发布时间】:2018-06-29 10:32:29
【问题描述】:

您好,我是 shell 脚本的新手。我正在尝试从日志中提取特定值。

当我使用特定关键字过滤数据时。看起来像这些。

cat hive-server2.log | grep user

数据的输出是

2018-01-18T16:20:39,464 WARN  [67272380-f3e9-40da-8e8e-a209c05eb4fe HiveServer2-Handler-Pool: Thread-37([])]: util.CurrentUserGroupInformation (CurrentUserGroupInformation.java:getGroupNameFromUser(52)) - user a8197zz (auth:PROXY) via hive (auth:SIMPLE) has no primary groupName, setting groupName to be a8197zz.

在上面的数据中我想像这样为用户提取具体的值。

a8197zz

我试过这样。

awk 'BEGIN{ print "User" }
 /\<user\>/{ u=$10 }
 //{ print u }' OFS=',' hive-server2.log

它只打印空行。任何帮助将不胜感激。

【问题讨论】:

    标签: bash shell awk sed grep


    【解决方案1】:

    使用 GNU grep:

    grep -Po '[^ ]*(?=\.$)' file
    

    grep -Po 'user \K[^ ]*' file
    

    使用 awk:

    awk -F "[. ]" '{print $(NF-1)}' file
    

    awk -F "user " '{split($2,array," "); print array[1]}' file
    

    或搜索带有字符串user 的字段并打印下一个字段:

    awk '{for(i=1; i<=NF; i++) if ($i=="user") print $(i+1) }' file
    

    输出:

    a8197zz

    【讨论】:

      【解决方案2】:

      也试试这个sed 命令

      sed 's/.*user \([^ ]\+\).*/\1/' fileName
      

      输出:

      a8197zz
      

      【讨论】:

      • 我建议sed -n '/user/s/.*user \([^ ]\+\).*/\1/p' fileName 避免收到不包含“用户”的行的垃圾邮件。
      • @daniu,谢谢你的建议
      【解决方案3】:

      关注awk 可能对您有所帮助。

      awk '{sub(/\./,"",$NF);print $NF}'  Input_file
      

      输出如下。

      a8197zz
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 2019-10-15
        • 1970-01-01
        相关资源
        最近更新 更多