我想在 bash 中检查文件是否包含特定字符串。我使用了这个脚本,但它不起作用:
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
我的代码有什么问题?
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
$
如您所见,您直接在此处运行程序。没有额外的[]
或[[]]
。
如果要检查文件是否不包含特定字符串,可以按以下方式进行。
if ! grep -q SomeString "$File"; then
Some Actions # SomeString was not found
fi
除了告诉您如何做您想做的事情的其他答案外,我还尝试解释出了什么问题(这就是您想要的。
在 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"
.
最短(正确)版本:
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"
##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 [PATTERN] [FILE] && echo $?
如果找到模式,则退出状态为0
(true);否则为空字符串。
如果您想检查字符串是否与整行匹配并且如果它是固定字符串,您可以这样做
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 -q [string] [filename]
then
[whatever action]
fi
例子
if grep -q 'my cat is in a tree' /tmp/cat.txt
then
mkdir cat
fi
试试这个:
if [[ $(grep "SomeString" $File) ]] ; then
echo "Found"
else
echo "Not Found"
fi
我做了这个,似乎工作正常
if grep $SearchTerm $FileToSearch; then
echo "$SearchTerm found OK"
else
echo "$SearchTerm not found"
fi
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"