awk 脚本提取选项的参数

awk 脚本提取选项的参数

有人可以解释一下awk '{for(i=1;i<=NF;i++) if($i~/-f/) print $(i+1)}')以下代码片段中该部分的作用吗

line='/wwws/apache/apache2.4.16w-r01/instroot/bin/httpd -f /www/csbe-int-fb-na/generated/httpd.conf -C ServerName int-b2vusii.bmwgroup.net -c PidFile /var/tmp/apache_csbe-int-fb-na/httpd.pid'
CONF=$(echo $line | awk '{for(i=1;i<=NF;i++) if($i~/-f/) print $(i+1)}')

操作数:/www/csbe-int-fb-na/generated/httpd.conf -C

但我只需要得到/www/csbe-int-fb-na/generated/httpd.conf

答案1

我重新格式化了awk代码:

    for(i=1;i<=NF;i++)
        if($i~/-f/)
            print $(i+1)

for 循环从 1 迭代到NF任何输入行中的字段数。

$i检查输入行中的每个字段 ( ) 是否与模式“-f”匹配,该模式只是一个字符串文字。

如果某个字段与“-f”匹配,则代码将打印出包含“-f”的字段后面的字段。

在我的 RHEL 机器上,最终打印出:

/www/csbe-int-fb-na/generated/httpd.conf -C

如果仔细观察输入行,会发现有一个字段完全由“-f”组成,并且确实awk打印出下一个字段“/www/csbe-int-fb-na/ generated/httpd.conf”,令人困惑的是,该字段包含嵌入的“-f”,因此在 for 循环的下一次迭代中,awk脚本发现“/www/csbe-int-fb-na/ generated/httpd.conf”包含“-f”,因此它打印下一个字段“-C”。

如果您想要的只是 Apache 配置文件,则可以修改字段必须匹配的模式以使其完全匹配,并awk在找到“-f”字段并打印下一个字段后让脚本退出。

awk '{for(i=1;i<=NF;i++)if($i~/^-f$/) {print $(i+1); exit} }'

相关内容