синтаксический анализ дерева lspci с помощью регулярных выражений - PullRequest
0 голосов
/ 25 сентября 2018
$ lspci -tv | grep -E 'Gigabit Network|Gigabit Ether| Ethernet' | grep -oP '(?<=^).*(?=Intel)'
           +-01.0-[01-04]----00.0-[02-04]--+-01.0-[03]--+-00.0  
           |                               |            +-00.1  
           |                               |            +-00.2  
           |                               |            \-00.3  
           |                               \-03.0-[04]--+-00.0  
           |                                            \-00.1  
           +-1c.0-[05]----00.0  
           +-1c.1-[06]----00.0  

Я пытаюсь получить порядок NIC (слот), используя адрес шины PCI из этого дерева.Они представлены как последнее регулярное выражение \[[0-9a-ZA-Z]\] в данной строке, например, [03],[04],[05], а затем подзаголовки, следующие за ними, например, 00.0, 00.1, 00.2 для [03].

Мой ожидаемый результат должен быть:

03:00.0
03:00.1
03:00.2
03:00.3  
04:00.0
04:00.1   
05:00.0
06:00.0

Например, я пробовал это, но не пошел дальше.Я знаю, что это некрасиво, и подойдет любое решение с pipes или без него.

$ lspci -tv | grep -E 'Gigabit Network|Gigabit Ether| Ethernet' | grep -oP '(?<=\-).*(?=Intel)'  | grep -oE '(\[[0-9a-ZA-Z]{2}\])|(\[[0-9a-ZA-Z]{2}\].*[0-9]{2}\.[0-9])|(^[0-0]{2}.[0-9])'
[03]--+-00.0
00.1
00.2
00.3
[04]--+-00.0
00.1
[05]----00.0
[06]----00.0

Выход lspci -tv.Меня интересуют только сетевые карты.grep Network, но есть и другие случаи, в которых говорится, Ethernet.

$ lspci -tv
-[0000:00]-+-00.0  Intel Corporation Skylake Host Bridge/DRAM Registers
           +-01.0-[01-04]----00.0-[02-04]--+-01.0-[03]--+-00.0  Intel Corporation I350 Gigabit Network Connection
           |                               |            +-00.1  Intel Corporation I350 Gigabit Network Connection
           |                               |            +-00.2  Intel Corporation I350 Gigabit Network Connection
           |                               |            \-00.3  Intel Corporation I350 Gigabit Network Connection
           |                               \-03.0-[04]--+-00.0  Intel Corporation I350 Gigabit Network Connection
           |                                            \-00.1  Intel Corporation I350 Gigabit Network Connection
           +-02.0  Intel Corporation HD Graphics P530
           +-13.0  Intel Corporation Sunrise Point-H Integrated Sensor Hub
           +-14.0  Intel Corporation Sunrise Point-H USB 3.0 xHCI Controller
           +-14.2  Intel Corporation Sunrise Point-H Thermal subsystem
           +-16.0  Intel Corporation Sunrise Point-H CSME HECI #1
           +-16.1  Intel Corporation Sunrise Point-H CSME HECI #2
           +-17.0  Intel Corporation Sunrise Point-H SATA controller [AHCI mode]
           +-1c.0-[05]----00.0  Intel Corporation I210 Gigabit Network Connection
           +-1c.1-[06]----00.0  Intel Corporation I210 Gigabit Network Connection
           +-1c.6-[07-08]----00.0-[08]----00.0  ASPEED Technology, Inc. ASPEED Graphics Family
           +-1f.0  Intel Corporation Sunrise Point-H LPC Controller
           +-1f.2  Intel Corporation Sunrise Point-H PMC
           \-1f.4  Intel Corporation Sunrise Point-H SMBus

1 Ответ

0 голосов
/ 25 сентября 2018

С GNU awk для 3-го аргумента до match():

$ cat tst.awk
!/Network|Ethernet/ { next }
match($0,/.*\[([0-9]+)\]/,a) {
    nic = a[1]
}
match($0,/.*[+-\\]-([0-9]+\.[0-9]+)  /,a) {
    print nic ":" a[1]
}
$
$ awk -f tst.awk file
03:00.0
03:00.1
03:00.2
03:00.3
04:00.0
04:00.1
05:00.0
06:00.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...