如何检查文件是否包含使用bash的特定string

我想检查一个文件是否包含特定的string或不在bash中。 我使用这个脚本,但它不起作用:

if [[ 'grep 'SomeString' $File' ]];then Some Actions fi 

我的代码有什么问题?

  if grep -q SomeString "$File"; then Some Actions fi 

这里你不需要[[ ]] 。 只需直接运行命令。 添加-q选项,当你不需要find它时显示的string。

grep命令根据search结果在退出代码中返回0或1。 0,如果有东西被发现; 1否则。

 $ echo hello | grep hi ; echo $? 1 $ echo hello | grep he ; echo $? hello 0 $ echo hello | grep -q he ; echo $? 0 

您可以指定命令作为if的条件。 如果该命令的退出代码返回0,表示条件为真; 否则为假。

 $ if /bin/true; then echo that is true; fi that is true $ if /bin/false; then echo that is true; fi $ 

正如你所看到的,你直接在这里运行程序。 没有额外的[][[]]

除了其他的答案,告诉你如何做你想要的,我试图解释什么是错的(这是你想要的。

在Bash中, if是跟着一个命令。 如果该命令的退出代码等于0,则执行该部分,否则执行该部分(如果有的话)。

您可以使用其他答案中解释的任何命令来执行此操作: if /bin/true; then ...; fi if /bin/true; then ...; fi

[[是一个内部bash命令专用于一些testing,如文件存在,variables比较。 类似地[外部命令(通常位于/usr/bin/[ ]中,执行大致相同的testing,但需要]作为最后一个参数,这就是为什么]必须填充左边的空格,而不是与]]的情况。

在这里,你不需要[[[

另一件事是你引用事物的方式。 在bash中,只有一对引用嵌套的情况,它是"$(command "argument")" 。 但在'grep 'SomeString' $File'中只有一个单词,因为'grep '是一个带引号的单位,它与SomeString连接,然后再与' $File' 。 由于使用单引号,variables$File甚至不会被其值取代。 正确的方法是grep 'SomeString' "$File"

 ##To check for a particular string in a file cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory File=YOUR_FILENAME if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for then echo "Hooray!!It's available" else echo "Oops!!Not available" fi 
 grep -q [PATTERN] [FILE] && echo $? 

如果发现模式,退出状态为0(真);

 if grep -q [string] [filename] then [whatever action] fi 

 if grep -q 'my cat is in a tree' /tmp/cat.txt then mkdir cat fi 

最短(正确)版本:

 grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no" 

也可以写成

 grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no" 

但是在这种情况下你不需要明确地testing它,所以也一样:

 grep -q "something" file && echo "yes" || echo "no" 

我这样做,似乎工作正常

 if grep $SearchTerm $FileToSearch; then echo "$SearchTerm found OK" else echo "$SearchTerm not found" fi 

如果你想checkifstring匹配整行,如果它是一个固定的string,你可以这样做

 grep -Fxq [String] [filePath] 

  searchString="Hello World" file="./test.log" if grep -Fxq "$searchString" $file then echo "String found in $file" else echo "String not found in $file" fi 

从man文件中:

 -F, --fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.) -x, --line-regexp Select only those matches that exactly match the whole line. (-x is specified by POSIX.) -q, --quiet, --silent Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected. Also see the -s or --no-messages option. (-q is specified by POSIX.) 

尝试这个:

 if [[ $(grep "SomeString" $File) ]] ; then echo "Found" else echo "Not Found" fi 
 grep -q "something" file [[ !? -eq 0 ]] && echo "yes" || echo "no"