awk +匹配前后的打印行

时间:2018-06-25 12:34:39

标签: bash awk

我知道这是许多人提出的大多数查询的重复讨论,但是我没有得到任何合适的解决方案,只是在寻找awk命令的实用性。

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

Could not create image space with image file '/home/user/Documents/Android/out/host/linux-x86/framework/x86_64/core.art'. Attempting to fall back to imageless running. Error was: Cannot compile image to /home/user/Documents/Android/out/host/datadir/dalvik-cache/x86_64/dalvik-cache/x86/home@user@Documents@Android@out@host@linux-x86@framework@x86_64@core.art: Image compilation disabled.

当前,我正在尝试通过匹配HWADDR进行打印,然后检查第二行,然后检查下一行。

      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

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

我的问题是如何搜索到上一行。例如:-如果我将第二行的IP地址与之匹配,则如何反向搜索第一行,例如

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

根据对前一行的检查,此处我匹配的IP从192开始。我可以知道什么是getline的反向搜索,我的意思是反向搜索的指令

仅使用awk实用程序查看

2 个答案:

答案 0 :(得分:2)

能否请您尝试以下操作,如果有帮助,请告诉我。

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

答案 1 :(得分: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行的值。