使用shell脚本从日志中提取值

时间:2018-01-20 07:24:26

标签: bash shell awk sed grep

您好我是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

仅打印空白行。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

尝试此sed命令

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

<强>输出:

a8197zz

答案 2 :(得分:0)

关注awk可能对您有帮助。

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

输出如下。

a8197zz