我正在为固定宽度文件编写一个 poc 以提取特定字段并检查其格式。但两者都给我验证失败了。你能帮我指出这个问题吗
在代码中,我试图减去电子邮件 ID 并修剪空间并验证格式
代码
awk -v m=16 -v p=13 -v 'n=[a-z][email protected]' '
{
c=substr($0,m,p)
sub(" +$", "", c)
c !~ "^" n "$"
printf "%s:%s:%s\n", FILENAME, FNR, $0> "/dev/stderr"
count++
}
END {print count}' BNC_fixedwidth.txt
输入文件
10027 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
答案1
那这个呢?
awk -v startPos=16 -v len=13 -v pat='[[:blank:]][a-z]+@gmail\\.com[[:blank:]]' '
{ match($0, pat);
if (RSTART+1>=startPos && RLENGTH-2<=len){ print; "or do whatever you want..." }
}' infile
我添加[[:blank:]]
到邮件正则表达式的开头和结尾以匹配边缘的单个空格/制表符pat
,因此[[:blank:]]
当与函数匹配时,它将导致 startPos 设置为 15 且 len 设置为 15 (由于 ,多了两个字符长度,第一个字符在最后一个)match()
,如果找到任何匹配项,awk 将设置RSTART 和 RLENGTH 变量;然后你会看到我们将 1 添加到 RSTART 中,成为 startPos 的 16,并从 RLEGNTH 中扣除 2 成为 13 以进行 len 检查。
输入:
11111 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
22222 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
33333 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
44444 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
55555 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
66666 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
77777 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
88888 20033t @gmail.com 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
输出:
11111 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
33333 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
77777 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
如果您严格希望匹配从位置 16 开始且长度为 13 的邮件,请将两个比较运算符替换为==
。