Salvando Saída em uma Variável e Reutilizando-a

0
page='grep $x /var/www/vhosts/example.com/statistics/logs/access_log | awk '{print $7}'| sort |uniq -c |sort -nr'
times='$page | wc -l'

Eu estou tentando salvar a saída do grep em uma variável como page .

Mais tarde, porém, quero reutilizar essa saída do grep para calcular outra coisa.

Abaixo do código é lançado:

command not found

Como posso corrigir o problema e reutilizar a saída?

    
por NecNecco 07.04.2016 / 23:13

2 respostas

3

Como a variável page pode conter texto arbitrário, você não deve usar echo , você deve usar printf .

times="$(printf %s\n "$page" | wc -l)"

Observe também que, se você tiver mais de uma nova linha no resultado de seu comando grep , não obterá o resultado esperado, não importando o motivo, porque tiras de substituição de comandos à direita de novas linhas e o comando echo ou o comando printf que eu uso da mesma forma adicionará exatamente em uma nova linha, independente de quantos foram retirados da saída grep quando a variável $page estava sendo definida.

É claro que, mesmo nesse caso, a variável $times conterá muitos espaços extras no início, porque é assim que wc -l exibirá suas informações. Portanto, essa resposta não aborda o problema mais amplo do seu script: parece que você está pressionando bash para o serviço em que awk serviria melhor.

Eu posso estar errado sobre isso, dependendo do que você pretende fazer com a variável $times , mas eu duvido seriamente disso. Muito provavelmente você pode fazer o que você precisa ( tudo do que você precisa) com um awk one-liner.

    
por 07.04.2016 / 23:48
1

Atualizado: Revisão de valores de página de várias linhas $, obrigado @Wildcard!

Você estava muito perto da linha 2. Desde que sua linha 1 realmente funcione, então, para sua segunda linha, você deve tentar:

times="$(echo "$page" | wc -l)"

Explicação

  • $( e ) é a substituição de comando, o equivalente a fazer com os backticks, (em man bash eles são referidos como backquotes ), mas eu prefiro $( ) porque eles são mais fáceis de detectar código
  • Apenas ter $page não passará nada para wc -l
  • Em vez disso, o Bash pensa que você quer executar o que está escrito em $page como um comando e passar a saída desse comando para wc -l , portanto, se $page contiver 5 bla , 5 bla será um comando . Isso levaria a erros como aqueles encontrados quando você viu command not found
  • Então, para passar o valor, podemos echo the $page variable
  • No entanto, se $page contiver valores de várias linhas, echo $page resultará, por padrão, na perda dessas linhas, elas se tornarão espaços
  • Para evitar esse resultado indesejado, preserve o valor e as novas linhas em $page cercando aspas: echo "$page"

Portanto, usando echo "$page" , wc -l pode então receber corretamente o valor de $page .

    
por 07.04.2016 / 23:24