0

次のような配列に解析する必要がある出力がいくつかあります。エントリー数は変動する可能性があります。

interface  : eth1
ip address : 1.1.1.1        [Active]
subnet mask: 255.255.255.0
router     : 1.1.1.2
name server: 1.1.1.3
dhcp server: 1.1.1.4
lease time : 86400
last update: Fri Jul 5 00:11:12 UTC 2013
expiry     : Sat Jul 06 00:11:08 UTC 2013
reason     : BOUND

interface  : eth2
ip address : 2.2.2.2        [Active]
subnet mask: 255.255.255.0
router     : 2.2.2.3
name server: 2.2.2.4
dhcp server: 2.2.2.5
lease time : 86400
last update: Fri Jul 5 03:03:41 UTC 2013
expiry     : Sat Jul 06 03:03:39 UTC 2013
reason     : REBOOT

各セクションはインターフェイスで始まり、理由で終わり、理由の後に空白行が続きます。

私は bash スクリプトを初めて使用し、各セクションを変数に入れるために考えられるほぼすべてのことを試しましたが、それを機能させることができないようです。これが他の言語だったら… 一瞬でできたのに!

基本的に私が欲しいのは、すべての詳細を間に挟んだ各セクションを持つ配列です (これらの詳細は変更される可能性があり、行数はそれほど多くありません)。

awk、sed、grep などを使用してさまざまな方法を試しましたが、いずれも目的の場所に到達していないようです。

最終的には次のようになります。

$output_array[$1]=
interface  : eth1
ip address : 1.1.1.1        [Active]
subnet mask: 255.255.255.0
router     : 1.1.1.2
name server: 1.1.1.3
dhcp server: 1.1.1.4
lease time : 86400
last update: Fri Jul 5 00:11:12 UTC 2013
expiry     : Sat Jul 06 00:11:08 UTC 2013
reason     : BOUND

$output_array[$2]=
interface  : eth1
ip address : 1.1.1.1        [Active]
subnet mask: 255.255.255.0
router     : 1.1.1.2
name server: 1.1.1.3
dhcp server: 1.1.1.4
lease time : 86400
last update: Fri Jul 5 00:11:12 UTC 2013
expiry     : Sat Jul 06 00:11:08 UTC 2013
reason     : BOUND

誰かが私を正しい方向に向けることができますか? ありがとう!

私が試したことの一例、情報が分割されなかった、または何か間違ったことをしました!

output_array=echo $output | awk -v x="^$" -v n=1 '$0 ~ x {n++; next}{print}'
for items in $output_array; do
echo "ENTRY: $items"
done
4

4 に答える 4

0

@that other guy からの提案ともう少し調査を行って、機能するようにしました。

誰でもこれを改善できますか?

output+=$'\n'
x=0
while read -r line
do
    if [ -z "$line" ]; then
        output_array[$x]=$data
        unset data
        let x++                
    else
        data+=$'\n'
        data+=$line
    fi
done <<< "$output"

for j in "${output_array[@]}"
do
    echo "$j"
done
于 2013-07-05T07:10:59.320 に答える
0

@jivetek - これはあなたが書いたものに対する改善ではありませんが、@thatotherguy が投稿した解決策に基づいて解決策を得ることができなかったことが気になりました。これは、2 つの印刷不可能な文字と、私が理解できない bash マジックを使用するバージョンです。注意点は、配列要素に「\002」文字が残っていることです。各要素をクリーンアップするには、配列を 2 回通過する必要がありますが、スクリプトの別の場所で実行するのは簡単かもしれません (おそらく、とにかくそのデータをウォークする必要があります)。

IFS=$'\001'
IN=`awk '/^$/ {print "\001"} { print $0 "\002" }' input`
IFS=$'\001\n' read -a oarr3 -d$IFS <<< $IN
IFS=$' \t\n'

ここで、入力は「入力」というファイル内のデータです。

this so questionから「読み取り」コマンドを見つけました。私が理解していない「魔法」は、IFSの二重割り当てが「-d」フラグと一緒に機能する理由です。それらのようなものは必要ないと思います。

oarr3 の内容は、私が期待するものです (ほとんど):

declare -a oarr3='([0]="interface  : eth1 ip address : 1.1.1.1        [Active] subnet mask: 255.255.255.0 router     : 1.1.1.2 name server: 1.1.1.3 dhcp server: 1.1.1.4 lease time : 86400 last update: Fri Jul 5 00:11:12 UTC 2013 expiry     : Sat Jul 06 00:11:08 UTC 2013 reason     : BOUND " [1]=" interface  : eth2 ip address : 2.2.2.2        [Active] subnet mask: 255.255.255.0 router     : 2.2.2.3 name server: 2.2.2.4 dhcp server: 2.2.2.5 lease time : 86400 last update: Fri Jul 5 03:03:41 UTC 2013 expiry     : Sat Jul 06 03:03:39 UTC 2013 reason     : REBOOT")'

ただし、私が言ったように、「\002」文字はまだ各配列要素にあり、「\002」文字の後にスペースがある可能性もあります。

echo "${oarr3[0]}" | tr '\002' '\n'
interface  : eth1
 ip address : 1.1.1.1        [Active]
 subnet mask: 255.255.255.0
 router     : 1.1.1.2
 name server: 1.1.1.3
 dhcp server: 1.1.1.4
 lease time : 86400
 last update: Fri Jul 5 00:11:12 UTC 2013
 expiry     : Sat Jul 06 00:11:08 UTC 2013
 reason     : BOUND
[0]

生データのビューは次のとおりです。

cat -etv <<< ${oarr3[0]} interface  : eth1^B ip address : 1.1.1.1        [Active]^B subnet mask: 255.255.255.0^B router     : 1.1.1.2^B name server: 1.1.1.3^B dhcp server: 1.1.1.4^B lease time : 86400^B last update: Fri Jul 5 00:11:12 UTC 2013^B expiry     : Sat Jul 06 00:11:08 UTC 2013^B reason     : BOUND^B $

また、2 番目の要素の先頭に「\002」があるようです。これは、awk 出力からの戻り値を残し、それらを 2 番目の IFS 宣言に含める必要があったためと考えられます。これは、データを処理する必要があるときに再起動することですべて修正できます。

シェルのバージョン:

sh -version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
于 2013-07-05T18:37:26.897 に答える