
arrayvar
다음과 같이 정의되는 배열이 있습니다 .
arrayvar=( $(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{" ," ");gsub(","," ");print1 | tr -d '\n' | sed 's/^[ \t]*//' | *$//') )
~와 함께
vovar=VARIABLES
tr
sed
내 임시 파일에는 위의 명령과 공백을 제거하는 명령을 사용하여 파악하는 몇 가지 변수가 있습니다 .
온도 파일
ENTERPRISE eMylexRaid이벤트 정보 변수 { a9이벤트코드, a9컨트롤러번호, a9채널번호, a9대상번호, a9Lun번호, a9이벤트타임스탬프 } 설명 "장치가 온라인 상태가 되었습니다." --#SUMMARY "[이벤트 %d ctl %d chn %d tgt %d lun %d 시간 %d :] 장치가 온라인이 되었습니다." --#인수 {0,1,2,3,4,5} --#심각도 정보 --#TIMEINDEX 5 --#국가 운영 ::= 1
이 명령을 실행하면 arrayvar[0]
다음과 같은 값만 제거됩니다.
echo "${arrayvar[0]}" a9이벤트코드 echo "${arrayvar[1]}" a9Controller번호 echo "${arrayvar[2]}" a9채널번호 echo "${arrayvar[3]}" a9대상번호
도움을 주시면 감사하겠습니다. 감사해요!
답변1
다음을 사용할 수 있습니다.
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}')
답변2
grep
옵션이 있는 이후 버전의 GNU(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
으로 설정되어 있으므로,
쉼표로 구분된 문자열로 배열을 만들 수 있습니다.
답변3
아래와 같이 awk로 모든 작업을 수행합니다.
arrayvar=($(awk '/'"$vovar"'/,/}/ {gsub("'"$vovar"'"," "); gsub("}"," "); gsub("{"," ");gsub(","," ");all=all$0} END {print all}' temp1 ))
답변4
사용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 && /}/ );
}
ifVARIABLES
(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