删除带图案的线条

时间:2009-09-15 05:06:51

标签: unix shell scripting sed awk

您好我想从匹配特定模式的文件中删除一行 我正在使用的代码是

BEGIN {
       FS = "!";
       stopDate = "date +%Y%m%d%H%M%S";
       deletedLineCtr = 0;   #diagnostics counter, unused at this time
      }
      {
     if( $7 < stopDate )
          {
           deletedLineCtr++;
          }
      else
           print $0
      }

代码说该文件有“!”行分隔和第7个字段是日期yyyymmddhhmmss格式。该脚本删除日期小于系统日期的行。但这不起作用。任何人都可以告诉我原因吗?

3 个答案:

答案 0 :(得分:2)

星期二的awk(1)作业是否到期?真的,awk ?? : - )

好的,我不确定你到底发生了什么,所以我做了一些猜测。这个awk程序获取当前时间,然后删除文件中的每一行少于该行。我留下了一个调试打印。

BEGIN {
  FS = "!"
  stopDate = strftime("%Y%m%d%H%M%S")
  print "now: ", stopDate
}
{ if ($7 >= stopDate) print $0 }

$ cat t2.data
!!!!!!20080914233848
!!!!!!20090914233848
!!!!!!20100914233848
$ awk -f t2.awk < t2.data
now:  20090914234342
!!!!!!20100914233848
$ 

答案 1 :(得分:1)

首先调用date将格式化日期作为参数传递:

awk -F'!' -v stopdate=$( date +%Y%m%d%H%M%S ) '
    $7 < stopdate { deletedLineCtr++; next }
    {print}
    END {do something with deletedLineCrt...}
'

答案 2 :(得分:0)

您可能需要运行date命令 - 可能需要使用反引号 - 来将日期转换为stopDate。如果您使用所写的代码打印stopDate,它将包含“date + ...”,而不是一串数字。这是你问题的根本原因。

不幸的是...

我找不到任何证据表明反引号适用于任何版本的awk(旧awk,新awk,GNU awk)。因此,您需要将代码迁移到Perl(Perl最初被设计为'awk-killer' - 并且仍然包含a2p以将awk脚本转换为Perl),或者您需要重新考虑如何设置日期

看到@ DigitalRoss的回答,strftime()中的gawk函数为您提供了所需的格式(请按照我的方式检查'info gawk')。

修复后,您应该删除正确的行。