Bash awk+;在匹配前后打印行

Bash awk+;在匹配前后打印行,bash,awk,Bash,Awk,我知道对于很多人提出的大多数问题来说,这是一个重复的讨论,但我并没有得到任何合适的解决方案,只关注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:

我知道对于很多人提出的大多数问题来说,这是一个重复的讨论,但我并没有得到任何合适的解决方案,只关注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-
awk'/HWaddr/{printf$NF;printf”“;getline;print$2;}'| cut-c1-18,24-
xx:xx:xx:xx:xx:xx 192.168.xx.xx

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

 awk '/192/{printf $2;printf " ";<unknown>;}' <filename>
awk'/192/{printf$2;printf”“;;}
在这里,我匹配的IP从192开始,基于上一行的检查。我可以知道什么是getline的反向搜索吗?我的意思是反向搜索的指令是什么


仅使用awk实用工具查看

请尝试以下内容,并让我知道这是否对您有帮助

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

请您尝试以下内容,并让我知道这是否有助于您

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

最简单的方法是将前一行存储在变量中,然后在需要时引用它。例如,使用以下
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
当然,接口可以有多个地址,这将失败 例如,如果您的界面看起来像:

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

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

最简单的方法是将上一行存储在变量中,然后在需要时引用它。例如,使用以下
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
当然,接口可以有多个地址,这将失败 例如,如果您的界面看起来像:

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

这将始终打印出上一个
链接/ether
行的值。

请尝试选择任何答案作为正确答案(在所有答案中)以完全关闭线程。我看你从来没有这样做过。在你的系统上,查看手册页面的
grep
。某些实现有这样做的选项。请尝试选择任何答案作为正确答案(在所有答案中)以完全关闭线程。我看你从来没有这样做过。在你的系统上,查看手册页面的
grep
。有些实现有这样做的选项。没错,它看起来非常接近我的解决方案:)没错,它看起来非常接近我的解决方案:)