Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk查找匹配的内容_Bash_Awk - Fatal编程技术网

Bash 使用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

我对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 }' /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的消息?