【问题标题】:Bash print word after match [duplicate]匹配后的Bash打印单词[重复]
【发布时间】:2015-04-29 20:19:51
【问题描述】:

我有一个存储文件输出的变量。在该输出中,我想打印Database: 之后的第一个单词。我对正则表达式相当陌生,但这是我迄今为止尝试过的:

sed -n -e 's/^.*Database: //p' "$output"

当我尝试这个时,我收到了 sed: can't read prints_output: File name too long 错误。

sed 是否只接受文件名?我正在对desc formatted table 运行配置单元查询并将结果存储在output 中,如下所示:

output=`hive -S -e "desc formatted table"`

output 然后设置为结果:

...
# Detailed Table Information
Database:               sample_db
Owner:                  sample_owner
CreateTime:             Thu Feb 26 23:36:43 PDT 2015
LastAccessTime:         UNKNOWN
Protect Mode:           None
Retention:              0
Location:               maprfs:/some/location
Table Type:             EXTERNAL_TABLE
Table Parameters:
...

【问题讨论】:

  • 如果没有设置 $output 的代码和调用脚本的方式,错误消息就没有意义。您在哪个平台上运行 13 个字符的文件名太长?即使是早期版本的 Unix 也支持文件名中包含 14 个字符。也许您应该显示运行 bash -x your-script prints_output 或任何命令调用的结果(-x 选项显示 Bash 认为它正在做什么,或多或少)。
  • @JonathanLeffler 这可能是我的第一个错误。我正在尝试将变量传递给sed,而不是文件名。我已经更新了 OP 以更好地反映我正在尝试做的事情。

标签: regex bash sed match


【解决方案1】:

从表面上看,您应该使用:

hive -S -e "desc formatted table" |
sed -n -e 's/^.*Database: //p'

这将显示包含Database: 的完整行。当你完成这项工作后,你也可以消除生产线上不需要的材料。

或者,您可以使用:

echo "$output" |
sed -n -e 's/^.*Database: //p'

或者,同样,鉴于您使用的是 Bash,您可以使用:

sed -n -e 's/^.*Database: //p' <<< "$output"

除非您需要保留整个输出以供重新扫描,否则我会使用第一个。然后我可能会将输出捕获到一个文件中(使用tee):

hive -S -e "desc formatted table" |
tee output.log |
sed -n -e 's/^.*Database: //p'

【讨论】:

  • 效果很好。仍在学习 Bash 的来龙去脉。为什么您更喜欢将整个输出保留为文件而不是变量?我将重新扫描输出以查找其他匹配项,因此假设我按照您的建议使用tee 生成output.log,然后我会使用sed -n -e 's/^.*next_match //p' output.log 查找下一个匹配项吗?
  • 如果您将数据保存在如图所示的文件中,那么下一次扫描确实会将output.log 指定为输入文件。我使用文件而不是变量,部分原因是我在一台拥有 1 MiB 内存的机器上学习了脚本,并且仍然记得当内存翻倍到 2 MiB 时带来的喜悦,将可用用户内存从 256 KiB 增加到 1.25 MiB(五倍) )!换句话说,内存并不总是可用于保存大值。如果数据被捕获在文件中,也更容易调试;如果它在文件中,您可以更轻松地查看(但您必须事后清理)。
  • 换句话说,您是一位经验丰富的兽医。感谢您的提示和简要回顾历史。
【解决方案2】:

尝试使用 egrep:

egrep -oh 'Database:[[:blank:]][[:alnum:]]*[[:blank:]]' <output_file> | awk  '{print $2;}'

【讨论】:

  • 虽然这可能会回答这个问题,但在您的答案中加入一些文字来解释您在做什么总是一个好主意。阅读how to write a good answer
  • 感谢@jurgemaister
猜你喜欢
  • 2019-03-04
  • 2012-09-22
  • 2017-04-02
  • 2020-05-18
  • 2014-12-13
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多