Usando a saída de 'grep' como variável no segundo comando

2

Atualmente tenho duas seqüências de linha de comando bash que uso para coletar dados necessários para uma determinada tarefa. Eu estava tentando simplificar e ter apenas um comando usado para coletar os dados sem usar um script.

Primeiro, eu cat um arquivo e canalizo para um comando grep e exibo apenas o valor inteiro. Em seguida, copio e colo esse valor em uma equação que sempre será constante, exceto pelo valor grep ped do primeiro comando.

  • 1o comando: cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$'
  • 2º comando: echo $(( (2147483633-"**grep value**")/5184000 ))

Estou perplexo sobre como posso conseguir isso. Qualquer orientação sobre isso seria muito apreciada!

    
por byron 26.01.2015 / 01:45

2 respostas

3

Aqui está como um comando:

echo $(( (2147483633 - $(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$') )/5184000 ))

Como a simplificação foi feita

Primeiro, considere este canal:

cat /proc/zem0 |grep -i isrs'

Isso pode ser simplificado para:

grep -i isrs /proc/zem0

Assim, todo o primeiro comando se torna:

grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'

A última mudança é substituir o primeiro comando pelo segundo usando a substituição de comando: $(...) . Assim, nós substituímos:

echo $(( (2147483633-"**grep value**")/5184000 ))

com:

echo $(( (2147483633-$(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'))/5184000 ))

Mais uma simplificação

Se o seu grep suportar expressões regulares no estilo perl, como o GNU grep , então, como sugerido por jimmij nos comentários, uma simplificação adicional é possível:

echo $(( (2147483633-$(grep -Pio 'isrs.*?\K[0-9]+$' /proc/zem0))/5184000 ))
    
por 26.01.2015 / 01:52
0

O uso de substituição de comandos como respondido por John1024 é a melhor maneira de resolver este problema.

Como alternativa, você pode canalizar sua saída para while read , que atribuirá cada valor separado por espaço a uma variável de sua escolha. Isso geralmente é usado quando sua saída tem mais de uma variável que você gostaria de usar.

cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$' | while read myvariable ; do echo $(( (2147483633-"${myvariable}")/5184000 )) ; done

while read é realmente útil para dados colunares, inserção de material no inventário, etc. se file1 content for:

host1 192.168.0.100 web nyc1 00-23-54-EE-10-5C
host2 192.168.0.101 web nyc2 00-23-54-EE-10-5D
host3 192.168.0.102 web nyc1 00-23-54-EE-10-5E

então você pode fazer

cat file1 | while read host ip role dc mac ; do
    cobbler system add --name=${host} --ip-address=${ip} --netmask=255.255.255.0 --mac-address=${mac} --comments="${role} ${dc}"
done
    
por 26.01.2015 / 02:23