如何使用正则表达式来匹配awk中的ASTERISK

时间:2010-04-29 14:34:54

标签: regex awk

我对正则表达式很新,只是开始学习使用awk。我想要完成的是编写一个ksh脚本来读取文本中的读取行,以及符合以下内容的每一行:

* RECORD 0000001 [some_serial _#]

用不同的数字替换$ 2(即000001)。所以基本上脚本在批处理记录转储中读取,并用date + record#替换记录号,并写入单独的文件。

所以这就是我认为格式应该是:

awk 'match($0,"/*RECORD")!=0{$2="$DATE-n++"; print $0} match($0,"/*RECORD")==0{print $0}' $BATCH > $OUTPUT

但显然“/ * RECORD”不起作用,我不确定是否更改$ 2然后写整行是正确的方法。所以我需要一些认真的启示。

2 个答案:

答案 0 :(得分:1)

所以你希望你的示例行看起来像

*RECORD $DATE-n++ [some_serial_#]
在awk完成之后

awk '{ if (match($0, "*RECORD") != 0) { $2="$DATE-n++"; }; print }' $BATCH > $OUTPUT

根据您的更新,看起来您希望$DATE成为awk表达式中使用的环境变量,而n是awk脚本中的变量,可以计算多少记录与模式匹配。鉴于此,这可能看起来更像你想要的。

$ cat script.awk
BEGIN { n=0 }
{
    if (match($0, "\*RECORD") != 0) {
        n++;
        $2 = (ENVIRON["DATE"] "-" n);
    }
    print;
}

$ awk -f script.awk $BATCH > $OUTPUT

答案 1 :(得分:0)

使用平等。

D=$(date +%Y%m%d)
awk -vdate="$D" '
{
  for(i=1;i<=NF;i++){
   if ( $i == "*RECORD" ){
      $(i+1) = date"00002"
      break # break after searching for one record, otherwise, remove break
   }
  }
}1' file