如何使用从“grep”命令中提取的文本作为 bash 脚本中的参数?

如何使用从“grep”命令中提取的文本作为 bash 脚本中的参数?

我有一个名为“krylov_methods”的文件,其中包含如下文本:

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

我需要逐个提取 shell 脚本中每行的第一个单词(字符串),并将其用作该脚本中的命令行参数。为了提取第一个单词,我使用了以下命令:

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  

是否可以存储 shell 脚本中使用的‘head’命令的结果?

答案1

像这样

#!/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

事实上,经过一些实验,我发现了:

method=$(head -$i krylov_methods | tail -1 | awk '{print $1}')
execute $method

答案3

没有必要同时使用headtailAWK可以很容易地打印你告诉它的行

$> 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

相关内容