2017-01-09 129 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