我有一个脚本,如果它运行,每次输出大约10行。这些行的内容各不相同。
我真的希望能够在输出中grep
,并根据输出做不同的事情。
在伪这是我想做的
cat /etc/password | \\
if [ grep "root" $STDOUT ]; then
echo "root is found"
elif [ grep "nobody" $STDOUT ]; then
echo "nobody is found"
fi
字符串
这里我使用了cat /etc/password
作为示例,但它应该被上面提到的脚本所取代。
问题是,如何在if
/elif
条件下获得cat /etc/password
的输出?
8条答案
按热度按时间8iwquhpp1#
正如@Benoit建议的那样,直接使用
grep
即可。正如@larsmans所指出的,你可以通过将文件阅读到一个变量中来避免对文件的双重读取。
考虑到
bash
的可用性,我会这样做:字符串
一次文件读取,一次或两次
grep
调用,没有启动其他进程或子shell。6fe3ivhb2#
我建议使用awk:
字符串
你可以在bash中使用如下表达式实现同样的效果:
型
然而,纯bash解决方案对于大输入的效率较低,因为它为每行运行单独的
grep
示例。ybzsozfc3#
你只需要:
字符串
如果grep exit code为0,它将播放
...
命令。请记住
\[
is a external command,可能位于/usr/bin/[
中(通常它是到test
的硬链接,当作为[
调用时,它需要匹配的]
参数)。也请参阅pitfalls页面,其中许多交易都与该命令有关。z9zf31ra4#
使用子shell可以通过管道连接到if语句,但是这种解决方案会失败,因为您要在管道上运行两个
grep
命令,其中第一个命令将耗尽管道。在你的情况下,最好的解决方案可能是将
/etc/passwd
读入一个变量,然后grep
:字符串
h5qlskok5#
使用&&:
字符串
kyvafyod6#
下面的例子如何:
字符串
pvcm50d17#
在一般情况下,您可以使用临时文件。
字符串
trap
将在之后删除临时文件。顺便说一句,你可以通过管道连接到
if
,但是条件中的第一个grep
已经消耗了它的所有标准输入。在这种情况下它更有用:型
dgiusagp8#
我有一个不带
if
关键字的pipe
to语句的简单示例:字符串
else
太简单了:型
例如,你想检查http响应的状态码是否等于200:
型