Я пытаюсь проверить файл журнала построчно. Для каждой строки проверьте, не пусто ли конкретное поле или поле имеет неправильное значение. И вывести строку с сообщением об ошибке
#!/bin/bash
LOG=/log/output.log
x=false
while read -r line; do
if
(echo $line | awk -F'|' '{if ($8= = "") print "Application is empty"}') ||
(echo $line | awk -F'|' '{if ($9= = "") print "Http request method is empty"}') ||
(echo $line | awk -F'|' '{if ($7= = "") print "Operation is empty"}')
(echo $line | awk -F'|' '{if ($13 !~ /0|1|2/) print "result(0,1,2) has a wrong value"}')
then
echo $line
fi
done < "$LOG"
Фактические результаты:
9f2b|EDR|V1|0|V1|2019-05-14|7||||2019-05-14T08:00:40.095Z|1|0|14|19|||XXXXX||||||| ||897|||||||||5b8689707|||||||
Приложение пусто
9f2b|EDR|V1|0|V1|2019-05-14|7||||2019-05-14T08:00:40.095Z|18|0|||||XXXXX||||||||| 1234|||||||||5b868007|||||||
Приложение пусто
42e2|EDR|V1|0|V1|2019-05-14|7||||2019-05-14T08:00:42.532Z|22|0|||||XXXXX||||||||| 235|||||||||3b6959ae||||||||
Приложение пусто
83ac|EDR|V1|0|V1|2019-05-14|7||||2019-05-14T08:00:42.758Z|8|0|||||XXXXX||||||||| 789|||||||||5945548f|||||
Ожидаемый результат:
Приложение пусто
Операция пуста
Метод HTTP-запроса пуст.
83ac|EDR|V1|0|V1|2019-05-14|7||||2019-05-14T08:00:42.758Z|8|0|||||XXXXX||||||||| 789|||||||||5945548f|||||





awk читает каждую строку файла, поэтому вам не нужен цикл while с echos. Просто делать:
awk -F\| ' {b=1}
$8= = "" { print "Application is empty"; b=0 }
$9= = "" { print "Http request method is empty"; b=0 }
$7= = "" { print "Operation is empty"; b=0 }
$13 !~ /0|1|2/ {print "result(0,1,2) has a wrong value"; b=0 }
b
' /log/output.log
Основная проблема с вашим подходом заключается в том, что команда, которую вы оцениваете с помощью if, всегда завершается успешно, поэтому вы всегда печатаете строку. Чтобы сделать awk неудачным, вам нужно будет добавить операторы выхода к каждому из операторов awk. (например, echo $line | awk -F'|' '$8= = "" {print "Application is empty"; exit 1 }'
Это будет печатать несколько сообщений об ошибках, если строка не соответствует нескольким условиям, чего не произойдет, если вы добавите операторы выхода и замкнете операторы ||.
Если вы хотите напечатать только одно сообщение об ошибке, вы можете сделать:
awk -F\| '
$8= = "" { print "Application is empty"; next }
$9= = "" { print "Http request method is empty"; next }
$7= = "" { print "Operation is empty"; next }
$13 !~ /0|1|2/ {print "result(0,1,2) has a wrong value"; next }
' /log/output.log
Или, если вы хотите напечатать несколько сообщений об ошибках, но все в одной строке, вы можете сделать:
awk -F\| ' {s = ""}
$8= = "" { printf "Application is empty"; s = "; " }
$9= = "" { printf "%sHttp request method is empty", s; s = "; " }
$7= = "" { printf "%sOperation is empty", s; s = "; " }
$13 !~ /0|1|2/ {printf "%sresult(0,1,2) has a wrong value", s; s = "; " }
s { print ""}
!s
' /log/output.log
Строка, на которую вы ссылаетесь в своем комментарии, удовлетворяет условиям. Поля 7,8 и 9 не пусты, а столбец 13 это 0.
yes Я хочу печатать только строки, которые соответствуют условиям с сообщениями об ошибках, и игнорировать другие строки
В первом решении замените b на !b. В третьем измените !s на s.
@EdMorton Отличное предложение!
спасибо, но этот код выводит строку, которая не соответствует условиям, и выводит только сообщение об ошибке: ddcd470113f1|EDR|V1|0|V1|2019-05-14T11:36:21.756Z|1|14|POST| /sms/******/requests|2019-05-14T11:36:21.734Z|22|0|||201|неесли|tel12345|синий|lYS9bAeN7C6gQpUSZeRiXaKL3tShVsH/… Приложение пусто Приложение пусто Приложение пусто; Метод HTTP-запроса пуст.