Intereting Posts
Как продолжить анимацию в сценарии Плимута? Как узнать путь к определенному файлу в zip-архиве, не извлекая его? Почему тесты bash настолько разборчивы по поводу пробелов? MacOsx – Shell – список всех .php-файлов и их восьмеричных разрешений внутри папки specificc есть ли способ узнать, как именно Kubuntu устанавливает KDE, чтобы я мог просто дублировать это? Bubble a до b с sed Попытка получить динамическую страницу с wget без успеха Загрузка Debian на черный экран AWK для печати строк, соответствующих пользовательскому вводу, введенному в определенном формате, диапазоне и т. Д. Как указать путь к файлу с помощью find при поиске файлов с помощью -regex Как добавить / расширить zshell доработки? Как заставить Pi-Hole работать с IPv6? Автоматизация slappasswd Какие оболочки не поддерживают расширение круглых скобок и требуют возврата? Linux Mint 17 Cinnamon: как я могу запустить приложение до экрана входа в систему?

Строки 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 вернуть строку grep "#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 

С 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=$0; next} : Если строка заканчивается с END , сохраните ее как переменную prev и перейдите к следующей строке; Это строка перед RETURN

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

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

Пример:

 % 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 

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

 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 

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

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

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