我是shell scriptng的新手,我想检查一个文件中是否有3个字符串(“hello”,“who”,“when”等)。
当我谷歌awk,cat,grep等时,我发现了很多方法,什么是最好的方法,我怎么能这样做。
我只需要知道字符串是否存在。
答案 0 :(得分:1)
你的问题有点不完整:
Othello
出现时,是否会计为hello
?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
[更新:]
此第二个代码段还会检查给定文件是否包含 all 三个单词。每个if
子句检查其中一个单词。选项-l
(小写字母)到egrep
使其可能更快,但您可能根本不需要该选项。
通常egrep
打印所有与给定表达式匹配的行(在本例中为三个单词)。由于我们不需要该输出,因此我们使用箭头运算符>
将其重定向到名为/dev/null
的特殊文件。无论你写入该文件的是什么都被丢弃。
if
语句将另一个命令作为其参数,如果该命令成功返回,则采用then
分支。关于egrep
命令的好处是,如果文件中包含给定的搜索表达式,它会成功返回,因此这两件事完全吻合在一起。
如需进一步阅读,请尝试使用Open Group网站上的参考文档:http://www.google.com/search?q=opengroup+grep