使用Shell命令或Perl从文件的子部分提取数据

时间:2014-06-27 17:00:34

标签: perl bash shell sed grep

我试图从文件的特定部分提取信息(在某一点下)。更准确地说,我希望能够找到一个关键字,例如" M2",然后找到" Freq"在M2下获得该数字而不与M1或M3混合。

最简单的答案很可能是grep,sed,awk或cut的组合。

  

M1 {

     
    

频率:1GHz

         

温度:125C

  
     

}

     

M2 {

     
    

频率:1.1GHz

         

温度:130C

  
     

}

     

M3 {

     
    

频率:0.78GHz

         

温度:89C

  
     

}

5 个答案:

答案 0 :(得分:2)

尝试

awk '/M2/ {found=1} found && $1=="Freq:" {print $2; exit}' file

答案 1 :(得分:2)

你可以使用awk,

$ awk -v RS="\s*M" 'NR==3{print $3}' file
1.1GHz

答案 2 :(得分:2)

使用perl one-liner

perl -ne 'print $1 if /M2\{/ .. /\}/ and /Freq:\s*(.*)/' file

说明:

切换

  • -n:为输入文件中的每个“行”创建一个while(<>){..}循环。
  • -e:告诉perl在命令行上执行代码。

<强>代码

  • /M2\{/ .. /\}/:用于测试两行之间的范围运算符
  • /Freq:\s*(.*)/:找到匹配的行,并在$1中捕获值。

答案 3 :(得分:1)

perl -lane 'print $F[1] if /M2[{]/ .. /[}]/ and /Freq/' file

答案 4 :(得分:0)

使用perl

执行此操作的另一种方法
perl -nle 'chomp; $str.="$_"; END{ $str =~ /M2\{.*?(Freq: .*?\s)/ && print $1 }' file
Freq: 1.1GHz 

说明:

  1. chomp删除\n
  2. $str.="$_"创建一个包含整个输入的字符串
  3. $str =~ /M2\{.*?(Freq: .*?\s)提取我们追踪的字段