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


Answers:


464
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,则表示条件为true;否则,条件为true。否则为假。

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

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


有关组件的更多信息grep和可用选项,请访问stackoverflow.com/a/4749368/1702557
Pawel


3
考虑使用-m 1以提高扫描性能。在第一次出现时返回。
AlikElzin-kilaka

1
如果SomeString包含正则表达式特殊字符(如.),则可能会得到意外的结果。始终使用fgrep(或grep -F)更安全(除非您确实需要使用正则表达式,否则在这种情况下egrep(或grep -E)可能是最佳选择)
Walter Tross

该示例if示例是错误的,因为它仅检查退出代码是否为非0。如果发生任何错误(例如无法读取文件),则退出代码也不为0。因此,您必须执行类似的操作ec=$?,并检查是否0(找到),是否1(未找到),然后是否是其他(失败)。
ddekany

40

除了其他答案(告诉您如何执行所需的操作)之外,我还将尝试解释错误的内容(这就是您想要的内容)。

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


15

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

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

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

2
更改目录通常不是一个好主意(这里完全没有必要,只需将文件名限定为目标目录即可)。然后,您所拥有的与被接受的答案完全相同,只是细节更少。

感谢您的建议Mat
Nevin Raj Victor

7

最短(正确)版本:

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"

3
if grep -q something file; then echo yes; else echo no; fi。完全没有理由搞乱$?
Charles Duffy 2013年

6

如果您想检查字符串是否与整行匹配,并且是否为固定字符串,则可以使用这种方法

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

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

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


4
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

2

试试这个:

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

3
我毫不犹豫地弃权,但是Stack Overflow不应使这种椒盐脆饼逻辑永存。 grep有充分的理由返回退出状态;将输出捕获到字符串中可能会将大量文本存储在缓冲区中,只是可以说它是非空的。
Tripleee '18


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

1
你有错字-!?应该是$?
lzap 2012年

...不仅是这样$?,而且根本没有必要-您可以这样做if grep -q ...
Charles Duffy 2013年

1
而且,foo && truthy_action || falsey_action它不是真正的三元运算符-如果truthy_action失败,则会另外falsey_action运行。
查尔斯·达菲

更一般地,目的if是运行的命令,并检查它的退出代码。您很少需要$?显式检查。
Tripleee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.