Я смог взять на себя вашу команду и сколотить это воедино:
df -Ph | awk 'int($5) > 90 {print $0; rc=1}; END {exit rc}' || mail -s "Disk Space Alert On $(hostname)" douglas.hayes@whatever.org
Я избавился от sed
, так как с awk
он не нужен. В операторе awk
я устанавливаю ненулевой код возврата, отличный от -, если он находит какие-либо перечисленные разделы более 90%, а затем отправляю электронное письмо только в том случае, если возврат был не нулевым -.
Единственное предостережение, о котором я мог подумать, это то, что awk
может завершиться с ошибкой, и вы все равно получите электронное письмо, но, возможно, это желательное уведомление.
Предположим, что ваши данные содержат поля, разделенные |
, и что символы-разделители |
могут содержать пробелы с обеих сторон. Тогда разделителем полей ввода, который вы должны использовать с awk
, является выражение *[|] *
, то есть выражение, соответствующее символу |
и любым пробелам по бокам.
Использование одного символа |
в качестве разделителя полей вывода и принуждение awk
к повторному -созданию записей для вывода (путем установки одного из полей )решит вашу проблему, по крайней мере в том виде, в котором вы представили его в своем вопросе.
awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
или, что то же самое,
awk -F ' *[|] *' -v OFS='|' '{ $1=$1; print }' file
Тестирование:
$ cat file
XXXXXXXX 0 Xxyxhsag | yuiji
$ awk -F ' *[|] *' -v OFS='|' '{ $1=$1 }; 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
Вы также можете использовать замену в sed
с аналогичным выражением:
$ sed 's/ *| */|/g' file
XXXXXXXX 0 Xxyxhsag|yuiji
Все это предполагает, что мы можем обрабатывать данные как текст или как «простые» данные CSV, без разделителей, новых строк или кавычек, встроенных в поля в кавычках.
заданные входные данные,
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag | two
XXXXXXXX 0 Xxyxhsag|third
использовать разделитель по умолчанию awk
(один или несколько пробелов подряд или табуляцию ),
awk '{print $1,$2,$3$4$5}' v
XXXXXXXX 0 Xxyxhsag|one
XXXXXXXX 0 Xxyxhsag|two
XXXXXXXX 0 Xxyxhsag|third
обратите внимание на изменение 3-го поля
awk '{printf "3th:[%s]\n",$3}' v
3th:[Xxyxhsag]
3th:[Xxyxhsag]
3th:[Xxyxhsag|third]
Это может быть решением, если у вас всегда есть 5 полей в вашем реальном случае.
вы можете использовать |
в качестве разделителя, но это сохранит место в полях
awk -F\| '{printf "%s|%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag | one
XXXXXXXX 0 Xxyxhsag | two
XXXXXXXX 0 Xxyxhsag|third
это может быть более явным, если я изменю разделитель вывода на!
awk -F\| '{printf "%s!%s\n", $1, $2}' v
XXXXXXXX 0 Xxyxhsag ! one
XXXXXXXX 0 Xxyxhsag ! two
XXXXXXXX 0 Xxyxhsag!third
Теперь у вас не так много выигрыша, так как вам нужно удалить пробелы в конце $1
и начальные пробелы в $2
.
с awk
можно попробовать:
awk -F'|' -v OFS='|' '{sub(/ \| /,"|")} 1' file
XXXXXXXX 0 Xxyxhsag|yuiji
|
)awk -F'|' -v OFS='|' '1' file
XXXXXXXX 0 Xxyxhsag | yuiji
|
, используяsub()
:{sub(/ \| /,"|")}