【问题标题】:How to grep for value in a key-value store from plain text如何从纯文本中获取键值存储中的值
【发布时间】:2015-08-26 21:09:19
【问题描述】:

给定一个包含

的纯文本文件
FOO=foo
BAR=bar
BAZ=baz

我们如何grep 使用该键的值?

【问题讨论】:

  • 一个肮脏的选择:如果文件看起来像你粘贴的那样,源文件并直接使用 $BAR, $BAZ。 PS:不要按这个建议,你会立即遇到很多极端情况。

标签: linux shell unix grep


【解决方案1】:

简单的方法:

grep "^FOO=" | cut -d"=" -f2-

我更喜欢这个,因为它对我来说很容易记住。

解释:它只是简单地greps以FOO开头的行(因此^)并用=将它切割成碎片,然后用-f2-得到第二块。

【讨论】:

  • 请注意,如果值中包含 =,则不会返回正确的值。例如:echo 'FOO=bar=oops' | grep "^FOO=" | cut -d"=" -f2 错误地返回 bar。使用f-2- 返回正确的值bar=oops
  • 如果您像@ThiagoFigueiro 所说的那样进行少量修改,这是一个完美的答案。 (已经 4 年了)。
  • 我在 4 年前尝试更新答案,但不允许更改 1 个字符,所以??‍♂️
  • 使用f-2-,正如上面评论中所建议的,似乎是错误的。使用 -f2- 对我有用。
【解决方案2】:

使用向后看:

$ 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 做得很好。
  • 如何在整个路径中从 FOO 中 grep 一个值,而不是给出一个特定的文件?
  • @NandhaKumar 你可能想检查一下How do I find all files containing specific text on Linux?
  • 我喜欢 sed 的答案
【解决方案3】:

也试试这个...

grep "^FOO=" file.txt | awk -F"=" '{ print $2 }'

在@fedorqui 的帮助下

【讨论】:

  • grep + awk 通常意味着只有awk 可以处理它。另外,如果我们有一行hello=FOO 怎么办?这将返回FOO,而hello 不是给定的键。
  • 要使其始终有效,请使用^FOO=。这样,它将匹配行的开头。
  • 啊,谢谢,我不知道!我试图帮助有疑问的人,而我最终学到了一些东西!谢谢@fedorqui!
  • 当你有这样的值(如复杂密码中所见)时,这将不起作用:echo 'FOO==FO=bar=oo==ps=pk' | grep "^FOO=" | awk -F"=" '{ print $2 }',它什么也不返回。它应该返回=FO=bar=oo==ps=pk。我认为使用 grep 时的最佳答案来自@Inanc Gumus,而@Thiago 的评论几乎没有修改
【解决方案4】:

另一个命题:分工

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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2015-05-17
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多