2017-01-09 172 views
0

我想解析一个日志文件来提取userIds。以下是每个日志在catalina.out中的设置方法。我只想提取userId。我将如何做到这一点。我尝试了awk和grep,但它返回的是整个块而不是userId。此外,我想获得每一个唯一的userId一次,因为同一个用户可以明显登录多次,所以我只想要我写入的文件只需要一次。请你帮我理解从哪里开始?谢谢!Bash脚本来解析日志文件

这里是我试过的命令:

awk '/userId/' catalina.out 

grep "userId" catalina.out 

当我做到这一点,而不是返回回用户id的,它返回的整个块(如下图所示)

登录格式:

03:44:04.373 [127.0.0.1-8009-exec-178] 
INFO c.c.c.x.x.w.f.AuthenticationFilter - cachObj 
{"guid":"guid","userId":"userId","isPrimary":false,"accessToken":"accessToken"} 
+0

看起来像JSON输出,使用合适的解析器它 – Inian

+0

是您的日志样品1号线或多重? – Zlemini

回答

0

我假设你的用户ID,会发现像“用户id”:“test_chumma”等等,如果是这样的话,那么以下可能会帮助你。

awk -F'[":,]' '/userId/{print $11}' Input_file 

当然,如果你有更多的需求,那么好心给我们以饱满的条件更加样本输出。

+0

我尝试使用您的命令与我的输入文件名,我不回来任何结果。 – redsox2002

+0

@ redsox2002:请将更多示例Input_file发布到帖子中,然后让我们知道。 – RavinderSingh13

0

与AWK又如:

awk -F"[:,]" '$1 ~ /^{/ {gsub("\"","",$4); print $4}' inFile.log 

在这里,我们用冒号:或逗号,使用awk命令F标志-F[:,]分割的记录,然后,如果在记录中的第一个字段$1开始于托架/^{/(在这里我们使用正则表达式运算符~为条件),那么我们换出第四场的双引号一无所有gsub("\"","",$4)和打印结果print $4

$ cat test 
03:44:04.373 [127.0.0.1-8009-exec-178] 
INFO c.c.c.x.x.w.f.AuthenticationFilter - cachObj 
{"guid":"guid","userId":"aUserId","isPrimary":false,"accessToken":"accessToken"} 
$ awk -F"[:,]" '$1 ~ /^{/ {gsub("\"","",$4); print $4}' test 
aUserId 
+0

我不幸收到任何结果使用这个命令 – redsox2002

+0

我用你的三行示例日志文件从上面。我将发布在我的包装箱上运行的确切结果。也许你的日志文件格式不同,然后你的例子? – JNevill

0

这里是另一种解决方案相结合awk和从UNIX切割:

awk '{split($0,a,":"); print a[2]}' catalina.out | cut -f2 -d"," 
"userId" 

但是,这也将只为您发布的例子工作。

0
awk -F\" '{print $6}' file 

userId