找到字符串后打印数组范围 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
我需要打印一系列数组元素,从使用 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