使用 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我有一个包含上述内容的文件。我想使用warningThresholdfromMEMORYcriticalThresholdfrom的值CPU并想要以下输出:

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 是块限制。在您的情况下,您可以对第一个块和第二个块使用MEMORYend 。^$CPU^$

然后,您所要做的就是将包含 warningThresholt 或 criticalThreshold 的行替换为以下数字。我将使用ssed 命令来完成此操作。结尾p的 s 命令用于回显结果。

答案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

相关内容