Речь идет не только об объединении нескольких sed
команд. (Джейсен объяснил эту часть в своем ответе ). Вы можете узнать больше:
cat file | sort...
cat
не нужно, так как вы можете дать sort
имя файла, вам не нужно cat
раньше, но сделайте
sort file | uniq -c | awk...
uniq -c
удаляет дубликаты и добавляет счетчик, но, поскольку следующий awk
использует только третий comlun, поэтому счетчик все равно сбрасывается. Вы можете удалить -c
и заменить весь uniq
опцией -u
на sort
:
sort -u file | awk -F " " '{print $2}' | sed...
Здесь вы неправильно используете awk
вместо cut -d" " -f 2
, но вы можете это сделать. Но теперь вы можете продолжить использовать awk
или выполнить этот шаг и в sed
. Нет необходимости переключать инструменты для задачи, которую одинаково можно выполнить в каждом инструменте :
sort -u file | sed 's/[^ ]* *\([^ ]*\).*/\1 working IP/'...
Здесь уже странно не знать исходный файл. Но если вы добавляете working IP
к каждой строке, удалите его для всех в диапазоне до первого появления,это должно быть идентично добавлению во всех строках, кроме первой:
sort -u file | sed 's/[^ ]* *//;s/.*//;1!s/$/ working IP/'
Затем paste
можно легко включить в sed
, собрав строки в удерживаемом пространстве и позже заменив первые новые строки пробелом, а все остальные — working IP
. В то же время удаление последней строки($ d
)может быть выполнено, поэтому целая миля -длинная командная строка с 6 различными командами и 8 трубами сгорает до простой sort
, только одной трубы и короткой sed
сценарий:
sort -u file | sed 's/[^ ]* *//;s/.*//;$!{H;1h;d;};x;s/\n/ /;s// working IP /g'
Идентичный результат без затрат целой жизни на чтение вариантов на man
страницах и анализ происходящего на каждом этапе.
Ваш скрипт (в том виде, в котором он написан ), не будет делать то, что вы ожидаете. Самая большая проблема заключается в том, что вы можете exit 0
преждевременно выйти из цикла, пропустив возможные последующие критические записи диска. Менее опасным является то, что сценарий может exit 1
выдавать предупреждение при наличии критических проблем. Nagios будет основывать статус этой проверки на коде выхода , так что ваш скрипт может давать запутанные результаты просто из-за порядка записей в файле.
Я бы рекомендовал изменить структуру скрипта, чтобы он возвращал именно то, что вы ожидаете, учитывая данные в файле. Должен ли он свернуть худшее предупреждение? Должен ли он подсчитывать количество предупреждений в файле? Наиболее безопасной идеей было бы свернуть наихудшее предупреждение, чтобы каждый диск был ниже порога предупреждения, чтобы предупреждение Nagios было «ОК», но ваша среда может диктовать другие требования.
Вот один из вариантов, который приводит к наихудшему предупреждению.:
awk '
BEGIN {
warn=0
crit=0
}
{
if ($2 > $3) ++warn
if ($2 > $4) ++crit
}
END {
if (crit) {
print "CRITICAL: one or more disks have reached the standard crtical limit"
exit 2
} else if (warn) {
print "WARNING: one or more disks have reached the standard warning limit"
exit 1
} else {
print "OK: all disks are under their limits"
exit 0
}
}
' < file
Это просто пример для демонстрации идеи.