Shell脚本:如果文件中存在字符串

时间:2011-11-08 07:09:24

标签: shell scripting

我是shell scriptng的新手,我想检查一个文件中是否有3个字符串(“hello”,“who”,“when”等)。
当我谷歌awk,cat,grep等时,我发现了很多方法,什么是最好的方法,我怎么能这样做。
我只需要知道字符串是否存在。

1 个答案:

答案 0 :(得分:1)

你的问题有点不完整:

  • 你想找到字符串吗?因此,当单词Othello出现时,是否会计为hello
  • 在您的问题中,when后面有空格。这是故意的吗?
  • 你想知道所有三个单词是否在文件中,或单词中的一个

一般解决方案是使用grepegrep来搜索文件中的文本。确切的命令行取决于上述问题的答案。

  • 要搜索单词(Othello不计为hello),您需要将-w选项传递给grep。
  • 我假设空白是个错误。

当您需要所有单词时,您可以egrep -wo 'hello|who|when' | sort -uegrep命令查找给定单词的所有实例,并在每行打印出一个。那时,你会有很多重复。因此,sort -u命令对它们进行排序,并仅保留唯一行(这就是-u的含义)。在一个完整的程序中,我会这样做:

filename="story.txt"
words=$(egrep -wo 'hello|who|when' "$filename" | sort -u)
n=$(echo "$words" | wc -l)
if [ $n = 3 ]; then
  echo "found all words in the file"
else
  echo "didn't find all words, only \""$words"\"."
fi

我可以告诉你关于这段代码的更多信息,以及为什么我这样编写代码,但对于初学者来说,已经足够理解了。

但是,如果您需要一个简单的解决方案并且文件很小,那么性能并不重要,您可以这样做:

filename="story.txt"
if egrep -wl 'hello' "$filename" 1>/dev/null; then
  if egrep -wl 'when' "$filename" 1>/dev/null; then
    if egrep -wl 'who' "$filename" 1>/dev/null; then
      echo "found all three words"
    fi
  fi
fi

[更新:]

此第二个代码段还会检查给定文件是否包含 all 三个单词。每个if子句检查其中一个单词。选项-l(小写字母)到egrep使其可能更快,但您可能根本不需要该选项。

通常egrep打印所有与给定表达式匹配的行(在本例中为三个单词)。由于我们不需要该输出,因此我们使用箭头运算符>将其重定向到名为/dev/null的特殊文件。无论你写入该文件的是什么都被丢弃。

if语句将另一个命令作为其参数,如果该命令成功返回,则采用then分支。关于egrep命令的好处是,如果文件中包含给定的搜索表达式,它会成功返回,因此这两件事完全吻合在一起。

如需进一步阅读,请尝试使用Open Group网站上的参考文档:http://www.google.com/search?q=opengroup+grep