【问题标题】:Bash array of stringsBash 字符串数组
【发布时间】:2016-02-25 11:43:34
【问题描述】:

我有一个 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

【问题讨论】:

    标签: arrays bash snmp


    【解决方案1】:

    如果您将 IFS (internal field separator) 变量设置为 \n,它应该会达到您想要的效果。

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

    您对结果进行迭代的方式也存在问题。请尝试以下操作,以免将单独的行拆分为单词(* 运算符会这样做)。

    for RESULT in "${LOG[@]}"
        do
        for WORD in "${CRITICAL[@]}"
            do
    

    【讨论】:

    • 嗨,为你的回复干杯——我试过了,但现在它已经把所有的行加入到一个大的单一条目中......而且,它已经去掉了所有的字母 'n's out文本!
    • 我出错了(省略了$),你能再试一次吗?
    • 啊,是的,这已经非常接近了——唯一的问题是它现在将每个单词都添加到数组中的一个条目中,而不是为每一行添加一个单独的条目。但它能够搜索字符串。对正确的线条有任何进一步的想法吗?
    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多