如何使用Bash检查文件是否包含特定字符串

时间:2012-07-02 04:40:12

标签: bash shell grep

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

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

我的代码出了什么问题?

11 个答案:

答案 0 :(得分:381)

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的条件。如果命令在其exitcode中返回0,则表示条件为真;否则是假的。

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

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

答案 1 :(得分:29)

除了告诉你如何做你想做的其他答案之外,我还试着解释出错了什么(这就是你想要的。

在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"

答案 2 :(得分:9)

##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

答案 3 :(得分:5)

grep -q [PATTERN] [FILE] && echo $?

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

答案 4 :(得分:3)

最短(正确)版本:

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"

答案 5 :(得分:3)

id | name
1  | Mike
2  | Jack

id | id_client | title | due_date   | sort
1  | 1         | Xxxx  | 2016-01-22 | 0
2  | 1         | Xxxx  | 2016-01-24 | 1
3  | 2         | Xxxx  | 2016-01-28 | 0

示例

->createQueryBuilder()
            ->select("a.*","b.*")
            ->from("table_a", "a")
            ->leftJoin("a", "table_b", "b", "a.id = b.id_client")
            ->addOrderBy('b.due_date', 'ASC')
            ->addOrderBy('b.sort', 'ASC')

答案 6 :(得分:2)

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

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.)

答案 7 :(得分:1)

试试这个:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:-3)

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