如何在Linux中找到跨多行的模式?

时间:2014-02-26 10:11:54

标签: linux unix

我正在尝试获取此命令的一些特定行:

ifconfig

这是命令的输出:

eth0      Link encap:Ethernet  HWaddr 00:10:E0:3F:6F:BC  
          inet addr:10.71.1.30  Bcast:10.71.1.255  Mask:255.255.255.0
          inet6 addr: fe80::210:e0ff:fe3f:6fbc/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3059275068 errors:0 dropped:1378 overruns:0 frame:0
          TX packets:2094779962 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6566542892239 (5.9 TiB)  TX bytes:202791652910 (188.8 GiB)

eth1      Link encap:Ethernet  HWaddr 00:10:E0:3F:6F:BD  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1417584931 errors:0 dropped:32908 overruns:0 frame:0
          TX packets:1284691038 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2256566826674 (2.0 TiB)  TX bytes:182643225952 (170.0 GiB)

我只想要包含“Link”和“bytes”字样的行,例如:

eth0      Link encap:Ethernet  HWaddr 00:10:E0:3F:6F:BC 
RX bytes:6566542892239 (5.9 TiB)  TX bytes:202791652910 (188.8 GiB)
eth1      Link encap:Ethernet  HWaddr 00:10:E0:3F:6F:BD
RX bytes:2256566826674 (2.0 TiB)  TX bytes:182643225952 (170.0 GiB)

4 个答案:

答案 0 :(得分:2)

最好的方法必须是使用grep来过滤线条。例如,使用:

ifconfig | egrep " Link|bytes"

注意我在Link之前添加了一个空格,以避免匹配以Scope:Link结尾的行。

您也可以使用:

ifconfig | awk '/ Link/ || /bytes/'

ifconfig | grep " Link\|bytes"

答案 1 :(得分:1)

当然grep是最好的工具。但是,还有其他一些方法可以做同样的事情。也就是说,

ifconfig | sed -n '/Link \|bytes/p'

ifconfig | awk '/Link |bytes/'

答案 2 :(得分:0)

ifcofig|perl -lne 'print if(/Link/||/bytes/)'

答案 3 :(得分:0)

这里有一些有用的模式,我遇到的大多数人似乎都不知道。第一个问题与你的问题特别相关。

grep -e是你最好的新朋友

ifconfig | grep -e Link -e bytes

你可以用sed做类似的事情,它还有一个额外的好处,就是打印掉第一行(可能包含一个标题)。在这个例子中,我打印出标题行,任何行都包含LISTEN或'bar'(第二个表达式就是为了强化你不仅限于一个这一事实。)这里,1p正在解决第一个问题。 line,(origin-1),对'p'rint

的操作
lsof -Pni | sed -n -e 1p -e '/LISTEN/p' -e '/bar/p'