J'ai un tableau appelé arrayvar
, qui est défini comme
arrayvar = ($ (awk '/' "$ vovar" '/, /}/{gsub ("'" "$ vovar" '"," "); gsub ("} "," "); gsub ("{", ""); gsub (",", ""); print} 'temp1 | tr -d'\n '| sed' s/^ [\ t] * à // '| sed | s/[\ t] * $ // '))
avec
vovar=VARIABLES
Mon fichier temporaire contient des variables que je récupère à l’aide de la commande ci-dessus et des commandes tr
sed
pour supprimer les espaces.
Fichier TEMP
ENTERPRISE eMylexRaidEventInformation VARIABLES { A9EventCode, A9ControllerNumber, A9ChannelNumber, A9TargetNumber, .9. .____.] a9EventTimeStamp } DESCRIPTION "L'appareil est devenu en ligne." - # SUMMARY "[Événement% d ctl% d chn% d tgt% d lun% d Heure% d:] l’appareil est devenu en ligne. " - # ARGUMENTS {0,1,2,3,4,5} - # GRAVITÉ INFORMATIONS - # TIMEINDEX 5 - # ÉTATS OPÉRATIONNELS :: = 1
Lorsque j'exécute cette commande, seul arrayvar[0]
est dépouillé de ses valeurs, comme ceci:
echo "$ {arrayvar [0]}" a9EventCode echo "$ {arrayvar [1]}" a9ControllerNumber echo "$ {arrayvar [2]}" ". .____.]
Toute aide serait appréciée. Merci!
Vous pouvez utiliser ceci:
var=( $(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}') )
VARIABLES {
et un enregistrement correspondant }
, en supprimant chaque caractère et ,
Cependant, je préférerais utiliser mapfile
et un seul fork à la place d'un double fork pour stocker les valeurs dans un tableau:
mapfile var < <(< input awk '/VARIABLES {/, /}/ {if ($0~/VARIABLES/||$0~/}/) next; else gsub(/[ ,]/, "", $0); print}')
Utilisation de versions ultérieures de GNU grep
(fourni avec Ubuntu) comportant l’option -z
:
$ IFS=, arrayvar=( $(grep -Pzo '\s+VARIABLES\s+{\K[^}]+(?=})' temp1 | tr -d '[:space:]') )
$ echo "${arrayvar[0]}"
a9EventCode
$ echo "${arrayvar[1]}"
a9ControllerNumber
$ echo "${#arrayvar[@]}"
6
L'option -z
permet à grep
de traiter les lignes du texte saisi séparées par ASCII NUL au lieu des nouvelles lignes afin que nous puissions les relier à la lettre.
Le modèle PCRE \s+VARIABLES\s+{\K[^}]+(?=})
correspondra au texte à l'intérieur {}
Ensuite, nous avons supprimé les espaces (espace, tabulation, nouvelle ligne) de tr -d '[:space:]'
Comme IFS
est défini sur ,
, nous pouvons créer le tableau avec des chaînes séparées par des virgules.
Faites tout avec awk comme ci-dessous:
arrayvar=($(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");all=all$0} END {print all}' temp1 ))
Utiliser 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>
Explication
exit if ($start == 1 && /}/ );
Quittez le script s'il existe un }
si VARIABLES
(vovar
) est passé
if ($start == 1) {s/\s*([0-9]|\w+)(,|)/$1/g; printf "%s",$_}
Imprimer la ligne si VARIABLES
(vovar
) est passé
$start=1 if (/'"$vovar"'/)
Définit le marqueur de départ si VARIABLES
(vovar
) est passé
Exemple
$ 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