2014-09-08 3 views
1

У меня есть многострочная команда pcregrep, которую я хотел бы преобразовать в команду awk или sed, потому что мне это нужно на машине, где pcregrep недоступен (OS X).преобразовать команду pcregrep в awk или sed

Оригинал команда:

ifconfig -a | pcregrep -M '^[a-z].*\n(\t[^\n]+\n)+\t[^\n]+baseTX' | grep -oE "^([a-z]+[^:]+)" 

Он выведет имя интерфейса, который содержит строку «BaseTX» (только метод, который я нашел, чтобы надежно узнать имя сетевого интерфейса на MacBook). В моем случае «en4».

вводимый текст выглядит следующим образом:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 
    options=3<RXCSUM,TXCSUM> 
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=1<PERFORMNUD> 
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 
stf0: flags=0<> mtu 1280 
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
    ether xx:xx:xx:xx:xx:xx 
    inet6 xxxx::xxxx:xxxx:xxxx:xxx%en0 prefixlen 64 scopeid 0x4 
    inet 10.xxx.xxx.xx netmask 0xffffff00 broadcast 10.xxx.xxx.255 
    inet6 xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 128 
    nd6 options=1<PERFORMNUD> 
    media: autoselect 
    status: active 
en5: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 
    options=60<TSO4,TSO6> 
    ether xx:xx:xx:xx:xx:xx 
    media: autoselect <full-duplex> 
    status: inactive 
en6: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 
    options=60<TSO4,TSO6> 
    ether xx:xx:xx:xx:xx:xx 
    media: autoselect <full-duplex> 
    status: inactive 
en4: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
    options=4<VLAN_MTU> 
    ether xx:xx:xx:xx:xx:xx 
    inet6 xxxx::xxxx:xxxx:xxxx:xxxx%en4 prefixlen 64 scopeid 0x7 
    inet XX.XXX.XXX.XX netmask 0xffffff00 broadcast XX.XXX.XXX.XXX 
    inet6 xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 128 
    nd6 options=1<PERFORMNUD> 
    media: autoselect (100baseTX <full-duplex>) 
    status: active 
bridge0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
    options=63<RXCSUM,TXCSUM,TSO4,TSO6> 
    ether xx:xx:xx:xx:xx:xx 
    Configuration: 
     id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0 
     maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200 
     root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0 
     ipfilter disabled flags 0x2 
    member: en5 flags=3<LEARNING,DISCOVER> 
      ifmaxaddr 0 port 5 priority 0 path cost 0 
    member: en6 flags=3<LEARNING,DISCOVER> 
      ifmaxaddr 0 port 6 priority 0 path cost 0 
    nd6 options=1<PERFORMNUD> 
    media: <unknown type> 
    status: inactive 
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304 
    ether xx:xx:xx:xx:xx:xx 
    media: autoselect 
    status: inactive 

Как я могу грейферы «EN4» с AWK или СЭД? Я пробовал в течение часа, но я просто плохо разбираюсь в sed и awk.

+0

У вас есть 'ip' команду? Что делает вывод 'ip addr show'? –

+0

sed - это единственный инструмент для простых подстановок на одной линии. Как только вы начнете говорить о чем-либо, связанном с выбором или другим действием на нескольких строках, вы должны использовать awk. –

+0

У меня нет команды ip. Спасибо за рекомендацию Эд, я буду помнить об этом. – KaZ

ответ

6

Предполагая, что расстояние соответствует (начальные пробелы только на линиях без заголовка) это должно работать:

awk -F: '/^[[:alpha:]]/ {iface=$1; next} /baseTX/ {print iface; exit}' 
+0

фантастический. Я был близок, но я пытался сделать слишком сложный материал с awk, это было очень просто в конце. Простой трудный;) – KaZ

+0

Простой, безусловно, сложно. Вот почему мое любимое правило регулярного выражения (но применимо почти везде) - «не пытайтесь соответствовать больше, чем вам нужно». –

0

Perl:

perl -0777 -nE 'say map {/^\w+/ && $&} grep {/baseTX/} split /^(?=\w+:)/m' 
Смежные вопросы