Как использовать текст, извлеченный из & 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
задан 29.03.2020, 08:00

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

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

2
ответ дан 29.03.2020, 08:02
  • 1
    +1 Хорошая идея использовать read. И мы можем улучшить Ваш ответ, потому что read может изолировать компоненты строки = > это упрощает сценарий (и сделайте его более портативным;). Я предпочел редактировать Ваш ответ вместо того, чтобы добавить другой;-) – David 29.03.2020, 08:02

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

[110]gt; 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" 
}

И вот он в действии

[112]gt; print_line_number 5 /etc/passwd                                                                                    
sync:x:4:65534:sync:/bin:/bin/sync
0
ответ дан 29.03.2020, 08:00

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

method=$(head -$i krylov_methods | tail -1 | awk '{print $1}')
execute $method
0
ответ дан 29.03.2020, 08:01

Теги

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