grep 返回单词之间的字符串



我正在尝试使用 grep 从下面的 rds 描述-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:" 

但不能

以下awk也可能对您有所帮助。

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

您的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'

最新更新