У меня есть запрос выбора, который выполняется и генерирует счетчик. Он экспортирует ответ в текстовый файл, в котором есть следующие записи, например: [
Unprocessed record for A Sources
----------------------Unprocessed record count for ABC SOURCE ------------------
abc_count= 0
--------------------Unprocessed record count for CDE Source --------
CDE_count= 0
-----------------------Unprocessed record count for DEF Source -----------------
DEF_count= 0
------------------Unprocessed record count for GHI Source ----------------------
GHI_count= 56
] Я хочу написать команду Unix, которая проверяет, не равно ли для указанного выше источника какое-либо число, равное 0, а затем отправить его по почте требуемой команде.
Это то, что я использовал ранее, но не работает.
for CHECK in $(awk '{print $1}' hello | grep count=| cut -d"=" -f1) do
if [ $(grep $CHECK output.txt | awk '{print $2}') -ne 0 ] then
echo "$(grep $CHECK output.txt)" | mailx -s "CHECK ABC PROCESS" foo@bar.com
fi
done
Вы должны добавить точку с запятой ;
в операторе if
перед then
и в for
перед do
. Если больше нет проблем, он должен работать. Также я не улучшаю ваш сценарий.
Сценарий.
for CHECK in $(awk '{print $1}' hello | grep count=| cut -d"=" -f1); do
if [ $(grep $CHECK output.txt | awk '{print $2}') -ne 0 ]; then
echo "$(grep $CHECK output.txt)" | mailx -s "CHECK ABC PROCESS" foo@bar.com
fi
done
Кроме того, вы не должны использовать команду cut
как эту cut -d"=" -f2
, чтобы получить числовое значение? также лучше запускать свои команды вне цикла, чтобы увидеть, получили ли вы какой-либо результат или нет.
Чтобы отправить электронное письмо на foo@bar.com
, если файл содержит присвоение чего-либо, отличного от -нуля, чему-либо:
grep '='
(или `grep 'count=', если вам нужна более конкретная информация ). grep -v -w '0'
(-w
для сопоставления только полных слов, то есть не 10
в данном случае ). if grep '=' output.txt | grep -q -v -w '0'; then
grep '=' output.txt | grep -v -w '0' | mailx -s "Check this out!" foo@bar.com
fi
Для данных в вопросе будет отправлено электронное письмо, содержащее
GHI_count= 56
Если вам кажется ненужным запускать четыре grep для этого:
tmpfile=$(mktemp)
grep '=' output.txt | grep -v -w '0' >"$tmpfile"
if [ -s "$tmpfile" ]; then
mailx -s "Check this out!" foo@bar.com <"$tmpfile"
fi
rm -f "$tmpfile"
Тест -s
будет верным, если файл существует и его размер больше нуля.