Bash 使用awk查找匹配的内容
我对awk非常陌生,尝试使用它解析日志文件。该文件包含闪存版本的信息(如果已安装)。我要找的线路是:Bash 使用awk查找匹配的内容,bash,awk,Bash,Awk,我对awk非常陌生,尝试使用它解析日志文件。该文件包含闪存版本的信息(如果已安装)。我要找的线路是: Fri Apr 8 11:38:39 EDT 2016: Current Flash version: noflash 所以我写了一个脚本来搜索: #!/bin/bash NOFLASH=`awk -F ' ' '($2 == "Apr") && ($3 == "8") && ($10 == "noflash") { print $10 }' /Librar
Fri Apr 8 11:38:39 EDT 2016: Current Flash version: noflash
所以我写了一个脚本来搜索:
#!/bin/bash
NOFLASH=`awk -F ' ' '($2 == "Apr") && ($3 == "8") && ($10 == "noflash") { print $10 }' /Library/Logs/FlashUpdateScript.log`
if [ "$NOFLASH" = *noflash* ];then
echo "Flash not installed on Apr 8"
else echo "Flash was installed on Apr 8"
fi
问题是,可能有多行包含Apr 8和noflash,因此在这些情况下,它不会返回我要查找的“Flash未安装”值。如何编辑此脚本,以便判断4月8日是否未安装flash?如果您只想打印消息,那么我只需在awk中执行整个操作:
awk '($2 == "Apr") && ($3 == "8") && ($10 == "noflash") { f = 1 }
END { print "Flash", (f ? "not" : "was"), "installed on Apr 8" }' /Library/Logs/FlashUpdateScript.log`
我删除了自定义字段分隔符,因为默认值适用于您的情况。变量
f
是根据您使用的相同条件设置的。处理完文件后,将打印消息,根据f
是否为真,插入单词“not”或“was”。使用grep
可以匹配所需内容:
logfile="/Library/Logs/FlashUpdateScript.log"
grep "Fri Apr 8 .*Current Flash version: noflash" ${logfile}
你可以在脚本中使用它,比如
if [ -n "$(grep "Fri Apr 8 .*Current Flash version: noflash" ${logfile})" ]; then
echo "Flash not installed on Apr 8"
else
echo "Flash was installed on Apr 8"
fi
您的问题在shell脚本中,而不是
awk
。您可能希望如果[[“$NOFLASH”===*NOFLASH*]
获得匹配。目前,除非您的文件名中包含noflash
,否则您要查找的是*noflash*
,而不是globbing。您应该能够使用bash-x
查看发生了什么。我不清楚您想要什么报告如果没有闪存,然后安装了闪存,然后卸载了闪存,等等。使用grep来完成这项工作不是更好吗?请编辑您的问题以包含一个报告。在示例输入/输出中,包括应匹配和不应匹配的行。为什么在打印消息之前要使用shell测试awk的输出,而不仅仅是打印来自awk的消息?