我有一个脚本,如果它运行,每次输出大约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
为例,但应该用我上面提到的脚本替换它。
问题是,如何在cat /etc/password
/ if
条件下获取elif
的输出?
答案 0 :(得分:7)
正如@Benoit建议的那样,只需直接使用grep
。
正如@larsmans所说,你可以通过将文件读入变量一次来避免双重读取文件。
鉴于bash
的可用性,我会这样做:
password=$(< /etc/passwd)
if grep -q root <<< "$password" ; then
echo root found
elif grep -q nobody <<< "$password" ; then
echo nobody found
fi
一次读取文件,一次或两次调用grep
,没有启动其他进程或子shell。
答案 1 :(得分:3)
你这样做:
if grep -q "root" /etc/passwd ; then
...
fi
如果grep退出代码为0,将播放...
命令。
请记住\[
is a external command,可能位于/usr/bin/[
(通常是test
的硬链接,当调用[
时,它需要匹配的]
参数)。另请参阅此处的pitfalls页面,其中许多内容与该命令相关。
答案 2 :(得分:3)
我建议使用awk:
cat /etc/passwd | awk '/root/{ do something }/nobody/{ do something else }'
你可以使用像这样的表达式在bash中实现相同的目标:
cat /etc/passwd |
while read; do
if echo "$REPLY" | fgrep root; then
something
fi
if echo "$REPLY" | fgrep nobody; then
something_else
fi
done
然而,纯粹的bash解决方案对大型输入的效率较低,因为它为每一行运行单独的grep
实例。
答案 3 :(得分:2)
使用子shell可以使用if语句,但是由于您在管道上运行了两个grep
命令,该解决方案将会中断,第一个命令会耗尽它。
您的案例中最好的解决方案可能是将/etc/passwd
读入变量,然后grep
:
passwd=$(cat /etc/passwd)
if (echo $passwd | grep -q root); then
echo "root found"
fi
if (echo $passwd | grep -q nobody); then
echo "nobody found"
fi
答案 4 :(得分:1)
只需使用&amp;&amp;:
grep -q root /etc/password && echo "root is found"
grep -q nobody /etc/password && echo "nobody is found"
答案 5 :(得分:1)
以下内容如何:
#!/bin/bash
if [ -z $1 ]; then
echo Usage: $0 [UID to search for]
exit 1;
fi
SEARCHID="$1"
function notFound() {
echo NOT FOUND
}
function found() {
echo Found it
}
function main() {
grep -i $SEARCHID /etc/passwd
# Move $? to a variable
SEARCHRESULT=$?
if [ "$SEARCHRESULT" != "0" ]; then
notFound;
else
found;
fi
}
# call main function
main
答案 6 :(得分:0)
在一般情况下,您可以使用临时文件。
t=$(mktemp -t passwd.XXXXXXXX)
trap 'rm $t' 0
trap 'exit 127' 1 2 3 5 15
cat >$t
for u in root nobody; do
fgrep $u $t
done
trap
之后将删除临时文件。
顺便说一下,你可以管道到if
,但条件中的第一个grep
已经消耗了它的所有标准输入。在这种情况下它更有用:
if $option_count ; then
wc -l
else
tac
fi <file