awk
читает каждую строку файла, поэтому вам не нужен цикл while с echo
s.Просто выполните:
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