arrayvar
という配列があり、これは次のように定義されています
arrayvar =($(awk '/' "$ vovar" '/、/}/{gsub( "'" $ vovar "'"、 ""); gsub( "}"、 ""); gsub( "{"、 ""); gsub( "、"、 ""); print} 'temp1 | tr -d'\n '| sed' s/^ [\ t] * // '| sed' s/[\ t] * $ // '))
と
vovar=VARIABLES
一時ファイルには、上記のコマンドとスペースを削除するtr
sed
コマンドを使用して取得する変数がいくつかあります。
TEMPファイル
ENTERPRISE eMylexRaidEventInformation VARIABLES { a9EventCode、 a9ControllerNumber、 a9ChannelNumber、 a9TargetNumber、 a9LunNumber、 a9EventTimeStamp } DESCRIPTION "デバイスがオンラインになりました。" -#SUMMARY "[Event%d ctl%d chn%d tgt%d lun%d時間%d:]デバイスがオンラインになりました。 " -#ARGUMENTS {0,1,2,3,4,5} -#SEVERITY INFORMATIONAL -#TIMEINDEX 5 -#STATE OPERATIONAL :: = 1
このコマンドを実行すると、arrayvar[0]
は、次のように値が取り除かれます。
echo "$ {arrayvar [0]}" a9EventCode echo "$ {arrayvar [1]}" a9ControllerNumber echo "$ {arrayvar [2]}" a9ChannelNumber echo "$ {arrayvar [3]}" a9TargetNumber
任意の助けをいただければ幸いです。ありがとう!
これを使用できます:
var=( $(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}') )
VARIABLES {
に一致するレコードと}
に一致するレコードの間のすべてのレコードを印刷し、すべての,
文字を削除しますただし、配列に値を格納するには、ダブルフォークの代わりにmapfile
とシングルフォークを使用します。
mapfile var < <(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}')
_-z
_オプションを持つGNU grep
(Ubuntuに付属))の新しいバージョンを使用する:
_$ IFS=, arrayvar=( $(grep -Pzo '\s+VARIABLES\s+{\K[^}]+(?=})' temp1 | tr -d '[:space:]') )
$ echo "${arrayvar[0]}"
a9EventCode
$ echo "${arrayvar[1]}"
a9ControllerNumber
$ echo "${#arrayvar[@]}"
6
_
_-z
_オプションは、grep
を作成して、改行ではなくASCII NULで区切られた入力テキストの行を処理するため、改行を文字どおりに一致させることができます。
PCREパターン\s+VARIABLES\s+{\K[^}]+(?=})
は、_{}
_内のテキストと一致します
次に、_tr -d '[:space:]'
_によって空白(スペース、タブ、改行)を削除しました
IFS
が_,
_に設定されているため、コンマ区切りの文字列で配列を作成できます。
以下のようにawkですべてを実行します。
arrayvar=($(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");all=all$0} END {print all}' temp1 ))
Perl
を使用する
_Perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' <your_input_file>
_
説明
exit if ($start == 1 && /}/ );
VARIABLES
(vovar
)が渡された場合、_}
_がある場合はスクリプトを終了します
if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}
VARIABLES
(vovar
)が渡された場合、行を出力します
$start=1 if (/'"$vovar"'/)
VARIABLES
(vovar
)が渡された場合、開始マーカーを設定します
例
_$ vovar=VARIABLES
$ arrayvar=($(Perl -ne 'exit if ($start == 1 && /}/ ); if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}; $start=1 if (/'"$vovar"'/);' foo))
$ for((i=0;i<${#arrayvar[@]};i++)); do echo "${arrayvar[i]}"; done
a9EventCode
a9ControllerNumber
a9ChannelNumber
a9TargetNumber
a9LunNumber
a9EventTimeStamp
$ cat foo
ENTERPRISE eMylexRaidEventInformation
VARIABLES {
a9EventCode,
a9ControllerNumber,
a9ChannelNumber,
a9TargetNumber,
a9LunNumber,
a9EventTimeStamp
}
DESCRIPTION
"device became online."
--#SUMMARY "[Event %d ctl %d chn %d tgt %d lun %d Time %d :] device became online."
--#ARGUMENTS {0,1,2,3,4,5}
--#SEVERITY INFORMATIONAL
--#TIMEINDEX 5
--#STATE OPERATIONAL
::= 1
_