2013-09-25 2 views
4

Я пытаюсь сделать сценарий, чтобы суммировать файл, содержащий ниже журналы в коротком формате.Как напечатать n-ю строку из рисунка?

Отрывок из журнала:

$ cat input.txt 
ffffff  1301 2012-08-29T03:13:33 clr   crit 
Some serious problem 
cccc       dddddd  eeeeee 
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
Some serious problem in system. 

ffffff  1302 2012-08-29T03:13:33 set   min 
Some serious problem 
cccc       dddddd  eeeeee 
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
Some minor problem in system. 

Желаемый результат:

2012-08-29T03:13:33 clr crit Some serious problem in system. 
2012-08-29T03:13:33 set min Some minor problem in system. 

Я попытался ниже Approch:

$ cat input.txt | grep -iE "set|upd|clr" | awk '{print $3,$4,$5}' >file1 
12-08-29T03:13:33 clr crit 
12-08-29T03:13:33 set min 

Ниже команды дает мне 5-й линии от картины "Т", но проблема заключается в желаемой текстовой строке, в некоторых случаях она находится в 5-й строке, а в некоторых случаях она находится в 4-й строке ,

$ awk '/T/ { show[NR+4]++ } show[NR]' input.txt >file2 

$ paste file1 file2 

Запрос:

В некоторых случаях это в 5-й линии, а в некоторых случаях это в 4-й строке. Как я могу найти точный текст. Пожалуйста, дайте мне знать, если это возможно.

ответ

2

правильный способ решения этой проблемы является просто установить awks Record Separator к нулевой строке, так что awk знает, что ваши входные записи разделены пустыми строками:

$ awk -v RS= -F'\n' '{split($1,a,/ +/); print a[3],a[4],a[5],$NF}' file 
2012-08-29T03:13:33 clr crit Some serious problem in system. 
2012-08-29T03:13:33 set min Some minor problem in system. 

Таким образом, если вы хотите распечатать другие разделы записи в будущем или распечатать количество записей или распечатать уникальные записи на основе некоторых ключевых полей или что-то еще, это абсолютно тривиально, так как awk ЗНАЕТ и работает по записям.

1

Это, кажется, у вас есть фиксированный размер записи 7 строк, так что вы можете сделать следующее с awk:

$ awk 'NR%7==1{printf "%s %s %s ",$3,$4,$5}NR%7==6' file 
2012-08-29T03:13:33 clr crit Some serious problem in system. 
2012-08-29T03:13:33 set min Some minor problem in system. 

При этом используется оператор модуля для печати третье, четвертое и пятое поле на первой линии запись и печать всей шестой строки.

+0

спасибо, он работал для меня именно так, как мне было нужно. –

1

Это AWK одна линия должна быть более надежными:

awk '$3 ~ /[0-9]+-[0-9]+-/{printf "%s%s%s%s%s", $3, OFS, $4, OFS, $5; 
    for(i=0; i<5; i++) getline; print OFS $0}' input.txt 

2012-08-29T03:13:33 clr crit Some serious problem in system. 
2012-08-29T03:13:33 set min Some minor problem in system. 

UPDATE :: Решение без GetLine:

awk '$3 ~ /[0-9]+-[0-9]+-/{s=NR; printf "%s%s%s%s%s", $3, OFS, $4, OFS, $5} 
    NR==s+5{print OFS $0}' input.txt 
+2

Использование 'getline' никогда не является надежным. –

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