между вашей 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
к столбцам с числовым выравниванием . Измените их номера в соответствии с требуемым количеством столбцов.
Мне удалось добиться того, что я хотел.
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 '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
Помимо того факта, что 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
, если вы хотите просмотреть значения, возвращаемые всеми процессами в конвейере.)
Вам следует подумать о перемещении всего внутри одной крыши / инструмента, чтобы упростить задачу:
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
проглатывает
весь ваш файл и ищет ключевое слово в начале строки, что разрешено для многострочных
строк с помощью модификатора // m
. !
объясняет тот факт, что SUCCESS
в Perl
и Unix
миры дополняют друг друга.
Sed
работает в , не печатайте, если не запрашивается
режим -n
и предполагается, что GNU sed
имеет q
, которая также включает статус выхода.