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...}
'