找到字符串后打印数组范围 KSH93 Version M

print array range once string is found KSH93 Version M

我需要打印一系列数组元素,从使用 KSH93 找到 "string" 点起的负 20 和正 20 个元素。

我尝试了很多次代码迭代并阅读了很多链接,例如, How do I iterate over a range of numbers defined by variables in Bash?

/usr/bin/ksh93 -c 'mdm=(`/usr/sbin/mdmprpt 2>/dev/null`);
for index in "${!mdm[@]}"; do
    if [[ ${mdm[$index]} =~ Fault.? ]]; then
        i=${mdm[$index]};
        for x in {1..$i}; do 
            echo $x
        done
     fi
done

实际结果是 {1..(错误}

何时应该在索引 52 之前和之后打印 20 行。理想情况下两者都打印。

__RawData__from_sample_code

mdm[32] 是 6400000000000000

mdm[33] 是 0000000000000000

mdm[34] 是 0000000000000000

mdm[35] 是 0000000000000000

mdm[36] 是 00000000

mdm[37] 是症状

mdm[38]是信息:

mdm[39] 崩溃

mdm[40] 是位置:

mdm[41] 是 [000000000010D614]

mdm[42] 是 IPRA.$ha_critic+114

mdm[43] 是组件:

mdm[44] 是 COMP

mdm[45] 是例外

mdm[46] 是类型:

mdm[47] 是 131

mdm[48] 是数据

mdm[49] 来自

mdm[50] 是 CPU

mdm[51] 是 #8

mdm[52] 是(故障

mdm[53] 是 CPU)

mdm[54] 是 backup_files

mdm[55] 是 cfgbackups

mdm[56] 是配置

mdm[57] 是 install.log

mdm[58] 是 ioscli.log

mdm[59] 是 pager.trace

mdm[60] 是规则

mdm[61] 是 smit.log

mdm[62] 是 smit.script

mdm[63] 是 smit.transaction

mdm[64] 是 snap.pax.Z

mdm[65] 是 MST

mdm[66] 是状态:

mdm[67] 是 R0:

mdm[68] 是 0000000000050FB4

mdm[69] 是 R1:

mdm[70] 是 F00000002FF471D0

mdm[71] 是 R2:

mdm[72] 是 00000000038B6110

好吧,我可以只使用一堆印刷品,它确实可以满足我的要求,但我认为我还没有开始工作的范围运算符。

    /usr/bin/ksh93 -c 'mdm=(`/usr/sbin/mdmprpt 2>/dev/null`);
    for index in "${!mdm[@]}"; do
    if [[ ${mdm[$index]} =~ Fault.? ]]; then
    print ${mdm[$index-20]}
     print ${mdm[$index-19]}
    print ${mdm[$index-18]}
    print ${mdm[$index-17]}
    print ${mdm[$index-16]}
    print ${mdm[$index-15]}
    print ${mdm[$index-14]}
    print ${mdm[$index-13]}
    print ${mdm[$index-12]}
    print ${mdm[$index-11]}
    print ${mdm[$index-10]}
    print ${mdm[$index-9]}
    print ${mdm[$index-8]}
    print ${mdm[$index-7]}
    print ${mdm[$index-6]}
    print ${mdm[$index-5]}
    print ${mdm[$index-4]}
    print ${mdm[$index-3]}
    print ${mdm[$index-2]}
    print ${mdm[$index-1]}
    print ${mdm[$index]}
    fi
    done'

6400000000000000

0000000000000000

0000000000000000

0000000000000000

00000000

症状

信息:

崩溃

地点:

[000000000010D614]

IPRA.$ha_critic+114

组件:

补偿

异常

类型:

131

数据

来自

CPU

8

(故障

当您找到匹配的字符串时,您也有它的(数字)索引 (${index}),因此只需 +/-20 到 ${index} 即可获得所需的 运行ge。

我们还需要一些额外的逻辑来确保我们想要的 运行ge 索引落在 运行ge 可用索引中。请记住,对于具有 'n' 记录的数组,可用索引 运行ge 将为“0 到 (n-1)”。

for index in "${!mdm[@]}"
do
    if [[ ${mdm[$index]} =~ Fault.? ]]
    then
        start=$((index-20))
        end=$((index+20))

        # if 'start' is less than 0 then reset it to 0

        [ ${start} -lt 0 ] && start=0

        for x in $( seq ${start} ${end} )
        do
            # break if we run out of array elements

            [ "${mdm[${x}]:-undefined}" = 'undefined' ] && break

            # display our numeric index and contents of associated array item

            echo "${x} : ${mdm[${x}]}"
        done

        break
    fi
done

我创建了一个数据文件,其中包含 32 行 'XXXXXX' 的初始行、41 行来自问题的示例数据,以及文件末尾的另外十几行 'XXXXXX';然后我 运行 上面的代码片段针对文件并生成:

32 : 6400000000000000
33 : 0000000000000000
34 : 0000000000000000
35 : 0000000000000000
36 : 00000000
37 : Symptom
38 : Information:
39 : Crash
40 : Location:
41 : [000000000010D614]
42 : IPRA.$ha_critic+114
43 : Component:
44 : COMP
45 : Exception
46 : Type:
47 : 131
48 : Data
49 : From
50 : CPU
51 : #8
52 : (Faulting
53 : CPU)
54 : backup_files
55 : cfgbackups
56 : config
57 : install.log
58 : ioscli.log
59 : pager.trace
60 : rules
61 : smit.log
62 : smit.script
63 : smit.transaction
64 : snap.pax.Z
65 : MST
66 : State:
67 : R0:
68 : 0000000000050FB4
69 : R1:
70 : F00000002FF471D0
71 : R2:
72 : 00000000038B6110