【问题标题】:grep return the string in between wordsgrep 返回单词之间的字符串
【发布时间】:2018-05-07 13:28:46
【问题描述】:

我正在尝试使用 grep 从下面的 rds describe-db-snapshots 命令输出中过滤掉 RDS 快照标识符:

"arn:aws:rds:ap-southeast-1:123456789:snapshot:rds:apple-pie-2018-05-06-17-12",
"rds:apple-pie-2018-05-06-17-12",

如何返回准确的输出

rds:apple-pie-2018-05-06-17-12

尝试使用

grep -Eo ",rds:" 

但不能

【问题讨论】:

    标签: bash amazon-web-services grep amazon-rds


    【解决方案1】:

    关注awk 也可能对您有所帮助。

    awk 'match($0,/^"rds[^"]*/){print substr($0,RSTART+1,RLENGTH-1)}'   Input_file
    

    【讨论】:

    • 这仍将捕获输出中的两行:
    • @user2155404,好的,现在检查一下,如果一切顺利,请告诉我?
    • 嗨@RavinderSingh13,这次它什么都不返回
    • @user2155404,对于您显示的 Input_file,它对我来说工作得非常好,您能否检查一下您是否有回车字符?做一次cat -v Input_file 然后让我知道?
    【解决方案2】:

    您的 grep -Eo ",rds:" 因各种原因失败:

    • 您没有在要匹配的字符串中添加"
      在逗号和 rds 之间需要匹配字符。
    • 您正在尝试匹配上一行的逗号
      您的示例输入是 2 行(中间有换行符),也许真正的输入没有换行符。
    • 您希望匹配到下一个双引号。

    您可以使用

    支持两种输入样式(带/不带换行符)
    grep -Eo '(,|^)"rds:[^"]*' rdsfile |cut -d'"' -f2
    

    您可以在一个命令中使用

    sed -rn 's/.*(,|^)"(rds:[^"]*).*/\2/p' rdsfile
    

    编辑:使用类似命令操作标准输出而不是文件:

    yourcommand | grep -Eo '(,|^)"rds:[^"]*' |cut -d'"' -f2
    # or
    yourcommand | sed -rn 's/.*(,|^)"(rds:[^"]*).*/\2/p'
    

    您还可以使用yourcommand > rdsfile 测试原始命令。
    您可能会注意到 rdsfile 缺少您在屏幕上看到的数据,在这种情况下添加 2>&1

    yourcommand 2>&1 | grep -Eo '(,|^)"rds:[^"]*' |cut -d'"' -f2
    # or
    yourcommand 2>&1 | sed -rn 's/.*(,|^)"(rds:[^"]*).*/\2/p'
    

    【讨论】:

    • 从控制台输出而不是从文件中读取呢?
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2017-11-05
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2020-03-04
    相关资源
    最近更新 更多