모든 배열 요소에서 공백을 제거합니다.

모든 배열 요소에서 공백을 제거합니다.

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 && /}/ );

    }if 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

관련 정보