
Здравствуйте, у меня есть текстовый файл, содержащий следующую информацию:
#[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).