Grep строки до и после, если значение строки больше нуля

Grep строки до и после, если значение строки больше нуля

Здравствуйте, у меня есть текстовый файл, содержащий следующую информацию:

#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

Я хочу получить --Endстроку, строку Returnи Elapsedстроку, если ее соответствующий Return равен >0.

Пока что мне удалось только выполнить grep строки Returngrep "#RETURN:" -A 1 -B 1 f.log

Но как мне выполнить grep только если Return равен >0?

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

#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

решение1

С awk:

awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next};\
                      pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
  • /END$/ {prev=$0; next}: Если строка заканчивается на END, сохраните ее как переменную prevи перейдите к следующей строке; Это строка передRETURN

  • /^#RETURN/ && $2>0 {cur=$0; pr=1; next}: Если строка начинается с #RETURNи второе поле больше 0, то сохраните строку как cur, установите переменную prкак 1 (истина) и перейдите к следующей строке

  • pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}: Если prистинно, то вывести вывод в желаемом формате и, наконец, установить prкак 0 (ложь)

Пример:

% cat file.txt                                                                                                                   
#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

% awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

решение2

вы можете попробовать это;

awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test

Например;

user@host:/tmp$ awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
#ELAPSED TIME (in seconds): 55

решение3

Вам следует использовать регулярные выражения в вашем grep:

 grep -C1 'RETURN: [1-9][0-9]*' input.txt

Это регулярное выражение должно улавливать любые (положительные) числа, которые не являются одним 0 (или не начинаются с 0).

Связанный контент