Usando grep, awk, etc. para filtrar a saída do comando

2

Vou usar route como exemplo.

route -n

A saída acima informa informações de roteamento. A linha superior é sua conexão ativa. Eu posso manipular a saída para apenas a segunda coluna, fazendo:

route -n | awk '{print $2}'

Agora, como posso filtrar por linha?

    
por Brian Graham 29.11.2011 / 21:30

4 respostas

3

Para imprimir uma linha em particular, você pode usar sed :

route -n | sed -n 2p

para imprimir a segunda linha.

sed , o que é

Eu darei uma explicação curta e incompleta do que é sed . Para uma descrição completa, sugiro ver sed info pages (run info sed ).

sed mean s tream ed itor , ou seja, um editor que pode atuar em um fluxo (ou canal) de dados de texto, embora possa atuar também em arquivos; substancialmente isso significa que (diferentemente de ed ) ele nunca pode voltar para uma linha anterior.

sed , pois awk lê uma linha por vez e aplica um script a essa linha para possivelmente modificá-la. No final do script, por padrão, a linha modificada é enviada para stdout. Então sed vai na próxima linha.

Um script é uma sequência de par address-command, se a linha corresponder ao endereço, então o comando é executado.

O uso típico de sed é realizar uma substituição de um padrão por algo, por exemplo,

command | sed 's/ *$//'

aqui, a string entre aspas simples é o script, consistindo em um único par endereço-comando. O endereço está faltando (ele apareceria antes do s ), nesse caso, o comando é aplicado por padrão a todas as linhas de entrada. s é o comando e o restante da string são instruções específicas de comando, dizendo "substituto 0 ou mais ocorrência ( * ) de um caractere de espaço ( ) no final na linha ( $ ) sem nada ( ou seja, removê-los) ".

Outros comandos úteis são p e d . O comando p imprime a linha atual, isso é útil em combinação com a opção -n , que modifica o comportamento padrão para imprimir a linha atual no final do script. Então, em

sed -n '2p'

o script é a string 2p que consiste no endereço 2 e o comando p , então a linha 2 será impressa, toda a outra linha não será impressa, devido à opção -n .

O comando d exclui uma linha, por exemplo

    sed '3,6d'

excluiria todas as linhas do terceiro para o sexto. 3,6 é um intervalo de endereços. Observo que neste caso não se deve usar a opção -n , porque queremos imprimir todas as outras linhas.

Por último, um endereço pode ser um padrão, como em

sed -n '/^#/p'

este comando imprime todas as linhas que começam ( ^ ) com um caractere # .

    
por enzotib 29.11.2011 / 22:04
1

Você pode filtrar IN row enfileirando para grep e encontrando uma linha que comece com seu endereço IP de interesse, por exemplo, se você quiser ver a linha para 192.168.1.1, você faria:

$ route | grep ^192.168.1.0
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0

A marca '^' significa "line-starts-with". Assim, você poderia ser mais genérico com:

$ route | grep ^192.168.1
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.111.0   *               255.255.255.0   U     0      0        0 virbr0
    
por kyleN 29.11.2011 / 21:39
1

Você pode usar uma expressão regular para informar ao awk as linhas desejadas, por exemplo,

route -n | awk '/^192.168/ {print $2}'

produzirá a coluna segundos de todas as linhas que começam com 192.168

    
por Florian Diesch 29.11.2011 / 22:02
0

uma resposta do awk também pode ser parecida com:

$0 ~ ( /matchthis/ ) { print $2 }

$ 0 simplesmente se refere a linha / linha inteira

sed e awk podem ser uma combinação muito poderosa

expressões regulares valem a pena para dominar

    
por Manse Jennings 02.12.2011 / 15:06