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最初のブロックと2番目のブロックに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

関連情報