awk/sed를 사용하여 특정 열의 내용 추출

awk/sed를 사용하여 특정 열의 내용 추출

제공되는 문서:

$ cat CronConfig 
 `FILE SYSTEM`
`------------` 
 warningThreshold: 77 
 criticalThreshold: 99

`MEMORY`
`-------`
warningThreshold: 66
criticalThreshold: 88

`CPU`
`----`
intervalCount: 6
intervalSecs: 7
warningThreshold: 99
criticalThreshold: 88

CronConfig위 내용이 포함된 파일이 있습니다. 나는 값을 사용 하고 warningThreshold다음 과 같은 출력을 원합니다.MEMORYcriticalThresholdCPU

66
88

이 값을 얻으려면 명령을 사용하십시오. (하지만 올바른 방법으로 수행하고 있는지 확실하지 않습니다.)

awk 'BEGIN{FS="\n"; RS="------------"} {print $7}' CronConfig | awk 'NF {print $2}'

awk 'BEGIN{FS="\n"; RS="------------"} {print $15}' CronConfig | awk 'NF {print $2}'

답변1

sed여러 줄을 교체하여 이 작업을 수행할 수 있습니다.

요컨대

$ sed -n '/`MEMORY`/,/^$/{s/^warningThreshold: \([0-9]*\)/\1/p};
          /`CPU`/,/^$/{s/^criticalThreshold: \([0-9]*\)/\1/p}' CronConfig

더 많은 설명이 있습니다:

sed -n전체 파일을 인쇄하지 마세요.

검색할 블록을 선택하려면

/PATTERN1/,/PATTERN2/

여기서 PATTERN1과 PATTERN2는 블록 제한입니다. 귀하의 경우 MEMORY첫 번째 블록과 두 번째 블록에 end를 사용할 수 있습니다 .^$CPU^$

그런 다음 warningThresholt 또는 importantThreshold가 포함된 줄을 다음 숫자로 바꾸면 됩니다. s이를 수행하기 위해 sed 명령을 사용하겠습니다 . 끝에 있는 s 명령 p은 결과를 에코하는 데 사용됩니다.

답변2

원하는 모든 값에 대해 작동하는 AWK 솔루션(제 awk는 다차원 배열을 지원하지 않으므로 배열 인덱스에 "|"를 사용하면 모든 awk 버전에서도 작동합니다):

$ awk -F'`' '
  /[A-Z][A-Z]+/ {matchkey=$2}
  !/[-]+/ && !/[A-Z][A-Z]+/ && $0 { 
      split($0,values,":");
      for ( i in values ) gsub(" ","",values[i]);
      ar[matchkey"|"values[1]]=values[2]; 
      }
  END {print ar["MEMORY|warningThreshold"];print ar["CPU|criticalThreshold"]}
' CronConfig
66
88

END 블록에서는 원하는 값을 얻을 수 있습니다.

예: print ar["CPU|intervalCount"]값을 인쇄합니다."6"입력 파일에서.

답변3

사용 GNU sed및 기타 도구:

$ sed -ne '
  /^`CPU`$/{
    :a;n;s/^criticalThreshold: //p;Ta
  }
  /^`MEMORY`$/{
    :b;n;s/^warningThreshold: //p;Tb
  }
' cinfigFile

$  perl -lane '
    print $F[1] if 
      (/^`MEMORY`$/ ... /^$/ and /^warningThreshold:/) 
               || 
      (/^`CPU`$/ ... /^$/ and /^criticalThreshold:/);
' configFile


$ awk -F'\n' -vRS= '

/^`MEMORY`\n/&&match($0,/\nwarningThreshold: [0-9]+/){
  print substr($0, RSTART+19, RLENGTH-19) }

 /^`CPU`\n/&&match($0,/\ncriticalThreshold: [0-9]+/){
  print substr($0, RSTART+20, RLENGTH-20) }
' configFile



$ perl -F'\n' -ln -00 -e '$,=$\;
     $h{ ($F[0] =~ /`(.*)`/)[0] } = { /^\s*(.*):\s*(.*)$/mg };
     print $h{MEMORY}{warningThreshold}, $h{CPU}{criticalThreshold} if eof;
' configFile

관련 정보