【问题标题】:grep return 0 if no matchgrep 如果不匹配则返回 0
【发布时间】:2020-01-07 08:55:54
【问题描述】:

是否有任何 bash 脚本可以使用命令 grep 向我返回 result=true?

示例:我的 CF 日志中有 103.12.88 的 1000 条记录。 如果检测到 1 个或多个结果,我可以执行 grep 103.12.88,然后打印/输出结果显示 YES 或 True

【问题讨论】:

  • 我已经尝试过了,但结果 value=$( grep -ic "210.64.203" /var/logs ) if [ $value -eq 1 ] then echo "I found 210.64.203" result出来第 2 行:[:参数太多
  • 这道题的题目有点奇怪。如果没有匹配,那通常应该被认为是失败,所以返回 0 是不合适的。实际上,grep 如果匹配则返回 0,否则返回非零。
  • 嗨,William,实际上,如果没有找到结果,我更喜欢输出。所以,我在想“0”意味着否/假
  • 因此我的评论。在 shell 中0 表示成功。非零意味着失败。这是一个重要的约定。
  • 您好,William,请注意并感谢!

标签: grep return match


【解决方案1】:

这个问题的实际答案是在命令末尾添加|| true,例如:

echo thing | grep x || true

这仍然会输出 0 返回码。

【讨论】:

  • 不,它没有。这会强制返回 0 return,但根本不会产生 output。尝试ret=$( echo thing | grep x || true )ret=$( echo thing | grep -q x; echo $?; ) 前者将$ret 留空。后者加载退出代码。也许你的意思是echo thing | grep x && echo true
  • 不。无论 grep 是否匹配(在示例中不匹配),我都希望始终返回 0 返回码。
  • 退出代码和输出是分开的。 OP 说Can I do a grep 103.12.88 if detect 1 or more results then print/output result show me either YES or True,这是输出。您的解决方案很好,它只是不符合措辞不佳的 OP 所要求的。
【解决方案2】:

如果您想在 grep 上返回成功但找不到匹配项,则更容易否定其输出:

echo "Hello, World" | not grep -q "Friend" && echo "No match"

这将打印No match,因为在输出中找不到“朋友”。

echo "Hello, World" | not grep -q "Hello" && echo "No match"

由于在输出中找到朋友 ,因此不会打印任何内容。

请注意,我们使用标志 -q(如 --quiet),因此 grep 不会写入输出,但如果找到匹配项,则会以状态 0 退出。

【讨论】:

  • 这不起作用 - bash 中没有 not,第二行确实打印了。您使用的是不同的外壳吗?
  • 既然你提到了,看来notLLVM 附带的程序(我已经安装了)。我会尝试收集更多信息来更新我的答案,但感谢您注意到这个问题。
  • 想知道为什么它对我不起作用:)
  • 一个感叹号 ! 的作用与响应者的 not 程序的作用相同:它“反转”状态码。所以! true 以状态码 1 退出,! false 以状态码 0 退出。
【解决方案3】:
[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 失败。上述解决方案(借鉴了之前的“!”答案)适用于管道。

【讨论】:

    【解决方案4】:

    您正在错误地处理返回值。

    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" ]更干净
    • 已编辑。我总是在bash 中将它与[[ 一起使用,但由于我很少使用[,所以我在测试时没有想到要尝试它。谢谢。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多