Unix 删除带有图案的线条

Unix 删除带有图案的线条,unix,shell,scripting,sed,awk,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++;

嗨,我想从一个文件中删除一行匹配特定的模式 我使用的代码是

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
      }
开始{
FS=“!”;
stopDate=“日期+%Y%m%d%H%m%S”;
deletedLineCtr=0;#诊断计数器,此时未使用
}
{
如果($7<停止日期)
{
deletedLineCtr++;
}
其他的
打印$0
}

代码表示该文件以“!”分隔,第7个字段为日期yyyymmddhhmmss格式。脚本将删除日期小于系统日期的行。但这不起作用。有人能告诉我原因吗?

您可能需要运行date命令(可能带有倒勾)才能将日期转换为stopDate。如果您使用编写的代码打印stopDate,它将包含“date+…”,而不是一个数字字符串。这是你问题的根本原因

不幸的是。。。 我找不到任何证据表明反勾号在任何版本的awk(旧awk、新awk、GNU awk)中都有效。因此,您要么需要将代码迁移到Perl(Perl最初被设计为“awk杀手”——并且仍然包括将awk脚本转换为Perl的
a2p
),要么需要重新考虑如何设置日期

看到@DigitalRoss的答案,
gawk
中的
strftime()
函数为您提供了所需的格式(和我一样选中“info gawk”)

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

awk(1)作业周二到期吗?真的吗,天哪???) 好吧,我不确定你到底想要什么,所以我猜了一下。这个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
首先调用
日期
将格式化日期作为参数传递:

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