Dividir uma linha variável por linha

2

Eu inicializo a variável assim:

dmesgDevs=$(dmesg | grep idVendor)

e deseja imprimi-lo linha a linha e, em seguida, verificar se há palavra em determinada linha.

    
por dzakens 19.09.2013 / 21:02

1 resposta

2

Manter mais linhas em uma variável pode ser muito doloroso. Na verdade, quando você usa apenas dmesg | grep idVendor , a saída será organizada em mais linhas, mas quando você executa dmesgDevs=$(dmesg | grep idVendor) , todas as linhas serão mescladas em uma única sequência.

Agora, para imprimir dmesgDevs linha por linha, você pode definir a variável separador de campo interno (IFS), e, em seguida, deixe-o analisar em uma matriz. Algo parecido com isto, ele irá analisar cada vez que uma linha de entrada for separada por [ :

while IFS='[' read ADDR; do for i in "${ADDR[@]}"; do echo $i; done; done <<< "$dmesgDevs"

Finalmente, para verificar se há uma palavra em determinada linha, apenas envie a saída do comando anterior para grep :

while IFS='[' read ADDR; do for i in "${ADDR[@]}"; do echo $i; done; done <<< "$dmesgDevs" | grep 'word'

Nesse caso, consegui encontrar uma solução porque cada linha começa com o mesmo padrão ( [ ), mas isso não acontece o tempo todo. Então, como alternativa, em vez de manter a saída do comando dmesg | grep idVendor em uma variável, mantenha-a em um arquivo; por exemplo, em /tmp/dmesgDevs . Você pode fazer isso usando:

dmesg | grep idVendor > /tmp/dmesgDevs

Então, tudo é muito simples:

cat /tmp/dmesgDevs
grep 'word' /tmp/dmesgDevs
    
por Radu Rădeanu 19.09.2013 / 22:44