bash中单次操作获取grep的输出和返回值

bash中单次操作获取grep的输出和返回值

我正在写一个 bash 脚本;我执行某个命令并 grep 。

pfiles $1 2> /dev/null | grep name # $1 Process Id

响应将类似于:

sockname: AF_INET6 ::ffff:10.10.50.28  port: 22
peername: AF_INET6 ::ffff:10.16.6.150  port: 12295

响应可以是无行、1 行或 2 行。
如果 grep 没有返回任何行(grep 返回代码 1),我将中止脚本;如果我得到 1 行,则调用 A() 或 B()(如果超过 1 行)。当输出为1-2行时,grep的返回码为0。

grep 有返回值(0 或 1)和输出。
我怎样才能抓住他们两个?如果我做类似的事情:

OUTPUT=$(pfiles $1 2> /dev/null | grep peername)

然后变量 OUTPUT 将有输出(字符串);我还想要 grep 执行的布尔值。

答案1

您可以使用

output=$(grep -c 'name' inputfile)

该变量output将包含数字012。然后你可以使用一个if语句来执行不同的事情。

答案2

这相当简单:

OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
grep_return_code=$?

如果$(…)将命令替换分配给变量, $?将从$(…).当然,您不需要$?明确引用;你可以做类似的事情

if OUTPUT=$(pfiles "$1" 2> /dev/null | grep 对等名)
然后
    #脚本的其余部分

或者

如果OUTPUT=$(pfiles "$1" 2> /dev/null | grep 对等名)
然后
    出口
#脚本的其余部分

这种方法在以下情况下很有用:输出该命令及其返回码(又名退出状态)不相关。但是,对于grep,它们是高度相关的:如果它产生了输出,那么它就成功了。如果没有产生输出,则失败。那么为什么不直接测试一下输出 ?

OUTPUT=$(pfiles "$1" 2> /dev/null | grep 对等名)
如果[“$输出”]
然后
    #脚本的其余部分

或者

OUTPUT=$(pfiles "$1" 2> /dev/null | grep 对等名)
如果 [-z“$输出”]
然后
    出口
#脚本的其余部分

PS 你应该总是引用你的 shell 变量引用(例如,"$1"),除非你有充分的理由不这样做,并且你确定你知道你在做什么。

答案3

如果您需要 的结果grep,则不能使用-c其他答案中概述的标志。不过,您可以做的是运行两次,一次使用-c标志来获取匹配项的数量,一次不使用-c标志来查看匹配项。但是,这可能非常低效,具体取决于输入文件的大小。

你可以这样做:

内容输入

The first line is foo
I have a drink at the bar
The third line is foo again

内容脚本

#!/usr/bin/env bash

countMatches(){
    echo Searching for "${1}"
    result=$(grep "${1}" input)
    if [ "$?" -ne 0 ]; then
        echo No match found
        echo
        exit 1
    fi

    if [ $(echo "${result}" | wc -l) -eq 1 ]; then
        echo 1 match found:
        echo "${result}"
        echo
    else
        echo 2 matches found:
        echo "${result}"
        echo
    fi
}

countMatches foo
countMatches bar
countMatches baz

这是调用时的输出脚本

Searching for foo
2 matches found:
The first line is foo
The third line is foo again

Searching for bar
1 match found:
I have a drink at the bar

Searching for baz
No match found

答案4

我在尝试弄清楚如何使用 grep 作为某些管道输出的测试时遇到了这个问题,同时仍然显示该输出。请注意,我不是在 grep 文件,而是在 stdin。

我的具体例子如下:

./manage.py --dry-run makemigrations | grep "No changes detected"

当 时,返回码为 0(成功)No changes detected。当有更改时,返回码为 1(失败) - 但 grep 不匹配,因此不会打印所需的更改!

我的解决方案如下

./manage.py --dry-run makemigrations | tee /dev/stderr | grep -q "No changes detected"

这将始终打印输出,但仍会返回正确的错误代码。

相关内容