Мне назвали массив arrayvar
, который определяется как
arrayvar=( $(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");print}' temp1 | tr -d '\n' | sed 's/^[ \t]*//' | sed 's/[ \t]*$//') )
с
vovar=VARIABLES
Мой временный файл имеет некоторые переменные, которые я захватываю использование вышеупомянутой команды и tr
sed
команды для удаления пробелов.
ВРЕМЕННЫЙ файл
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
Когда я выполняю эту команду только 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}')
Используя более поздние версии GNU grep
(идет с Ubuntu), который имеет -z
опция:
$ 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