Bash 如何使用sed或grep打印第一条匹配行?

Bash 如何使用sed或grep打印第一条匹配行?,bash,shell,unix,sed,grep,Bash,Shell,Unix,Sed,Grep,我有一个配置文件,其中每一行的格式都是UniqueOption=SomeValue: $ cat somefile option1sub1 = yes option1sub2 = 1234 ... option1subn = xxxx option2 = 2345 option3 = no ... 我想在一个循环中处理“option1”的每个值。但是,sed或grep一次性给我所有选项1 我如何使用sed或grep,一次只获得一行option1?将grep的输出通过管道传输到,而循环: g

我有一个配置文件,其中每一行的格式都是
UniqueOption=SomeValue

$ cat somefile  
option1sub1 = yes
option1sub2 = 1234
...
option1subn = xxxx
option2 = 2345
option3 = no
...
我想在一个循环中处理“option1”的每个值。但是,
sed
grep
一次性给我所有选项1


我如何使用
sed
grep
,一次只获得一行option1?

grep
的输出通过管道传输到
,而
循环:

grep 'option1' somefile | while read line
  do
  echo "single option is in var $line"
  done
解决方案1:以下
awk
可能会帮助您获取
option1
字符串的最后一个值

awk -F" = " '/^option1/{print $NF}'  Input_file
解决方案2:如果您只需要字符串的第一个值
选项1
,则上面将打印字符串的所有值
选项1
,然后使用以下命令

awk -F" = " '/^option1/{print $NF;exit}'  Input_file

下面将解析文件
file.conf
option1
的所有子选项,并将它们保存在
bash
数组中。然后可以从该阵列轻松访问这些选项

#!/bin/bash

while IFS= read -r data; do
    opt1+=( "$data" )
done < <( awk -F ' *= *' '$1 ~ /^option1/ { print $2 }' file.conf )

printf 'Option 1, sub-option 1 is "%s"\n' "${opt1[0]}"
awk
脚本将返回
=
之后的所有内容(以及任何空格),这允许您存储包含多个单词的数据。仅处理配置文件中以
选项1
开头的行


这将适用于将整个配置文件解析为单个结构,可能在最新版本的
bash

中使用关联数组。我们已经看到了一些非常棒的答案,但是当您使用grep询问一些问题时,如果您愿意,可以使用以下方法之一。
所有价值观

grep option1 m | cut -d "=" -f2 | awk '{$1=$1};1'
第一值

grep option1 m | cut -d "=" -f2 | awk '{$1=$1};1' | head -1  
此处:cut用于使用uising dilimiter=剪切第二个选项;awk用于修剪输出中的空格,head用于使用sed打印第一次出现的内容

sed '/^option1.* = /!d;s///' somefile
使用gnu grep 2.20(支持pcre)

如果你只想得到第一场比赛

sed '/^option1.* = /!d;s///;q' somefile

grep -m1 -oP '^option1.* = \K.*' somefile

发布您在
sed
grep
中所做的努力,并向我们展示输入的确切输出需求。一次获取所有相关值有什么错?那几乎肯定是你想要的。您肯定不想多次扫描该文件。
sed-n'/option1/,1p'settings.conf
@Kusalananda实际上,例如,我想为“option1sub1”的“yes”做点什么。如果我得到了所有相关的值,我可以将它们分别传递给不同的变量或程序。@umbreLLaJYL,很酷,很高兴它对您有所帮助,请再次查看此链接当您回答时应该做什么,干杯并继续学习。请解释投票结果。我回答问题的题目。提供的解决方案有效,那么问题出在哪里?
grep -oP '^option1.* = \K.*' somefile
sed '/^option1.* = /!d;s///;q' somefile

grep -m1 -oP '^option1.* = \K.*' somefile