在数组中使用grep

时间:2016-10-08 12:48:07

标签: bash shell

以下是查找特定数组的不同单词"机器人,间谍软件,病毒"在文件中,如果文件存在。

#!/bin/bash

#strings to find in file
NAME[0]="bots"
NAME[1]="spyware"
NAME[2]="virus"

#location of file
LOGS=/home/testing.txt

#define function to grep any of the above mentioned array strings in file
func(){
if `grep "${NAME[*]}" $LOGS`; then
echo "CRITICAL: ${NAME[*]}"
else
echo "errors not found"
exit
fi
}

#file exist or not exist
if [ -f $LOGS ]; then
   echo " File Found"

  #call functions
  func
  modified

  else
   echo "File Not Found"
   exit

grep "${NAME[*]}" $LOGS不起作用。它显示以下错误:

grep: virus: No such file or directory
grep: bots: No such file or directory

1 个答案:

答案 0 :(得分:2)

以下是问题部分的解决方案。

当grep在文件KEYWORDS中找到数组FILE的至少一个条目时,转到if-body。
以下代码适用于包含空格*等特殊字符的数组条目。

KEYWORDS[0]="virus"
KEYWORDS[1]="two words"
KEYWORDS[2]="special chars .+*?|()[]^&"

if grep -qF "${KEYWORDS[@]/#/-e}" -- "$FILE"; then
    # found a keyword
fi

这里发生了什么?

  • grep -q
    不要输出任何东西。退出第一场比赛。如果我们已经找到关键字,我们就不必扫描整个文件。

  • grep -F
    搜索固定字符串。 *|+等字符失去了特殊含义。

  • "{KEYWORDS[@]}"
    数组的每个条目都扩展为一个带引号的字符串。这里"virus" "two words" "special chars .+*?|()[]^&"

  • "${KEYWORDS[@]/#/-e}"
    -e添加到数组的每个条目。 Grep可以使用此选项搜索多个模式。 grep -e"FirstPattern" -e"SecondPattern" ...

  • grep Pattern -- "$FILE"
    --是一个提示,"$FILE"应该被解释为文件名。可以命名一个文件-eFunny,它会停止我们的脚本,因为grep会认为没有提供文件名并等待stdin的输入。这不是必要的,但建立的好习惯。大多数命令都可以使用所谓的双破折号,而不仅仅是grep。