Arrays Bash字符串数组

Arrays Bash字符串数组,arrays,bash,snmp,Arrays,Bash,Snmp,我有一个bash脚本,它收集snmp信息,并在其中搜索要提醒的关键短语 我使用snmp命令从网络设备输出日志,这是代码和原始输出的示例- /usr/bin/snmpwalk -v 2c -c public $HOST .1.3.6.1.3.94.1.11.1.9.32.128.0.192.255 SNMPv2-SMI::experimental.94.1.11.1.9.32.128.0.192.255.27.228.239.0.0.0.0.0.0.0.0.251 = STRING: "Host

我有一个bash脚本,它收集snmp信息,并在其中搜索要提醒的关键短语

我使用snmp命令从网络设备输出日志,这是代码和原始输出的示例-

/usr/bin/snmpwalk -v 2c -c public $HOST .1.3.6.1.3.94.1.11.1.9.32.128.0.192.255

SNMPv2-SMI::experimental.94.1.11.1.9.32.128.0.192.255.27.228.239.0.0.0.0.0.0.0.0.251 = STRING: "Host link down. (port: 1)"
SNMPv2-SMI::experimental.94.1.11.1.9.32.128.0.192.255.27.228.239.0.0.0.0.0.0.0.0.252 = STRING: "Host link up. (port: 1, speed: 8 Gbps, number of loop ID(s):"
SNMPv2-SMI::experimental.94.1.11.1.9.32.128.0.192.255.27.228.239.0.0.0.0.0.0.0.0.253 = STRING: "A scrub-vdisk job was started. (vdisk: test, SN: 00c0ff1bf86d0000a6c09c5600000000)"
SNMPv2-SMI::experimental.94.1.11.1.9.32.128.0.192.255.27.228.239.0.0.0.0.0.0.0.0.254 = STRING: "A scrub-vdisk job completed. No errors were found. (vdisk: test, SN: 00c0ff1bf86d0000a6c09c5600000000)"
SNMPv2-SMI::experimental.94.1.11.1.9.32.128.0.192.255.27.228.239.0.0.0.0.0.0.0.0.255 = STRING: "Host link down. (port: 1)"
在我的bash脚本中,我从中创建了一个数组,并在开始时去掉了凹凸-

declare -a LOG=($(/usr/bin/snmpwalk -v 2c -c public $HOST $OID | cut -d" " -f 4-))
这就产生了这个-

"Host link down. (port: 1)"
"Host link up. (port: 1, speed: 8 Gbps, number of loop ID(s):"
"A scrub-vdisk job was started. (vdisk: test, SN: 00c0ff1bf86d0000a6c09c5600000000)"
"A scrub-vdisk job completed. No errors were found. (vdisk: test, SN: 00c0ff1bf86d0000a6c09c5600000000)"
"Host link down. (port: 1)"
我的问题是,这个数组将每个单词视为一个单独的条目,因此我的实际输出如下-

"Host 
link 
down. 
(port: 
1)"
因此,每当我搜索单个单词时,它都可以正常工作,但当我搜索短语时,它就会中断

理想情况下,我希望它将每行文本存储为数组中自己的条目,如下所示-

declare -a LOG=('"Host link down. (port: 1)"' '"Host link up. (port: 1, speed: 8 Gbps, number of loop ID(s):"') etc
我只是不知道如何操纵原始的声明行来实现这一点

这是我所有的代码-

HOST="10.10.10.10"
OID=".1.3.6.1.3.94.1.11.1.9.32.128.0.192.255"
declare -a CRITICAL=('errors' 'An event was reported by a disk drive')

declare -a LOG=($(/usr/bin/snmpwalk -v 2c -c public $HOST $OID | cut -d" " -f 4-))

for RESULT in `echo ${LOG[*]}`
    do
    for WORD in `echo ${CRITICAL[*]}`
        do
            case "$RESULT" in
                *$WORD*)
                    OUTPUT+="$RESULT -CRITICAL "
                    ;;
                *)
                    OUTPUT+="$RESULT "
            esac    

        done
done
如果将IFS()变量设置为
\n
,它应该可以实现您想要的功能

IFS=$'\n' declare -a LOG=($(/usr/bin/snmpwalk -v 2c -c public $HOST $OID | cut -d" " -f 4-))
迭代结果的方式也存在问题。请尝试以下操作,以免将各行拆分为单词(由*运算符执行)


嗨,为你的回答干杯-我试过了,但现在它已经把所有的线连接在了一个大的单一arry条目中。。。此外,它还删除了文本中所有的字母“n”!我犯了一个错误(省略了
$
),您能再试一次吗?啊,是的,这非常接近-唯一的问题是它现在将每个单词添加到数组中的一个条目中,而不是为每行添加单独的条目。但它能够搜索字符串。关于把台词弄好还有什么想法吗?
for RESULT in "${LOG[@]}"
    do
    for WORD in "${CRITICAL[@]}"
        do