Необходимо извлечь выход 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.