我正在尝试逐行检查记录在日志文件中的文件。对于每一行,检查特定字段是否为空或字段的值是否错误。 并用错误信息打印行
#!/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 |||||
答案 0 :(得分:2)
awk
读取文件的每一行,因此不需要使用echo
进行while循环。只要做:
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