我需要使用一个if语句,该语句只有在服务状态命令输出中“被加载”和“正在运行”时才为真:
$groupservice status
service 1 is loaded
service 2 is running
如前所述,我尝试使用以下方法:
$service status | awk '/is loaded/ && /is running/'
但是我没有得到任何输出。运行它的唯一方法是这样做:
if [[ $(service status | grep "is loaded") ]] && [[ $(service status | grep "is running") ]]
但我更喜欢用更短的表达方式。我哪里错了?谢谢
发布于 2021-07-05 03:21:57
您可以在awk
中通过计数匹配数来做到这一点:
$ service status |
awk '/is loaded/{l++}
/is running/{r++}
(l && r){
print "found";
exit 0
}
END{
if (!(l && r)){
print "not found";
exit 1
}
}'
我唯一能想到的使用grep
的方法就是对文件进行两次grep
。就像这样:
service status |
grep -qF 'is loaded' && foo.sh |
grep -qF 'is running' &&
echo Found ||
echo "not found"
当然,这有一个竞争条件,如果service
的输出在两个调用之间发生变化,则可能得到不正确的结果。为了解决这个问题,您可以使用一个tmp文件:
service status > /tmp/file
grep -qF 'is loaded' /tmp/file &&
grep -qF 'is running' /tmp/file &&
echo Found ||
echo "not found"
发布于 2021-07-05 07:59:52
假设像在发布的示例输入中一样,service status
输出中没有空行,然后使用任何awk:
if service status | awk -v RS= '/is loaded/ && /is running/{f=1} END{exit !f}'; then
echo "Eureka!"
fi
Eureka!
显然,如果只需要打印一些内容,那么就不需要shell if
语句,也不需要提供awk的退出状态:
service status | awk -v RS= '/is loaded/ && /is running/{print "Eureka!"}'
Eureka!
如果有空行,并且有GNU,那么只需将RS=
更改为RS='^即可。
即可。
https://unix.stackexchange.com/questions/657052
复制相似问题