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

ответ

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

+0

@Vor Небольшая опечатка, исправлена. – Jotne

+1

Почему бы не использовать '' 'как' FS'? :-) – Kent

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

GNU Grep с Perl-совместимых регулярных выражений

+0

Это не заботит, если его строка с 'reqest' или нет. – Jotne

+0

+1 Я чувствую, что grep - это инструмент для этой работы. если OP grep поддерживает lookbehind. – Kent

+3

@AvinashRaj Вы не редактируете код someones, чтобы сделать его другим, чем предполагалось. Вы можете сделать комментарий, а затем до плаката, чтобы изменить его. -1 вам. – Jotne

1

С awk, вы можете попробовать, чтобы соответствовать для < объекта> или </объект>, захватить его, а затем напечатать второй столбец этого захвата (за первым захваченным < объекта >):

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

в моем случае проверить количество записей не нужно ('NF> 1'), потому что если' 'не соответствует ни одному разделителю, в' $ 2' нечего печатать. Спасибо в любом случае за ответ и научить меня «NF». +1! – albciff

+0

«NF> 1» - значит, вы не получаете пустую строку, напечатанную, когда '' не соответствует. –

Смежные вопросы