регулярное выражение для выбора конкретного слова, если оно не сопровождается определенным шаблоном? - PullRequest
0 голосов
/ 31 января 2020

У меня есть список данных в этом формате:

eth0: flags=73<UP,LOOPBACK,RUNNING>  mtu 1500
    inet 127.0.0.1  netmask 255.0.0.0
    inet6 ::1  prefixlen 128  scopeid 0xfe<compat,link,site,host>
    loop  (Local Loopback)
    RX packets 0  bytes 0 (0.0 B)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 0  bytes 0 (0.0 B)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=73<UP,LOOPBACK,RUNNING>  mtu 1500
    inet6 ::1  prefixlen 128  scopeid 0xfe<compat,link,site,host>
    loop  (Local Loopback)
    RX packets 0  bytes 0 (0.0 B)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 0  bytes 0 (0.0 B)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Мне нужно выбрать eth1 (это первое слово, и это слово, которое всегда начинается с e). за ним не следует 127.0.0.1 (что также может появиться позже в следующей строке).

здесь eth0 не квалифицировано, поскольку за ним следует 127.0.0.1

Я попробовал все и кажется, ничего не работает. это вообще возможно с регулярным выражением? если да то как?

Ответы [ 3 ]

2 голосов
/ 31 января 2020

Вы можете использовать эту команду awk, которая изначально доступна в Ununtu:

awk -F ': ' '$1 ~ /^e[[:alnum:]]+$/ && NF==2{s=$1; p=NR} 
       NR==p+1 && !/ 127\.0\.0\.1[[:blank:]]/{print s}'

Объяснение:

-F ': '  # make ": " as input delimiter
$1 ~ /^e[[:alnum:]]+$/ && NF==2 { # if $1 starts with e and has 1+ alphanumeric characters later and there are exactly 2 fields in that line
   s=$1      # save $1 in var s
   p=NR      # save record no in var p
}
NR==p+1 && !/ 127\.0\.0\.1[[:blank:]]/ { # we are processing (p+1)th record and it doesn't have " 127.0.0.1 " in it
   print s   # print s
}
2 голосов
/ 31 января 2020
$ awk -v RS= -F':' '!/[[:space:]]127\.0\.0\.1[[:space:]]/{print $1}' file
eth1

Это будет работать при использовании любого POSIX awk в любой оболочке на каждом UNIX поле.

1 голос
/ 31 января 2020

Не уверен в деталях реализации Ubuntu, но вы можете использовать отрицательный прогноз:

^eth\d+(?=:)(?!.*\n.*[^0-9]127\.0\.0\.1[^0-9])
  • ^eth\d+(?=:) - начало строки должно быть "eth", за которым следует один или более цифр, за которым следует двоеточие, но не ставится двоеточие
  • (?!.*\n.*[^0-9]127\.0\.0\.1[^0-9]) - убедитесь, что содержимое, следующее за предыдущим соответствием, не содержит "127.0.0.1"

https://regex101.com/r/NeEAnn/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...