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

Shell脚本:如果文件中存在字符串,shell,scripting,Shell,Scripting,我是shell脚本的新手,我想检查文件中是否存在3个字符串(“hello”、“who”、“who”等)。 当我搜索awk、cat、grep等时,我发现了很多方法,最好的方法是什么,我该如何做。 我只想知道字符串是否存在。您的问题有点不完整: 要查找字符串还是单词?那么,当奥赛罗这个词出现时,这算是你好吗 在你的问题中,when后面有空格。这是故意的吗 您想知道这三个单词是否都在文件中,还是其中一个单词就足够了 一般的解决方案是使用grep或egrep搜索文件中的文本。确切的命令行取决于上述问

我是shell脚本的新手,我想检查文件中是否存在3个字符串(“hello”、“who”、“who”等)。
当我搜索awk、cat、grep等时,我发现了很多方法,最好的方法是什么,我该如何做。

我只想知道字符串是否存在。

您的问题有点不完整:

  • 要查找字符串还是单词?那么,当奥赛罗这个词出现时,这算是你好吗
  • 在你的问题中,
    when
    后面有空格。这是故意的吗
  • 您想知道这三个单词是否都在文件中,还是其中一个单词就足够了
一般的解决方案是使用
grep
egrep
搜索文件中的文本。确切的命令行取决于上述问题的答案

  • 要搜索单词(
    Othello
    不算
    hello
    ),您需要将
    -w
    选项传递给grep
  • 我认为空格是个错误
当你需要所有的单词时,你可以做
egrep-wo'hello | who | When'| sort-u
egrep
命令查找给定单词的所有实例,并每行打印一个实例。在这一点上,您将有许多副本。因此,
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
[更新:]

第二个代码段还检查给定文件是否包含所有三个单词。每个
if
子句检查其中一个单词。
-l
(小写的ell)到
egrep
的选项可能会加快速度,但您可能根本不需要该选项

通常,
egrep
打印与给定表达式匹配的所有行(在本例中为您的三个单词)。因为我们不需要那个输出,所以我们使用箭头操作符
将它重定向到一个名为
/dev/null
的特殊文件。您写入该文件的任何内容都将被丢弃

if
语句将另一个命令作为其参数,如果该命令成功返回,则执行
分支。
egrep
命令的优点是,如果文件中包含给定的搜索表达式,它将成功返回,因此这两个内容完全匹配


为了进一步阅读,您应该尝试开放组网站上的参考文档:

您的问题有点不完整:

  • 要查找字符串还是单词?那么,当奥赛罗这个词出现时,这算是你好吗
  • 在你的问题中,
    when
    后面有空格。这是故意的吗
  • 您想知道这三个单词是否都在文件中,还是其中一个单词就足够了
一般的解决方案是使用
grep
egrep
搜索文件中的文本。确切的命令行取决于上述问题的答案

  • 要搜索单词(
    Othello
    不算
    hello
    ),您需要将
    -w
    选项传递给grep
  • 我认为空格是个错误
当你需要所有的单词时,你可以做
egrep-wo'hello | who | When'| sort-u
egrep
命令查找给定单词的所有实例,并每行打印一个实例。在这一点上,您将有许多副本。因此,
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
[更新:]

第二个代码段还检查给定文件是否包含所有三个单词。每个
if
子句检查其中一个单词。
-l
(小写的ell)到
egrep
的选项可能会加快速度,但您可能根本不需要该选项

通常,
egrep
打印与给定表达式匹配的所有行(在本例中为您的三个单词)。因为我们不需要那个输出,所以我们使用箭头操作符
将它重定向到一个名为
/dev/null
的特殊文件。您写入该文件的任何内容都将被丢弃

if
语句将另一个命令作为其参数,如果该命令成功返回,则执行
分支。
egrep
命令的优点是,如果文件中包含给定的搜索表达式,它将成功返回,因此这两个内容完全匹配


如需进一步阅读,请尝试Open Group网站上的参考文档:

谢谢您提供详细信息。。这很有帮助。。我想知道单词和空格在什么时候是偶然的我想知道这三个单词是否都在那里,然后我只想做一些处理,但我不知道你们两种方法之间有什么区别,请像你们第一种方法一样对第二种方法进行说明,谢谢。还有,egrep-wo中的-wo代表什么。是egrep-w吗