grep возвращает строку между словами - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь использовать grep для фильтрации идентификатора снимка RDS из вывода команды rds description-db-snapshots, приведенного ниже:

"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:" 

, но не смог

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Ваш 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'
0 голосов
/ 07 мая 2018

После awk может также помочь вам в том же.

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