【问题标题】:awk + Print lines before and after matchawk + ​​打印匹配前后的行
【发布时间】:2018-06-25 12:34:38
【问题描述】:

我知道这是对许多人提出的大多数查询的重复讨论,但我没有专门得到任何合适的解决方案,只关注 awk 命令实用程序。

我正在尝试从 ifconfig 输出中过滤 MAC 和 IP 地址。

      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
      inet addr:192.xx.xx.xx  Bcast:192.xx.xx.xx  Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

目前我正在尝试通过匹配 HWADDR 然后检查第二行和下一行来打印。

awk '/HWaddr/{printf $NF;printf " ";getline;print $2;}' <filename> | cut -c1-18,24-

xx:xx:xx:xx:xx:xx 192.168.xx.xx

我的问题是如何搜索到上一行。例如:- 如果我匹配第二行的 IP 地址,那么如何反向搜索第一行,类似于

 awk '/192/{printf $2;printf " ";<unknown>;}' <filename>

根据检查上一行,我从 192 开始匹配 IP。请问getline的反向搜索是什么,我的意思是反向搜索的指令是什么

仅使用 awk 实用程序查看

【问题讨论】:

  • 请尝试选择任何一个答案作为正确答案(在所有答案中)以完全关闭线程。我看你从来不这样做。
  • 在您的系统上查看grep 的手册页。一些实现可以选择执行此操作。

标签: bash awk


【解决方案1】:

您能否尝试关注一下,如果这对您有帮助,请告诉我。

awk '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/{print $2 OFS prev} {prev=$0}' Input_file

【讨论】:

    【解决方案2】:

    最简单的方法是将前一行存储在一个变量中,然后在需要时引用它。例如,使用以下awk 脚本:

    /192/ {print lastline}
    { lastline=$0 }
    

    如果我给它以下放置:

    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 64:00:6a:7d:06:1a brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.24/24 brd 192.168.1.255 scope global dynamic eth0
           valid_lft 67513sec preferred_lft 67513sec
        inet6 fe80::5da1:2401:a725:d2e0/64 scope link 
           valid_lft forever preferred_lft forever
    

    我得到输出:

    link/ether 64:00:6a:7d:06:1a brd ff:ff:ff:ff:ff:ff
    

    当然,接口可以有多个地址,这会失败 如果你的界面看起来像,例如:

    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 64:00:6a:7d:06:1a brd ff:ff:ff:ff:ff:ff
        inet 172.16.32.1/24 brd 172.16.32.255 scope global dynamic eth0
           valid_lft 67513sec preferred_lft 67513sec
        inet 192.168.1.24/24 brd 192.168.1.255 scope global dynamic eth0
           valid_lft 67513sec preferred_lft 67513sec
        inet6 fe80::5da1:2401:a725:d2e0/64 scope link 
           valid_lft forever preferred_lft forever
    

    与其看“上一行”,不如明确 记录MAC地址:

    /192/ {print hwaddr}
    /link\/ether/ {hwaddr=$0}
    

    这将始终打印出上一行 link/ether 的值。

    【讨论】:

    • BINGO,它看起来非常接近我的解决方案 :)
    最近更新 更多