如何使用命令行参数作为 awk 正则表达式匹配表达式?

如何使用命令行参数作为 awk 正则表达式匹配表达式?

我有以下 awk 脚本:

#!/bin/awk -f

BEGIN {
    FS  = "";
}

value ~ "MYVALUE" # silly test
{
    print "1 - " substr($0, 235, 12);
}

$235 ~ "M" {
    print "2 - " substr($0, 235, 12);
}

{
    if(value == substr($0, 235, 12))
    {
        print "3 - " substr($0, 235, 12);
    }
    if(match(value,substr($0, 235, 12)))
    {
        print "4 - " substr($0, 235, 12);
    }
}

END {
    print "exit"
}

我将其运行为:./script.awk -v value="MYVALUE" my_file

这是我的 RHEL 5.5 的 awk:

$ ls -l  $(which awk)
lrwxrwxrwx 1 root root 4 Jul 10  2015 /bin/awk -> gawk
$ gawk --version
GNU Awk 3.1.5

1和2工作。顺便说一句,如果在 2 中我将 放入{换行符中,例如:

$235 ~ "M" 
{
    print "2 - " substr($0, 235, 12);
}

那么输出是完整匹配的行,而不仅仅是打印。

我想做的是使用value正则表达式来匹配,但它总是失败。就像是:

$235...$247 ~ value

我看到了例子([1831722][UNIX/27410]) 匹配单个字符,但不匹配表达式。

编辑

为了清楚起见,我想匹配没有字段分隔符的行,使用传递给 awk 的命令行参数并将其用于该行的多字符偏移量。我破解了一些Python:

#!/usr/bin/python

import re

t   = 'ABC'
rg  = '^.{235,235}' + t
rgx = re.compile(rg)
tt  = '00000ABC00'
if(rgx.match(tt)):
    print "OK"
else:
    print "KO"

仅对于此用例,awk 可能会更快,因为所讨论的文件相当大。

答案1

我知道这有点旧,但我想如果其他人最终来到这里,我会添加一些评论。首先,要创建一系列字段,您可以用 分隔它们,,因此

$235, $247 ~ value { ... action here ... }

如果需要,也可以直接使用该函数的输出substr来尝试查找匹配项:

substr($0, 235, 12) ~ value { ... action here ... }

另外,您似乎发现了一些大括号的数量很重要。对于每个匹配、操作对,匹配或操作可以是隐式默认值(匹配所有,或打印 $0),因此更改

$235 ~ "M" {  print "2 - " substr($0, 235, 12);  }

$235 ~ "M" 
{  print "2 - " substr($0, 235, 12);  }

将含义从print this substring only when field 235 is an M, 更改为whenever field 235 is an M print the whole record, AND for every record, print the substring.因此,例如,如果您需要对每个记录的子字符串执行多次检查,则可以使用此方法,您的第一个操作可能是:

BEGIN { FS="" }
# oursubstr will be updated first for each record.
{ oursubstr = substr($0, 235, 12) } 
oursubstr ~ value { ... action ... }
...

答案2

这似乎有效。

{
    if(substr($0, 235, 12) ~ value)
    {
        print "4 - " substr($0, 235, 12)
        next
    }
    else
    {
        print "4 - NOK"
        next
    }
}

相关内容