【问题标题】:using variables in search pattern in awk script在 awk 脚本的搜索模式中使用变量
【发布时间】:2010-11-24 12:30:45
【问题描述】:
#!/usr/local/bin/gawk -f  `

{  
awkvar2="/id=22/";  
awkvar3="/end/";  


if ($0 ~ awkvar2) {  
    triggered=1;  
  }  
  if (triggered) {  
     print;  
     if ($0 ~ awkvar3) {  
        triggered=0;  
        print "\n-----------------------------------------------\n"  
     }  
  }  
}  

这个 awk 脚本不适合我 我正在尝试从一行搜索到另一行,即id=22 直到end (我不使用/<string>/,/<string>/ 的原因是因为我希望在每个搜索块之后都有一个大行) 我只想使用变量。
我可以直接使用模式if ($0 ~ /end/) { 但我不想那样做,我想使用搜索模式中的变量 (原因是我将通过 shell 动态获取变量中的值)

请告诉我如何在 awk 的搜索模式中使用变量

谢谢...

【问题讨论】:

    标签: shell awk


    【解决方案1】:
    {
    awkvar2="id=22";
    awkvar3="end"; 
    if ($0 ~ awkvar2) {
            triggered=1;
             }
    if (triggered) {
             print;
             if ($0 ~ awkvar3) {
                  triggered=0;
                  print "\n-----------------------------------------------\n"
             }
    }
    } 
    

    编辑

    根据请求修改以打印“id=22”之前的行

    {
      awkvar2="id=22";
      awkvar3="end"; 
      if ($0 ~ awkvar2) {
              print prev;
              triggered=1;
      }
      if (triggered) {
              print;
              if ($0 ~ awkvar3) {
                  triggered=0;
                  print "\n-----------------------------------------------\n"
              }
      }
      {prev=$0;}
    }  
    

    或者,更奇怪

    BEGIN {awkvar2="id=22";awkvar3="end"}
    
    ($0 ~ awkvar2),($0 ~ awkvar3) { if ($0 ~ awkvar2) {print prev;}
                                    print; 
                                    if ($0 ~ awkvar3) {
                                        print "\n---------------\n"
                                    }
                                   }
    {prev=$0;}
    

    【讨论】:

    • 我如何为上述脚本打印id=22之前的行
    • @Omkar 已更新。请记住在堆栈溢出中接受并最终支持您的首选答案。
    • 聪明!!将上一行存储在一个变量中,然后打印它
    • 我实际上想打印 2 行,所以我只是扩展了你的想法 { prev2 = prev;上一页=$0; }
    • @Omkar:您还可以累积以前的行:prev = prev "\n" $0,当您打印(或以其他方式处理)prev 时,您需要清除它:prev = ""。这是可扩展的,无需添加多个变量。
    【解决方案2】:

    belisarius awk 脚本的更紧凑版本,没有'if's

    BEGIN {awkvar2="id=22";awkvar3="end"}
    
    ($0 ~ awkvar2) {print prev;}
    ($0 ~ awkvar2),($0 ~ awkvar3) {print; }
    ($0 ~ awkvar3) {print "\n---------------\n"}
                   {prev=$0;}
    

    【讨论】:

      猜你喜欢
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2019-03-18
      • 2023-03-30
      • 2016-01-04
      • 1970-01-01
      相关资源
      最近更新 更多