exit awk, если вход отсутствует

Мне нужно, чтобы awk возвращал код выхода 1, если:

  • не поступало вход от grep до awk
  • второе поле пусто или не существует

Он работает, когда grep находит «SOME_PHRASE», но если эта фраза не выходит, код возврата ($?) Равен 0.

grep -m1 -i '^SOME_PHRASE' test.txt | awk '{ if (length($val)==0 || $val=="" || length($2)==0) exit 1; else print $2; }' 

пример test.txt

 Test1 1234 Phrase 214324 

Ожидаемый результат:

 $ echo $? 1 

5 Solutions collect form web for “exit awk, если вход отсутствует”

Вы действительно можете объединить awk и grep :

 awk 'BEGIN{rv=1} # Default return value is 1 tolower($0) ~ /^some_phrase/{ # Case insensitive search if($2 != ""){ # If $2 is not empty, print $2 # print the value, rv=0 # and set the return value } exit # one match, do not process any more line } END{exit rv} ' test.txt 

Мне удалось добиться того, чего я хотел.

 grep -m1 -i 'SOME_PHRASE' test.txt | awk 'END { if (NR==0 || $2=="") exit 1; else print $2;}' 

Более прямолинейно:

 $ awk 'toupper($1) ~ /^SOME_PHRASE/ { if ($2) { print $2; exit 0 } else { exit 1 } } END { exit 1 }' test.txt 

Первое поле изменяется на верхний регистр и сравнивается с шаблоном верхнего регистра. Если совпадение и если существует второе поле, это поле будет напечатано, и сценарий будет завершен с нулевым статусом выхода, в противном случае (без второго поля) он выйдет с статусом выхода 1. Если шаблон никогда не совпадает, скрипт выйдет с статусом выхода 1, как только он достигнет конца ввода.

Помимо того факта, что awk отлично способен выполнять то, что делает grep здесь, вы также можете явно проверить наличие пустого ввода в awk а затем вернуть его. Здесь блок END проверяет количество обработанных строк (записей):

 $ echo foo | grep bar | awk 'END {if (NR == 0) exit }' ; echo "exit value $?" exit value 1 

Или используйте оболочку, чтобы получить код возврата неудачного процесса в конвейере, даже если он не является последним. Я не думаю, что стандартная оболочка может это сделать, но, например, в Bash, set -o pipefail :

 $ set -o pipefail $ echo foo | grep bar | awk '{exit 0}' ; echo "exit value $?" exit value 1 

(Bash также имеет PIPESTATUS если вы хотите посмотреть на возвращаемые значения из всех процессов в конвейере.)

Вы должны рассмотреть возможность перемещения всего внутри одной крыши / инструмента, чтобы сделать его простым:

 grep -qE '^SOME_PHRASE.*[^[:space:]]' yourfile perl -0777ne 'exit !/^SOME_PHRASE.*?\S/m' yourfile sed -ne '/^SOME_PHRASE.*[^[:space:]]/q;$q1' yourfile 

Вывод

Для показанных данных, сразу после запуска любой из приведенных выше команд, мы запускаем:

 echo "$?" 1 

краткое

Perl slurps весь ваш файл и ищет ключевое слово в начале строки, которое включено для multiline строк с использованием модификатора //m . ! следует учитывать тот факт, что SUCCESS в мирах Perl & Unix является взаимодополняющим.

Sed работает don't print unless asked for режим -n и предполагается, что GNU sed имеет команду q которая также включает в себя статус выхода.

  • grep: специальный символ +
  • grep, вторгающийся в мой ps
  • Как проверить, имеет ли файл уже строку с содержимым?
  • grep: шаблон соответствия в определенном положении
  • agrep с направленными смещенными штрафами
  • Извлечение частей текста с помощью sed, awk
  • Проблема с поиском и grep
  • Как свернуть 'grep -c <токен> * .h * .cpp' в один счет?
  • Как перечислить файлы резервных копий, отсутствующие в соответствующих файлах?
  • Как совместить начало / конец строки в регулярном выражении?
  • Regex для всех 10 буквенных слов с уникальными буквами
  • Interesting Posts

    Трубопроводы в меньшем количестве и редактирование: ошибка «невозможно отредактировать стандартный вход». Обходные?

    Что произойдет с сеансом сеанса по ssh, когда соединение потеряно?

    Могут ли mutt-макросы получать свойства из текущего сообщения?

    Как это объяснить? Superblock поврежден в SSD

    Странная проблема обновления с Chromium на Gentoo

    Как установить xfontsel на Fedora 13? Любая альтернатива?

    Как использовать специальные символы в xfig

    Выполнять команду во всех открытых оболочках

    Создание серверных и клиентских сертификатов с несколькими именами хостов

    Можно ли сделать сортировку по тинару по заказу ASCII?

    Отключить светодиод на 8192cu Edimax dongle, драйверы ядра

    Измерение тока или мощности

    Как заставить xargs играть хорошо с stdin?

    Как определить, какие кодовые страницы unicode определены в TTF-файле?

    Как исправить нечетные escape-последовательности командной строки (ps1) после удаленного входа в iTerm2

    Linux и Unix - лучшая ОС в мире.