выйти из awk, если нет ввода

между вашей Xxxcommand и mail -s.. . Команды делают следующее:

Xxxcommand |
sed -e '
   1i\
.TS\
tab( );\
c c c c\
l n n n.
   $a\
.TE
' | tbl - |  nroff -Tascii -ms | grep \. |
mail -s 'test on' example@email.com

NB: c относятся к центрированным столбцам, l к выравниванию по левому краю и n к столбцам с числовым выравниванием . Измените их номера в соответствии с требуемым количеством столбцов.

0
03.05.2019, 17:52
5 ответов

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

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

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

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

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

1
28.01.2020, 02:16

Вы действительно можете комбинировать 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
2
28.01.2020, 02:16

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

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

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

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

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

{ {1}}
1
28.01.2020, 02:16

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

grep -qE '^SOME_PHRASE.*[^[:space:]]' yourfile

perl -0777ne 'exit !/^SOME_PHRASE.*?\S/m' yourfile

sed -ne '/^SOME_PHRASE.*[^[:space:]]/q;$q1' yourfile

Выходные данные

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

echo "$?"
1

Brief

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

Sed работает в , не печатайте, если не запрашивается режим -n и предполагается, что GNU sed имеет q , которая также включает статус выхода.

0
28.01.2020, 02:16

Теги

Похожие вопросы