Назад | Перейти на главную страницу

Специальный символ или подстановочный знак в разделителе полей awk

Был бы признателен за информацию о специальном символе или подстановочном знаке в следующей команде:

/sbin/ifconfig eth0 | awk -F ' *|:' '/inet addr/{print $4}'

Что означает приведенный ниже код?

awk -F ' *|:' '  

Флаг -F (для awk) означает использование следующего расширенного регулярного выражения в качестве Разделитель полей Это означает, что здесь обрабатываются любые символы, заключенные в одинарные кавычки: ' *|:' как разделители.

Затем Awk напечатает 4-е поле, которое соответствует inet addr.

Например: если бы это был результат для ifconfig eth0:

eth0      Link encap:Ethernet  HWaddr 09:00:12:90:e3:e5  
          inet addr:192.168.1.29 Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe70:e3f5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:54071 errors:1 dropped:0 overruns:0 frame:0
          TX packets:48515 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:22009423 (20.9 MiB)  TX bytes:25690847 (24.5 MiB)
          Interrupt:10 Base address:0xd020 

Он должен распечатать

192.168.1.29

Чтобы разбить регулярное выражение:

' *|:'

в

' *'

Означает любое количество пробелов, а остальные символы не имеют особого значения, поэтому любой из них может быть разделителем. В * сам по себе не является разделителем, он просто означает любое число предшествующего символа, пробел.

Как вы знаете, ip command существует в /sbin и /bin , Итак, если вы хотите запустить свой скрипт без полномочий root, вы можете использовать следующую инструкцию:

mohsen@debian:~$ ip addr show eth0 |grep inet |grep -v inet6 | awk '{print $2}' |awk -F/ '{print $1}'
192.168.1.4