【发布时间】:2014-10-06 21:28:35
【问题描述】:
我正在尝试获取包含特定模式的字段编号(在本例中为 MAC 地址)。想象一下我们有这样的东西:
AAA BBB CCC xx:xx:xx:xx:xx:xx EEE FFF GGG
其中 xx:xx... 是 MAC 地址,因此 x 是字母数字。
如果我使用该行作为输入,我想获取 MAC 地址所在字段的编号。在这种情况下,“4”。
我在考虑 sed 或 awk,但不知道如何输出字段编号。
【问题讨论】:
我正在尝试获取包含特定模式的字段编号(在本例中为 MAC 地址)。想象一下我们有这样的东西:
AAA BBB CCC xx:xx:xx:xx:xx:xx EEE FFF GGG
其中 xx:xx... 是 MAC 地址,因此 x 是字母数字。
如果我使用该行作为输入,我想获取 MAC 地址所在字段的编号。在这种情况下,“4”。
我在考虑 sed 或 awk,但不知道如何输出字段编号。
【问题讨论】:
使用 for 循环对照正则表达式检查每个字段,对十六进制数字使用 POSIX 字符类。找到匹配项后,打印匹配的字段编号。
echo 'AAA BBB CCC 00:00:00:00:00:00 EEE FFF GGG' |
awk '{ for (i=1; i<=NF; i++)
if ($i ~ /^([[:xdigit:]]{2}:){5}[[:xdigit:]]$/)
print i
next
}'
4
【讨论】:
print i; next。这会在找到匹配项后立即停止迭代。
sed 会起作用:
echo YOUR_STRING | sed -n 's/.*\([a-zA-Z0-9]\{2\}\(:[a-zA-Z0-9]\{2\}\)\{5\}\).*/\1/p'
例子:
echo abc ab:ab:ab:ab:ab:ab abc | sed -n 's/.*\([a-zA-Z0-9]\{2\}\(:[a-zA-Z0-9]\{2\}\)\{5\}\).*/\1/p'
ab:ab:ab:ab:ab:ab
【讨论】:
{ 和}。 echo abc ab:ab:ab:ab:ab:ab abc | sed -n 's/.*\([a-zA-Z0-9]\{2\}\(:[a-zA-Z0-9]\{2\}\)\{5\}\).*/\1/p' 输出ab:ab:ab:ab:ab:ab。