在Bash脚本中解析命令输出

时间:2010-11-25 12:13:22

标签: linux bash scripting

我想运行一个命令,它提供以下输出并解析它:

[VDB VIEW]
[VDB] vhctest
        [BACKEND] domain.computername: ENABLED:RW:CONSISTENT
        [BACKEND] domain.computername: ENABLED:RW:CONSISTENT
        ...

我只对一些关键作品感兴趣,例如'ENABLED'等。我不能只搜索ENABLED,因为我需要一次解析每一行。

这是我的第一个剧本,我想知道是否有人可以帮助我?

编辑: 我现在有:

cmdout=`mycommand`

while read -r line
do
   #check for key words in $line
done < $cmdout

我认为这样做了我想要的但是它似乎总是在命令输出之前输出以下内容。

  

./ myscript.sh:29:无法打开...:没有这样的文件

我不想写文件来实现这一点。

这是psudo代码:

cmdout=`mycommand`

loop each line in $cmdout
   if line contains $1
       if line contains $2
            output 1
       else
            output 0

3 个答案:

答案 0 :(得分:5)

错误的原因是

done < $cmdout

认为$cmdout的内容是文件名。

您可以这样做:

done <<< $cmdout

done <<EOF
$cmdout
EOF

done < <(mycommand)    # without using the variable at all

done <<< $(mycommand)

done <<EOF
$(mycommand)
EOF

mycommand | while
...
done

但是,最后一个创建了一个子shell,当循环退出时,循环中设置的所有变量都将丢失。

答案 1 :(得分:3)

答案 2 :(得分:0)

$ cat test.sh
#!/bin/bash
while read line ; do
if [ `echo $line|grep "$1" | wc -l` != 0 ]; then
    if [ `echo $line|grep "$2" | wc -l` != 0 ]; then
        echo "output 1"
    else
        echo "output 0"
    fi
fi

done

USAGE

$ cat in.txt | ./test.sh ENABLED  RW
output 1
output 1

这不是最好的解决方案,但它可以逐字翻译你想要的东西,并且应该给你一些开始并添加你自己的逻辑