Capturando apenas uma seção de uma saída de comando

5

Se eu fosse digitar um determinado comando, isso me daria uma saída longa no terminal. Eu só preciso de alguns caracteres desta saída. Como faço para, em um script bash, salvar apenas determinados caracteres de uma saída de terminal como uma variável?

Por exemplo, se meu script for:

#!/bin/bash

ifconfig

Eu poderia salvar toda a saída como uma variável usando

OUTPUT="$(ifconfig)"

Mas eu só quero o meu endereço IP copiado, que é depois de inet [IP ADDRESS]

Como eu faria isso?

Editar: O endereço IP está apenas sendo usado aqui como exemplo, pois não posso mencionar o comando aqui por razões de segurança, na verdade é 'frase: [número de cinco dígitos]' entre outros textos e eu só preciso desse número de cinco dígitos . Desculpe por qualquer confusão

    
por Lucas Johnston 22.07.2016 / 13:28

4 respostas

9

Usando grep

ifconfig | grep -oP '(?<=inet addr:)[\d.]+'

Isso usa expressões regulares no estilo Perl do grep para selecionar o endereço IP que segue a string inet .

Então, para salvar isso em uma variável, basta colocar os dois comandos dentro de $() :

output=$(ifconfig | grep -oP '(?<=inet addr:)[\d.]+')

O acima irá salvar os endereços IP para todas as interfaces ativas em seu sistema. Se você quiser apenas salvar a saída para uma interface, diga eth0 e use:

output=$(ifconfig eth0 | grep -oP '(?<=inet addr:)[\d.]+')

Usando awk

ifconfig eth0 | awk -F'[ :]+' '/inet /{print }'

/inet / seleciona linhas que contêm inet . Nessas linhas, o terceiro campo é impresso onde um separador de campo é uma combinação de espaços ou dois pontos.

Usando sed

ifconfig eth0 | sed -En 's/.*inet addr:([[:digit:].]+).*//p'

ifconfig alternativo

Existe outra versão de ifconfig que produz saída como inet 1.2.3.4 em vez de inet addr:1.2.3.4 . Para essa versão, tente:

ifconfig | grep -oP '(?<=inet )[\d.]+'

Ou:

ifconfig eth0 | awk '/inet /{print }'

Ou use este comando sed que funciona com qualquer versão de ifconfig :

ifconfig eth0 | sed -En 's/.*inet (addr:)?([[:digit:].]+).*//p'
    
por John1024 22.07.2016 / 13:43
4

ifconfig pode desaparecer no futuro, ele está obsoleto em algum linux (talvez algumas versões do ubuntu, mas continue lendo).

ip do pacote iproute2 (deve ser instalado por padrão) fornece

ip addr list

e pode ser abreviado para

ip a

e combinado com

ip a | grep -o -P '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}(?=/)'

para filtrar todos os números semelhantes a IPv4 com a seguinte barra de máscara do CIDR. Se você não se importar com a transmissão, ela até funciona no modo -E do grep, apenas deixe os últimos colchetes fora do RegEx.

Se você geralmente quer cortar a saída cli, e quer evitar a tubulação através do corte ... (como neste exemplo para obter o primeiro campo)

IPS=$(ip a | grep -o -E '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | cut -d\  -f1 - )

você pode usar a manipulação de string bash (como no exemplo a seguir):

echo ${SSH_CONNECTION%% *}

Isso deve lhe dar algumas pistas sobre onde e como começar.

    
por Matthias Š 22.07.2016 / 16:51
1

Maneira simples de imprimir apenas o endereço IP, independentemente da interface, usando o Grep; desde que foi a questão

ifconfig |grep -o -P '(?<=addr:).*(?= Bcast:)'

addr: é a string inicial

Bcast é a string final

Qualquer coisa entre essas duas cadeias é impressa usando. *

    
por user437928 22.07.2016 / 14:40
1

Usando facter :

facter ipaddress
    
por Phillip -Zyan K Lee- Stockmann 22.07.2016 / 17:03