2014-08-29 45 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