【问题标题】:How can I get the field number that contains a MAC address with sed or awk?如何使用 sed 或 awk 获取包含 MAC 地址的字段编号?
【发布时间】: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,但不知道如何输出字段编号。

【问题讨论】:

    标签: regex awk sed field


    【解决方案1】:

    使用 NF 循环字段

    使用 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
    

    【讨论】:

    • 工作完美!我想到了类似的东西,但认为也许有直接的方法,谢谢!
    • 为什么需要循环呢?
    • 有没有更快的方法找到字段号?
    • @Ghost 如果每行只有一个 MAC 地址,请执行print i; next。这会在找到匹配项后立即停止迭代。
    • @jaypal 你是对的;它似乎对提供的语料库没有太大影响,但我添加了锚点和下一条语句来限制回溯并在没有匹配的字段上更快地失败。这可能会对更大的输入文件产生影响,但在我的系统上使用提供的数据时,无论哪种方式都需要相同的 6 毫秒。
    【解决方案2】:

    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
    

    【讨论】:

    • 您使用的是哪个 sed?正如当前发布的那样,这适用于 GNU sed。
    • @CodeGnome 我忘了转义{}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
    猜你喜欢
    • 1970-01-01
    • 2018-10-10
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多