如何检查文件是否包含使用bash的特定string
我想检查一个文件是否包含特定的string或不在bash中。 我使用这个脚本,但它不起作用:
if [[ 'grep 'SomeString' $File' ]];then Some Actions fi
我的代码有什么问题?
if grep -q SomeString "$File"; then Some Actions fi
这里你不需要[[ ]]
。 只需直接运行命令。 添加-q
选项,当你不需要find它时显示的string。
grep
命令根据search结果在退出代码中返回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 $
正如你所看到的,你直接在这里运行程序。 没有额外的[]
或[[]]
。
除了其他的答案,告诉你如何做你想要的,我试图解释什么是错的(这是你想要的。
在Bash中, if
是跟着一个命令。 如果该命令的退出代码等于0,则执行该部分,否则执行该部分(如果有的话)。
您可以使用其他答案中解释的任何命令来执行此操作: if /bin/true; then ...; fi
if /bin/true; then ...; fi
[[
是一个内部bash命令专用于一些testing,如文件存在,variables比较。 类似地[
外部命令(通常位于/usr/bin/[
]中,执行大致相同的testing,但需要]
作为最后一个参数,这就是为什么]
必须填充左边的空格,而不是与]]
的情况。
在这里,你不需要[[
也[
。
另一件事是你引用事物的方式。 在bash中,只有一对引用嵌套的情况,它是"$(command "argument")"
。 但在'grep 'SomeString' $File'
中只有一个单词,因为'grep '
是一个带引号的单位,它与SomeString
连接,然后再与' $File'
。 由于使用单引号,variables$File
甚至不会被其值取代。 正确的方法是grep 'SomeString' "$File"
。
##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(真);
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
最短(正确)版本:
grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"
也可以写成
grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"
但是在这种情况下你不需要明确地testing它,所以也一样:
grep -q "something" file && echo "yes" || echo "no"
我这样做,似乎工作正常
if grep $SearchTerm $FileToSearch; then echo "$SearchTerm found OK" else echo "$SearchTerm not found" fi
如果你想checkifstring匹配整行,如果它是一个固定的string,你可以这样做
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 -q "something" file [[ !? -eq 0 ]] && echo "yes" || echo "no"