有没有一种bash脚本,可以使用grep命令返回结果为true?
例如:在我的CF日志中有1000条103.12.88记录。如果检测到1个或多个结果,能否进行grep 103.12.88操作并打印/输出结果,显示YES或True。
这个问题的实际答案是在命令的末尾添加|| true
,例如:
echo thing | grep x || true
这仍然会输出0返回代码。
ret=$( echo thing | grep x || true )
和ret=$( echo thing | grep -q x; echo $?; )
进行比较。前者使$ret
为空,而后者加载退出代码。也许你的意思是echo thing | grep x && echo true
? - Paul Hodges虽然问题的标题有误导性,但由于它还没有被更改,我认为对于那些正在寻找答案的人来说,回答这个特定的问题很重要。而答案很简单:grep -v
可以实现:它反转了退出代码。
$ echo thing | grep x -vqz
$ echo $?
0
$ echo thing | grep thing -vqz
$ echo $?
1
-z
参数来将整个文件流作为一行处理;否则,在多行文件中,即使找到匹配项或没有找到匹配项,也会得到退出状态0。(-q
标志只是用于抑制输出)value=$( grep -ic "210.64.203" /var/logs )
将value
设置为grep的输出,而不是其返回代码。
执行命令后,退出代码存储在$?
中,但通常不需要它。
if grep -ic "210.64.203" /var/logs
then echo "Found..."
else echo "not found"
fi
rec="$( grep -ic "210.64.203" /var/logs )"
if [ -n "$rec" ] ; then echo found; fi
bash
,则可以:if [[ "$rec" ]] ; then echo found; fi
if [[ -n "$rec" ]] ; then echo found; fi
if [ ! "$rec" = "" ]
,一般来说更好的方式是写成 if [ -n "$rec" ]
。 - William Pursellbash
中总是和[[
一起使用它,但由于我很少使用[
,所以在测试时没有想到尝试它。谢谢。 - Paul Hodges[user@host ~]$ cat ~/mylogfile.txt
no secrets here
[user@host ~]$ grepnot(){ ! grep $1 $2; return $?;}
[user@host ~]$ grepnot password mylogfile.txt
[user@host ~]$ echo $?
0
[user@host ~]$ grepnot secret mylogfile.txt
no secrets here
[user@host ~]$ echo $?
1
注意:我在Jenkins管道中使用“grepnot”。我的上一个答案使用了“1 - $?”来反转返回代码。但是那个解决方案仍然导致管道中的grep失败。上面的解决方案(借鉴了以前的“!”答案)可以与管道一起使用。
实际上我会做到这一点
echo thing | ( grep x || [ "$?" == "1" ] ) | <next command>
为了捕获可能发生的任何错误(磁盘、内存等),这尤其适用于在脚本中使用set -e
的情况。
https://www.gnu.org/software/grep/manual/html_node/Exit-Status.html
echo thing | grep x && exit 1
- Sam如果你想在 grep 没有找到匹配时返回成功,更容易的方法是取反其输出:
echo "Hello, World" | not grep -q "Friend" && echo "No match"
这将打印No match
,因为在输出中未找到"Friend"。
echo "Hello, World" | not grep -q "Hello" && echo "No match"
这段代码不会输出任何内容,因为在输出中找到了was。
请注意,我们使用了标志-q
(如--quiet
),因此grep不会写入输出,但如果找到匹配项,则以状态0退出。
not
似乎是随 LLVM
一起安装的程序(我已经安装了)。我会尝试收集更多信息来更新我的答案,但感谢你注意到了这个问题。 - Telmo Trooper!
所起到的作用类似于反转程序中的 not
命令:它可以'反转'状态码。因此,! true
的退出状态码为 1,而 ! false
的退出状态码为 0。 - ob-ivan!:
视为一个单独的标记,无法识别此命令,但! :
是两个独立的标记:一个是"not",一个是"true"。 - undefined
grep
会返回0,否则返回非零值。 - William Pursell0
表示成功,非零表示失败。这是一个重要的约定。 - William Pursellgrep -v
可以做到。我将发布一个单独的答案。 - vp124