我正在写一个 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
将包含数字0
、1
或2
。然后你可以使用一个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"
这将始终打印输出,但仍会返回正确的错误代码。