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