Необходимо извлечь выход awk или grep для извлечения строк

У меня есть вывод, который выглядит так:

"vancouver/news/vancouver-voices": {
    "status": 0,
    "time": 0,
    "timestamp": 1371298701
},
"vancouver/news/vancouvers-march-second-annual-success": {
    "status": 0,
    "time": 0,
    "timestamp": 1371298701
}

Мне нужно извлечь только частичные URL (vancouver/news/vancouvers-march-second-annual-success and vancouver/news/vancouver-voices например)

Я в основном вызываю команду через bash, а затем отправляю команду grep awk или sed

Если я использую grep (| grep -o '".*": {'Я могу подобраться. Я в конечном итоге с выводом, как:

"vancouver/news/vancouver-voices": {
"vancouver/news/vancouvers-march-second-annual-success": {

Я подозреваю, что мне нужно использовать sed или awk. Я пробовал несколько вещей, но я думаю, что мне нужно избежать некоторых специальных персонажей. Например я пытался | awk '\"(.*)\": {' --output='$1'но это раздражает из-за обратной косой черты.

Может ли какой-нибудь гуру sed или awk подсказать мне, как правильно избегать специальных персонажей?

3 ответа

Решение
awk '/{/ {print $2}' FS='"'

Результат

vancouver/news/vancouver-voices
vancouver/news/vancouvers-march-second-annual-success

Однако это было бы лучше сделать с помощью JQ

Решение с sed:

sed -n '/{/s="\([^"]*\)".*=\1=p'

grep + cut:

grep '{' | cut -d'"' -f2

Вы все еще можете использовать grep:

| grep -o '[^"/]\+\(/[^"/]\+\)\+'

выходы:

vancouver/news/vancouver-voices
vancouver/news/vancouvers-march-second-annual-success

Он ищет начальную строку, отличную от ", не / / символов", за которой следует одна или несколько последовательностей, состоящих из косой черты, за которой следует строка того же типа, что и исходная. Можно также использовать класс буквенно-цифровой-плюс-тире для выберите компоненты URL.

Другие вопросы по тегам