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

Posted

技术标签:

【中文标题】如何使用 Bash 检查文件是不是包含特定字符串【英文标题】:How to check if a file contains a specific string using Bash如何使用 Bash 检查文件是否包含特定字符串 【发布时间】:2012-07-02 12:34:59 【问题描述】:

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

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

我的代码有什么问题?

【问题讨论】:

类似于***.com/questions/4749330/… 这里是如何 grep command 的输出:***.com/questions/12375722/… 【参考方案1】:

如果你想检查文件是否包含特定的字符串,你可以这样做。

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

【讨论】:

假设您要测试的“输入文件”中有多个字符串。您可以将您的解决方案与cat(和xargs)结合起来吗?还是你需要一个 for 循环? 这是否可以将变量中的行与文本文件中的行进行比较?有没有办法设置多行来比较而不是 SomeString【参考方案2】:
grep -q [PATTERN] [FILE] && echo $?

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

【讨论】:

【参考方案3】:
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
$

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

【讨论】:

可能要考虑-Fxq参数,如***.com/a/4749368/544721 考虑使用-m 1 以提高扫描性能。在第一次出现时返回。 如果SomeString 包含正则表达式特殊字符(如.),您可能会得到意想不到的结果。始终使用fgrep(或grep -F)更安全(除非你真的需要正则表达式,在这种情况下egrep(或grep -E)可能是最好的选择) if 示例不正确,因为它只检查退出代码是否为非 0。如果发生任何错误,例如无法读取文件,退出代码也是非 0。所以你必须做类似ec=$?的事情,检查它是否是0(找到),然后是1(未找到),然后是别的东西(失败)。 if ! grep -q SomeString ... 如果要取反,请使用! 和空格。【参考方案4】:

试试这个:

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

【讨论】:

我犹豫着放弃反对这一点,但 Stack Overflow 不应该延续这种椒盐卷饼的逻辑。 grep 有充分的理由返回退出状态;将输出捕获到字符串中可能会将大量文本存储在缓冲区中,这样您就可以说它是非空的。【参考方案5】:

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

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】:
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

【讨论】:

【参考方案7】:
##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

【讨论】:

更改目录通常不是一个好主意(在这里完全没有必要,只需用目标目录限定文件名)。然后你所拥有的与接受的答案完全相同,只是细节更少。 感谢马特的建议【参考方案8】:

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

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

【讨论】:

【参考方案9】:

我做到了,似乎工作正常

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

【讨论】:

The quoting is broken,您可能希望避免看到来自grep 的输出。【参考方案10】:

最短(正确)版本:

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"

【讨论】:

if grep -q something file; then echo yes; else echo no; fi。完全没有理由惹$?【参考方案11】:
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"

【讨论】:

你有一个错字 - !?应该是 $? ...不仅是$?,而且根本不需要它——你可以这样做if grep -q ... 此外,foo && truthy_action || falsey_action 不是真正的三元运算符——如果truthy_action 失败,那么falsey_action 会运行另外 更一般地说,if目的 是运行命令并检查其退出代码。您应该很少需要明确检查 $?

以上是关于如何使用 Bash 检查文件是不是包含特定字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是包含子字符串并且在 Bash 中不包含 [重复]

如何检查字符串是否包含子字符串,而不是在Bash中

检查文件名包含bash脚本中的字符串

检查文件是不是存在以及是不是包含特定字符串

如何检查字符串是不是包含特定单词?

如何检查字符串是不是包含特定单词?