我有以下 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
}
}