Como usar o texto extraído do comando “grep” como um argumento em um script bash?

1

Eu tenho um arquivo chamado "krylov_methods", que tem texto assim:

cg     - preconditioned
cgne   - normal equations
nash   - cg subject to constraint
stcg   - another method for constraints
gmres  - general minimum residual
...

Eu preciso extrair a primeira palavra (cadeia de caracteres) de cada linha, uma por uma, em um script de shell e usá-lo como um argumento de linha de comando dentro desse script. Para extrair a primeira palavra, usei o seguinte comando:

head -1 krylov_methods | tail -1 | awk '{print }'
head -2 krylov_methods | tail -1 | awk '{print }'
head -3 krylov_methods | tail -1 | awk '{print }'
...

Isto parece funcionar bem para extrair a primeira palavra de cada linha, uma por uma No entanto, eu preciso ser capaz de armazenar a seqüência de caracteres como uma variável para uso futuro dentro do script. Por exemplo, como a primeira palavra da primeira linha do arquivo "krylov_methods" é a palavra "cg", eu quero armazenar "cg" em uma variável chamada "method". Dentro do script, eu gostaria que ele conseguisse algo como:

method=cg  
./execute $method  

É possível armazenar o resultado do comando 'head' usado em um shell script?

    
por Paul 28.01.2012 / 05:13

3 respostas

2

Algo parecido com isto

#!/bin/bash

while read line; do
    set -- $line
    method=
    /path/to/execute $method
done

Você pode ler a primeira palavra em uma matriz também.

link

Alternativa

read pode isolar cada componente da linha:

#!/bin/bash

while read METHOD MINUS COMMENT
do
    echo "METHOD = $METHOD"
    echo "COMMENT = $COMMENT"
    /path/to/execute $METHOD
done

depende do que você está fazendo com as informações e de como você deseja chamá-las mais tarde.

    
por Panther 28.01.2012 / 05:54
0

Na verdade, depois de algumas experiências, descobri:

method=$(head -$i krylov_methods | tail -1 | awk '{print }')
execute $method
    
por Paul 29.01.2012 / 14:59
0

Não é necessário usar head e tail . AWK pode imprimir a linha que você diz facilmente

$> awk -v LINE=5  'NR==LINE' /etc/passwd                                                                              
sync:x:4:65534:sync:/bin:/bin/sync

Você pode transformar isso em uma função no seu script bash (lembre-se de citar o caminho completo ou parcial para o arquivo se ele tiver espaços ou caracteres especiais):

print_line_number() {
    awk -v LINE="" "NR==LINE" "" 
}

E aqui está em ação

$> print_line_number 5 /etc/passwd                                                                                    
sync:x:4:65534:sync:/bin:/bin/sync
    
por Sergiy Kolodyazhnyy 06.04.2016 / 16:34