我想检查文件是否包含特定的字符串或不包含在bash中。我使用了此脚本,但是它不起作用:
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
我的代码有什么问题?
command
:stackoverflow.com/questions/12375722/…–
我想检查文件是否包含特定的字符串或不包含在bash中。我使用了此脚本,但是它不起作用:
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
我的代码有什么问题?
command
:stackoverflow.com/questions/12375722/…–
Answers:
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
-m 1
以提高扫描性能。在第一次出现时返回。
SomeString
包含正则表达式特殊字符(如.
),则可能会得到意外的结果。始终使用fgrep
(或grep -F
)更安全(除非您确实需要使用正则表达式,否则在这种情况下egrep
(或grep -E
)可能是最佳选择)
if
示例是错误的,因为它仅检查退出代码是否为非0。如果发生任何错误(例如无法读取文件),则退出代码也不为0。因此,您必须执行类似的操作ec=$?
,并检查是否0
(找到),是否1
(未找到),然后是否是其他(失败)。
除了其他答案(告诉您如何执行所需的操作)之外,我还将尝试解释错误的内容(这就是您想要的内容)。
在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"
。
如果要检查文件是否不包含特定字符串,可以按照以下步骤进行操作。
if ! grep -q SomeString "$File"; then
Some Actions # SomeString was not found
fi
##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 "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
。完全没有理由搞乱$?
。
如果您想检查字符串是否与整行匹配,并且是否为固定字符串,则可以使用这种方法
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
有充分的理由返回退出状态;将输出捕获到字符串中可能会将大量文本存储在缓冲区中,只是可以说它是非空的。
我做到了,似乎工作正常
if grep $SearchTerm $FileToSearch; then
echo "$SearchTerm found OK"
else
echo "$SearchTerm not found"
fi
grep
。
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"
$?
,而且根本没有必要-您可以这样做if grep -q ...
foo && truthy_action || falsey_action
它不是真正的三元运算符-如果truthy_action
失败,则会另外falsey_action
运行。
if
是运行的命令,并检查它的退出代码。您很少需要$?
显式检查。