decifrando a instrução unix

4

Eu decifro o que está sendo dito aqui:

export IP='/sbin/ifconfig | grep 'inet addr:'|grep -v '127.0.0.1'|
    cut -d: -f2 | awk '{print $1}''

Eu sei que é definir o IP como uma variável de ambiente, mas fora isso, o que tudo o mais significa?

    
por O_O 08.09.2011 / 03:44

3 respostas

15

Listará todos os endereços IP sem loopback no sistema. Supondo que você tenha apenas um endereço IP não-loopback nesta caixa, ele irá exportar o endereço IP do sistema para a variável de ambiente "IP".

Comece executando a "seção" de um pipeline de cada vez. Significado, primeira execução

/sbin/ifconfig

para ver o que faz. Então corra ...

/sbin/ifconfig | grep 'inet addr:'

e continue a partir daí.

    
por 08.09.2011 / 03:56
5

Há muita coisa acontecendo. Primeiro:

export IP='...'

significa executar o comando entre backquotes (não aspas simples, tenha cuidado) e use sua saída como o valor da variável chamada "IP". "exportar" significa que qualquer processo filho herdará a variável denominada "IP" e seu valor.

O comando é um pipeline, stdout de cada alimentação em stdin do seguinte. /sbin/ifconfig produz uma lista de informações sobre interfaces de rede. Todas as linhas de saída do ifconfig são alimentadas em grep 'inet addr:' . O Grep apenas passa linhas de texto através do que corresponde, pelo menos parcialmente, ao primeiro argumento, um padrão chamado de expressão regular.

O comando grep -v '127.0.0.1' apenas passa linhas de texto que não correspondem. 127.0.0.1 é o endereço IP "loop back". É bem conhecido, não queremos que ele entre no valor da variável chamada "IP".

O comando cut -d: -f2 imprime o segundo campo de cada linha em sua entrada. Os campos são delimitados por ':' (ponto e vírgula). O comando awk '{print $1}' apenas imprime a primeira coluna delimitada por espaço em branco.

Como TheDude escreve, ele coloca todos os endereços IP não-loopback como cadeias de caracteres no valor do IP da variável de ambiente do shell.

    
por 08.09.2011 / 04:07
4

Apenas uma nota: Como o ifconfig geralmente exibe mais de uma conexão (além da conexão de loopback), esse código cria uma única variável de cadeia com cada endereço IP separado do seguinte por uma nova linha. O meu parece assim:

bigbird@sananda:~/pq$ export IP='/sbin/ifconfig | grep 'inet addr:'|\
grep -v '127.0.0.1'| cut -d: -f2 | awk '{print $1}''
bigbird@sananda:~/pq$ echo "[${IP}]"
[192.168.126.1
192.168.114.1
192.168.1.2]
bigbird@sananda:~/pq$

Para realmente usar isso para algo, provavelmente teria que ser analisado mais (dividindo a string em novas linhas).

Uma forma de lidar com isso seria colocar as strings de endereço IP nos elementos da matriz para começar:

export IP=($(/sbin/ifconfig | grep 'inet addr:'|grep -v '127.0.0.1'| cut -d: -f2 |\
awk  '{printf "%s ", $1}'))

for (( I=0; I<${#IP[@]}; I++ ))
do
  echo "${I} [${IP[${I}]}]"
done

bigbird@sananda:~/bin$ mytest
0 [192.168.126.1]
1 [192.168.114.1]
2 [192.168.1.2]
bigbird@sananda:~/bin$ 

Os parens adicionados () transformam a saída em elementos da matriz. A impressão foi alterada para printf para adicionar um espaço em branco (o caractere separador de padrão) após cada IP e para eliminar as novas linhas. A notação de retrocesso:

'...'

para transformar a saída de um comando em uma string também foi substituído pela sintaxe mais recente $ (...).

O loop for é incluído apenas para mostrar os resultados e uma maneira de acessá-los.

    
por 10.09.2011 / 01:29