Как использовать текст, извлеченный из & ldquo; grep & rdquo; команда в качестве аргумента в скрипте bash?

У меня есть файл с именем «krylov_methods», который имеет такой текст:

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

Мне нужно извлечь первое слово (строку символов), одну за другой, в сценарии оболочки и использовать его в качестве аргумента командной строки в этом скрипте. Чтобы извлечь первое слово, я использовал следующую команду:

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

Кажется, это хорошо работает для извлечения первого слова каждой строки одна за другой. Однако мне нужно иметь возможность сохранить строку символов как переменная для будущего использования в скрипте. Например, поскольку первое слово в первой строке файла «krylov_methods» - это слово «cg», я хочу иметь возможность хранить «cg» в переменной с именем «method». Внутри скрипта я хотел бы получить что-то вроде:

method=cg  
./execute $method  

Можно ли сохранить результат команды head, использованной в скрипте оболочки?

1
задан 15 July 2013 в 21:04

3 ответа

Примерно так

#!/bin/bash

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

Вы также можете прочитать первое слово в массив.

http://www.thegeekstuff.com/2010/06/bash-array-tutorial/

Альтернатива

read может изолировать каждый компонент строки:

#!/bin/bash

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

в некоторой степени зависит от того, что вы делаете с информацией и как вы хотите ее вызвать позже.

0
ответ дан 15 July 2013 в 21:04

На самом деле, после некоторых экспериментов, я понял это:

method=$(head -$i krylov_methods | tail -1 | awk '{print $1}')
execute $method
0
ответ дан 15 July 2013 в 21:04

Нет никакой потребности использовать обоих head и tail. AWK может распечатать строку, которой Вы говорите это довольно легко

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

Можно превратить это в функцию в Вашем bash сценарий (не забывают заключать весь или частичный путь в кавычки к файлу, если он имеет пробелы или специальные символы):

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

И здесь это в действии

$> print_line_number 5 /etc/passwd                                                                                    
sync:x:4:65534:sync:/bin:/bin/sync
0
ответ дан 15 July 2013 в 21:04

Другие вопросы по тегам:

Похожие вопросы: