346

我想在 bash 中检查文件是否包含特定字符串。我使用了这个脚本,但它不起作用:

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

我的代码有什么问题?

4

11 回答 11

618
if grep -q SomeString "$File"; then
  Some Actions # SomeString was found
fi

你不需要[[ ]]这里。直接运行命令即可。-q当您不需要找到时显示的字符串时添加选项。

grep命令根据搜索结果在退出代码中返回 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
$

如您所见,您直接在此处运行程序。没有额外的[][[]]

于 2012-07-02T04:47:14.737 回答
67

如果要检查文件是否包含特定字符串,可以按以下方式进行。

if ! grep -q SomeString "$File"; then
  Some Actions # SomeString was not found
fi
于 2019-07-23T06:51:10.970 回答
45

除了告诉您如何做您想做的事情的其他答案外,我还尝试解释出了什么问题(这就是您想要的。

在 Bash 中,if后面是一个命令。如果此命令的退出代码等于 0,则then执行该部分,否则执行该else部分(如果有)。

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

[[是一个内部 bash 命令,专用于某些测试,例如文件存在、变量比较。同样是一个外部命令([它通常位于/usr/bin/[]]]]

在这里你不需要[[也不需要[

另一件事是你引用事物的方式。在 bash 中,只有一种情况会嵌套引号对,即"$(command "argument")". 但是在'grep 'SomeString' $File'你只有一个词,因为'grep '是一个带引号的单位,它与 连接SomeString,然后再次与 连接' $File'。由于使用了单引号,该变量$File甚至没有被其值替换。正确的做法是grep 'SomeString' "$File".

于 2013-08-01T08:48:48.483 回答
15

最短(正确)版本:

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

也可以写成

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

但是在这种情况下您不需要显式测试它,因此与以下内容相同:

grep -q "something" file && echo "yes" || echo "no"
于 2012-07-23T12:17:49.220 回答
12
##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
于 2015-02-06T06:59:07.763 回答
11
grep -q [PATTERN] [FILE] && echo $?

如果找到模式,则退出状态为0(true);否则为空字符串。

于 2016-05-27T11:28:38.853 回答
8

如果您想检查字符串是否与整行匹配并且如果它是固定字符串,您可以这样做

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.)
于 2017-04-11T10:27:42.030 回答
7
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
于 2016-01-29T00:15:17.203 回答
4

试试这个:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi
于 2017-11-16T10:41:21.603 回答
-1

我做了这个,似乎工作正常

if grep $SearchTerm $FileToSearch; then
   echo "$SearchTerm found OK"
else
   echo "$SearchTerm not found"
fi
于 2013-08-01T08:23:44.757 回答
-3
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"
于 2012-07-02T09:36:54.963 回答