2014-08-29 62 views
0

我在Linux中有一個包含我的應用程序日誌的文件。用grep我得到想要的行,但我需要處理它們以獲得唯一的特定值。更精確地說我有一個日誌:linux命令從一條線獲取信息

13 Jan 2014 15:22:18,291 DEBUG some data 
13 Jan 2014 15:22:18,291 DEBUG some data 
13 Jan 2014 15:22:18,291 DEBUG <request><object>3</object></request> 
13 Jan 2014 15:22:18,291 DEBUG <request><object>4</object></request> 
13 Jan 2014 15:22:18,291 DEBUG <request><object>5</object></request> 
13 Jan 2014 15:22:18,291 DEBUG more data 

隨着下一個命令我得到的XML日誌行:

grep \<request\> myLog.log

但是我只想<object>值。通常我用awk做這種事情,但是我只使用這個命令來處理有列的行,我不知道如何做到這一點,有人能讓我走向正確的方向嗎?有一個更好的命令來做到這一點,awk

謝謝!

+0

謝謝你們,我喜歡這兩個答案......我不能選擇這兩個,所以最後我選擇了第一個,因爲是第一個。 – albciff 2014-08-29 22:00:12

回答

1

你可以這樣做:

awk -F"[<>]" '/<request>/ {print $5}' file 
3 
4 
5 

如果場數可能會有所不同,那麼這個awk只打印值後<object>

awk -F"><object>" '/<request>/ {split($2,a,"<");print a[1]}' file 
3 
4 
5 

或者這樣:

awk -F"><object>" '/<request>/ {print $2+0}' file 
3 
4 
5 
+0

它應該是'print $ 5' – Vor 2014-08-29 12:30:14

+0

@Vor小錯字,固定。 – Jotne 2014-08-29 12:31:21

+1

爲什麼不使用''作爲'FS'? :-) – Kent 2014-08-29 12:38:36

4
grep -oP '<request><object>\K[^<]*' file 

GNU的grep用Perl兼容的正則表達式

+0

這不關心,如果它與'reqest'的一條線或不。 – Jotne 2014-08-29 12:32:24

+0

+1我覺得grep是這份工作的工具。如果OP的grep支持lookbehind。 – Kent 2014-08-29 12:36:50

+3

@AvinashRaj你不編輯某人的代碼,使它做一些不同的打算。您可以發表評論,然後發佈到海報來改變它。 -1給你。 – Jotne 2014-08-29 12:40:37

1

隨着awk,可以嘗試以匹配<對象>或< /對象>,捕獲它,然後打印該捕獲的第二列(第一捕獲<物體後面>):

$ awk -F'</?object>' 'NF>1{print $2}' file 
+0

在我的情況下,檢查記錄的數量是沒有必要的('NF> 1'),因爲如果''不匹配任何分隔符,沒有什麼可以在'$ 2'中打印。無論如何感謝你的答案,並教我'NF'。 +1! – albciff 2014-08-29 22:07:00

+0

'NF> 1'因此當''不匹配時,您不會得到空行。 – 2014-08-29 22:26:16