Como escolher o último número em uma linha em um script bash

2

Eu tenho saída do comando smartctl -a; uma das linhas é assim:

9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 301

Eu coloquei isso em uma variável (se esse é o termo correto) no meu script bash como este:

$SMARTCTL_OUTPUT='smartctl -a /dev/sda'

Eu quero analisar isso para que apenas o número no final da linha seja retornado para uma variável, portanto, no exemplo acima 301 é colocado na variável $POWER_ON_HOURS .

Eu tentei usar o grep:

$SMARTCTL_OUTPUT='smartctl -a /dev/sda | grep "Power_On_Hours"'

Mas isso retorna o outro texto ( 9 Power_On_Hours 0x0032 100 100 000 Old_age Always - ) que eu não estou interessado.

Posso devolver apenas o número no final da linha?

    
por Tim 15.08.2013 / 17:09

3 respostas

5

Usar awk '{print $NF}' fará o truque. $NF refere-se ao último campo. Awk É uma linguagem para extração de dados.

Um programa AWK é uma série de pares de ação padrão, escritos como:

'' condição '' {'' ação ''}

awk '{print $NF}'  

Imprimirá sempre o último campo.

    
por 15.08.2013 / 17:18
2

Você pode fazer isso com o bash puro:

POWER_ON_HOURS=${SMARTCTL_OUTPUT##[^0-9]}

Isso retorna a string resultante da remoção do prefixo mais longo de SMARTCTL_OUTPUT, que não termina com um dígito.

    
por 15.08.2013 / 17:25
1

Eu gosto muito de gawk, mas você poderia usar uma abordagem mais flexível sem ter que ter (g) awk em seu sistema. Armazene a saída do seu comando em uma matriz bash como essa (observe os sinais de retorno ao redor do seu comando):

array=('smartctl -a /dev/sda')

Então você pode se referir a qualquer palavra em sua matriz pelo seu número de índice (veja abaixo exemplos).

Infelizmente, não tenho dispositivos conectados ao meu sistema que o "smartctl" esteja reconhecendo. Então eu uso a saída do comando "man uptime" como entrada para meus exemplos.

array=('man uptime')

Mostrar todos os elementos desta matriz:

echo ${array[@]}
UPTIME(1) FreeBSD General Commands Manual UPTIME(1) NAME uptime — show how long system has been running SYNOPSIS uptime DESCRIPTION The uptime utility displays the current time, the length of time the sys‐ tem has been up, the number of users, and the load average of the system over the last 1, 5, and 15 minutes. FILES /boot/kernel/kernel system name list SEE O w(1) HISTORY The uptime command appeared in 3.0BSD. FreeBSD 9.1 April 18, 1994 FreeBSD 9.1

Mostrar palavras específicas: Por favor, note que os elementos da matriz estão sendo contados a partir de zero. Portanto, a sétima palavra seria referida como "$ {array [6]}".

Digamos que você queira recuperar a 19ª e a 17ª palavra da saída do comando "man uptime" (ou seja, as palavras "DESCRIPTION" e "SYNOPSIS").

echo ${array[18]} ${array[16]}
DESCRIPTION SYNOPSIS

Usando a abordagem interessante do usuário 'Arpith' com 'read', você também pode armazenar elementos de array em variáveis mais fáceis de lembrar, como:

array2=('ifconfig')
read IPETH0 IPLO <<< $(echo ${array2[6]} {array2[46]}
echo $IPETH0 $IPLO
192.168.0.103 127.0.0.1

Não mexa em algo como "último campo nesta linha" ou uma máscara de caractere, etc. Basta usar os números de posição.

Índices de matriz são inteiros positivos. Assim, você pode fazer todos os tipos de cálculos em seu script de shell para escolher palavras específicas (como intervalos ou a cada terceira palavra ou for-loops ...)

HTH

bernie

    
por 28.08.2013 / 00:09