【发布时间】:2015-08-26 21:09:19
【问题描述】:
给定一个包含
的纯文本文件FOO=foo
BAR=bar
BAZ=baz
我们如何grep 使用该键的值?
【问题讨论】:
-
一个肮脏的选择:如果文件看起来像你粘贴的那样,源文件并直接使用 $BAR, $BAZ。 PS:不要按这个建议,你会立即遇到很多极端情况。
给定一个包含
的纯文本文件FOO=foo
BAR=bar
BAZ=baz
我们如何grep 使用该键的值?
【问题讨论】:
grep "^FOO=" | cut -d"=" -f2-
我更喜欢这个,因为它对我来说很容易记住。
解释:它只是简单地greps以FOO开头的行(因此^)并用=将它切割成碎片,然后用-f2-得到第二块。
【讨论】:
=,则不会返回正确的值。例如:echo 'FOO=bar=oops' | grep "^FOO=" | cut -d"=" -f2 错误地返回 bar。使用f-2- 返回正确的值bar=oops
f-2-,正如上面评论中所建议的,似乎是错误的。使用 -f2- 对我有用。
使用向后看:
$ grep -Po '(?<=^FOO=)\w*$' file
foo
我也喜欢awk:
$ awk -v FS="FOO=" 'NF>1{print $2}' file
foo
甚至更好:
$ awk -F= -v key="FOO" '$1==key {print $2}' file
foo
与sed:
$ sed -n 's/^FOO=//p' file
foo
或者甚至使用 Bash - 只有当你确信文件不包含任何奇怪的值时 - 才能获取文件并 echo 所需的值:
$ (source file; echo "$FOO")
foo
【讨论】:
sed 做得很好。
也试试这个...
grep "^FOO=" file.txt | awk -F"=" '{ print $2 }'
在@fedorqui 的帮助下
【讨论】:
grep + awk 通常意味着只有awk 可以处理它。另外,如果我们有一行hello=FOO 怎么办?这将返回FOO,而hello 不是给定的键。
^FOO=。这样,它将匹配行的开头。
echo 'FOO==FO=bar=oo==ps=pk' | grep "^FOO=" | awk -F"=" '{ print $2 }',它什么也不返回。它应该返回=FO=bar=oo==ps=pk。我认为使用 grep 时的最佳答案来自@Inanc Gumus,而@Thiago 的评论几乎没有修改
另一个命题:分工
grep "FOO=" file.txt | sed -e 's/.*=//'
grep 将获取正确的行
sed 将删除直到(最后一个)等号的所有内容
【讨论】:
echo 'FOO==FO=bar=oo==ps=pk' | grep "FOO=" | sed -e 's/.*=//'这应该返回=FO=bar=oo==ps=pk,但它只返回pk