excluindo alias do arquivo usando sed

1

Eu criei um programa de varredura de ping que salva o IP obtido em um arquivo chamado hosts. Então, eu queria excluir meu próprio endereço IP do arquivo sem saber qual é o meu endereço IP, então tentei fazer o seguinte:

    alias ownip='hostname -I'
    sed ownip ./host

Isso não funcionou, resultando no seguinte erro:

    sed: -e expression #1, char 1: unknown command: 'o'

Então, como posso remover meu próprio IP do arquivo?

    
por Dark Eagle 04.03.2017 / 18:35

3 respostas

1

Se o arquivo "host" de entrada é apenas um arquivo em que cada linha é um endereço IP e você deseja remover todos os endereços IP gerados por hostname -I deste arquivo, tente isto:

sed -i "$(hostname -I | sed 's/\([.:[:xdigit:]]\{1,\}\)/\/\/d;/g')" ./host

O sed dentro da subsituição do comando que o nome do host é canalizado apenas converte os endereços IP gerados pelo nome do host em comandos sed delete para o sed externo. O sinal i do sed diz ao sed para sobrescrever o arquivo que você fornece. Você pode querer executá-lo sem este sinalizador primeiro para garantir que a saída esteja correta ou dê a i um argumento que informe ao sed para criar um backup do arquivo de entrada com esse argumento como um sufixo, por exemplo, -i'~' produzirá um backup chamado host~ . Se a sua versão do sed não tiver esse sinalizador, você poderá gravar em um arquivo temporário e substituir o original:

sed "$(hostname -I | sed 's/\([.:[:xdigit:]]\{1,\}\)/\/\/d;/g')" ./host > /tmp/newhost && mv /tmp/newhost ./host

Acho que é isso que o i faz nos bastidores de qualquer maneira.

Se você realmente quiser usar um alias, observe que os aliases só são substituídos textualmente quando estão a (s) primeira (s) palavra (s) de comando em um comando, então no seu exemplo original você precisaria usar a substituição de comando, ie $ (ownip), para dar ao sed a saída do alias. Sua mensagem de erro significa que o sed está tentando usar "ownip" como seu script, caso em que é reclamado porque o sed não possui o comando 'o'.

    
por 04.03.2017 / 22:41
0

eu uso:

ip a | grep inet | awk '{print $2}'

se você não quiser que seu endereço local use um grep -v 127 adicional

    
por 04.03.2017 / 18:49
0

Eu modificaria seu alias um pouco para trim dos espaços em branco e, em seguida, usaria seu alias ownip para gerar o comando delete também:

alias ownip='hostname -I | xargs'
sed -e "$(ownip | sed -e 's/[.]/[.]/g;s|.*|/&/d;|')" yourhostsfile
    
por 04.03.2017 / 22:32