LINUX.ORG.RU

Как выбрать строчку из вывода curl с помощью sed


0

2

Я делаю запрос к серверу с помощью curl 192.168.2.1 В ответ я получаю много данных одной строкой. Примерно так:

{"username":"gbte22","profile","id":"rumba","name":"udc96"},{"username":"affe_92","profile","id":"44191191","name":"affe_92"}]},"images":{"tempo1_res":{"url":"192.168.2.1/aa1.jpg","width":306,"height":306},"thumbnail":{"url":"192.168.2.1/q5.jpg","width":150,"height":150},"standard_res":{"url":"192.168.2.1/6.jpg","width":600,"height":600}},"ID"

Мне нужно из этого потока выбрать jpg адрес следующий после каждого «standard_res» ну т.е. в данном случае «192.168.2.1/6.jpg»

Если бы данные не шли одной строкой я бы сделал что-то вроде: curl 192.168.2.1 |grep -E 'standard_res' |sed -n '/":«/,/jpg»/p'

Как еще можно выбрать нужные урлы?



Последнее исправление: s0le (всего исправлений: 1)

Как еще можно выбрать нужные урлы?

Нужно взять нормальное средство для решения проблемы. Например, питон/etc.. с JSON парсером.

mashina ★★★★★
()

А насколько вам важно, чтобы это был sed, а не язычок с модулем под json?

Лучше поправьте пример, чтобы он был в [code]..[/code], а не цитатой. Сделал бы кусок на tcllib/json прямо сейчас, но возиться с вашими кавычками лень.

LeninGad
()
Ответ на: комментарий от LeninGad

впринципе не важно чтобы это был sed, главное чтобы это работало из консоли. К сожалению я уже давно не работал с этим и sed первое что пришло в голову.

s0le
() автор топика
$ echo '{"username":"gbte22","profile","id":"rumba","name":"udc96"},{"username":"affe_92","profile","id":"44191191","name":"affe_92"}]},"images":{"tempo1_res":{"url":"192.168.2.1/aa1.jpg","width":306,"height":306},"thumbnail":{"url":"192.168.2.1/q5.jpg","width":150,"height":150},"standard_res":{"url":"192.168.2.1/6.jpg","width":600,"height":600}},"ID"
'|sed -rn 's/.*("url":"192.168.[0-9].[0-9]\/[^"]+").*/\1/gp'
"url":"192.168.2.1/6.jpg"

emulek
()
Ответ на: комментарий от s0le
$ echo '{"username":"gbte22","profile","id":"rumba","name":"udc96"},{"username":"affe_92","profile","id":"44191191","name":"affe_92"}]},"images":{"tempo1_res":{"url":"192.168.2.1/aa1.jpg","width":306,"height":306},"thumbnail":{"url":"192.168.2.1/q5.jpg","width":150,"height":150},"standard_res":{"url":"192.168.2.1/6.jpg","width":600,"height":600}},"ID"
'|\
sed -rn 's/.*"url":"(192.168.[0-9].[0-9]\/[^"]+)".*/\1/gp'
192.168.2.1/6.jpg

так что-ли?

emulek
()
#!/bin/bash

i=''
i=$i'{"username":"gbte22","profile","id":"rumba","name":"udc96"},{"username":"af'
i=$i'fe_92","profile","id":"44191191","name":"affe_92"}]},"images":{"tempo1_res"'
i=$i':{"url":"192.168.2.1/aa1.jpg","width":306,"height":306},"thumbnail":{"url":'
i=$i'"192.168.2.1/q5.jpg","width":150,"height":150},"standard_res":{"url":"192.1'
i=$i'68.2.1/6.jpg","width":600,"height":600}},"ID",{"username":"gbte22","profile'
i=$i'","id":"rumba","name":"udc96"},{"username":"affe_92","profile","id":"441911'
i=$i'91","name":"affe_92"}]},"images":{"tempo1_res":{"url":"192.168.2.1/aa1.jpg"'
i=$i',"width":306,"height":306},"thumbnail":{"url":"192.168.2.1/q5.jpg","width":'
i=$i'150,"height":150},"standard_res":{"url":"192.168.2.1/7.jpg","width":600,"he'
i=$i'ight":600}},"ID"'

echo "$i" |
sed 's/}/}\n/g' |
sed -n '/standard_res/p' |
sed 's/.*"url":"//' |
sed 's/".*//'
anonymous
()
Ответ на: комментарий от mashina

Нужно взять нормальное средство для решения проблемы. Например, питон/etc.. с JSON парсером.

почему-бы тебе не взять STL с C++, и уйти отсюда на... Сам знаешь куда?

emulek
()
Ответ на: комментарий от s0le

Теперь видно, что это не настоящий json (и даже не фрагмент json). Ваше «примерно так» не означает ли, что вывод уже прогнали через sed или иным способом убрали «лишнее»? Тогда с настоящим выводом скорее всего будет проще (если там личные данные, «замажьте» xxxxx, но не меняйте структуру).

LeninGad
()
$ echo '{"username":"gbte22","profile","id":"rumba","name":"udc96"},{"username":"affe_92","profile","id":"44191191","name":"affe_92"}]},"images":{"tempo1_res":{"url":"192.168.2.1/aa1.jpg","width":306,"height":306},"thumbnail":{"url":"192.168.2.1/q5.jpg","width":150,"height":150},"standard_res":{"url":"192.168.2.1/6.jpg","width":600,"height":600}},"ID"
'|\
sed 's/,/&\n/g' |sed -rn 's/.*"url":"(192.168.[0-9].[0-9]\/[^"]+)".*/\1/gp'
192.168.2.1/aa1.jpg
192.168.2.1/q5.jpg
192.168.2.1/6.jpg

emulek
()
Ответ на: комментарий от emulek

Вот это вот сейчас вы зря сказали. Никто вам не мешал предлагать регекспы, хотя оторопь от ваших конкретных предложений уже затмевает соображения насчёт самой идеи. Но вот разгонять нормальных людей это уже слишком.

У анонимуса с цепочкой седов чуть ли не максимально приличное, что можно сделать в этом направлении.

LeninGad
()
Ответ на: комментарий от emulek

почему-бы тебе не взять STL с C++, и уйти отсюда на... Сам знаешь куда?

У тебя снова началось обострение шизофрении? Не забывай, пожалуйста, принимать лекарства.

mashina ★★★★★
()
Ответ на: комментарий от mashina

У тебя снова началось обострение шизофрении?

у тебя. Ибо ты балоболишь, даёшь советы, но на конкретный вопрос конкретно не ответил. Предложил питон/етц? Ок, давай код в студию. Нет кода? Иди на... Мимо проходи.

emulek
()
Ответ на: комментарий от emulek

Последний выбирает все урлы подряд, хотя ТСу нужно только standard_res. Оба варианта почему то 192.168. считают константой, при этом как бы намекая на «переносимость» с подсети 192.168.2 в остальные ([0-9], да?), при этом на самом деле её не обеспечивая (надо [0-9]+ и точки экранировать не забыть).

И вот у вас уже два седа в цепочке, будете дальше доводить до ума — будет спагетти хуже, чем у анонимуса (у которого прозрачная логика и работает как сказали, но всё равно сломается, если json formatter на выходе поменяет поведение... впрочем, это уже к обсуждению json vs. parser, не буду).

LeninGad
()
Ответ на: комментарий от ziemin

Не надо городить костыли.

ещё один шизофреник. Как в этой данной конкретной задаче действовать?

emulek
()
Ответ на: комментарий от LeninGad

но всё равно сломается, если json formatter на выходе поменяет поведение

tr -d '[:space:]'

//другой анон

anonymous
()
Ответ на: комментарий от LeninGad

Последний выбирает все урлы подряд, хотя ТСу нужно

ТС мне денег не заплатил. Ему нужно, пусть он и делает.

И вот у вас уже два седа в цепочке, будете дальше доводить до ума — будет спагетти хуже, чем у анонимуса

ты мою книжку про sed читал? Вижу, что не читал. Вот почитай, а потом учи меня не писать спагетти. Мне двух sed достаточно что-бы OS СБИШ напейсать, если шышек хватит. А с третьей я на ноль весь этот мир поделю.

emulek
()
Ответ на: комментарий от ziemin

Разумеется, jq правильный ответ, если там настоящий json и если jq есть (или можно собрать/поставить). Если нельзя поставить jq (трудное-детство-home-noexec), тогда Perl/Python/Tcl/whatever.

Но это не мешает мне сравнивать регексокостыли между собой.

LeninGad
()
Ответ на: комментарий от anonymous

Вброшу и свой вариант.

этот аноним явно читер и знает матчасть

emulek
()
Ответ на: комментарий от emulek

ТС мне денег не заплатил. Ему нужно, пусть он и делает.

Чувак, ты заявляешь решение или proof of concept? В жизни есть место тому и другому, даже и за деньги можно накидать пример и сказать «вот как-то в таком духе, сами поправите». Но это хреново совмещается с вопросом «что не нравится в решении». Ты спросил, я ответил и даже денег не взял. Если контраргументы есть, я послушаю (но денег опять не дам).

ты мою книжку про sed читал?

Вот это поворот. Не, мне теперь реально интересно, поделился бы подробной ссылкой, а то из профиля неочевидно. (Не буду подкалывать на тему, учишь ли ты там искать 192.168).

Вижу, что не читал

Скорее всего не читал (но я тут вроде sed'ом и не тряс, так что непонятна уверенность. Впрочем, если книжка учит любить sed и пользоваться им всегда, тогда да).

LeninGad
()
Ответ на: комментарий от emulek

Я тебе код обещал? ТСу сделаю (на jq, на котором нефиг делать, или на Tcl), когда прояснится ситуация с кривым json. А включаться в битву регексов готов только в качестве зрителя и комментатора.

LeninGad
()
Ответ на: комментарий от LeninGad

Чувак, ты заявляешь решение или proof of concept?

PoC конечно. Решение денег стоит.

В жизни есть место тому и другому, даже и за деньги можно накидать пример и сказать «вот как-то в таком духе, сами поправите». Но это хреново совмещается с вопросом «что не нравится в решении». Ты спросил, я ответил и даже денег не взял. Если контраргументы есть, я послушаю (но денег опять не дам).

если-бы ты мне заплатил(или хотя-бы был ТСом), то я бы так не сказал. Но ты не заплатил и даже не ТС. Потому — что не устраивает в моём решении? Костыльность? Давай своё, без костылей.

Вот это поворот. Не, мне теперь реально интересно, поделился бы подробной ссылкой, а то из профиля неочевидно. (Не буду подкалывать на тему, учишь ли ты там искать 192.168).

да подколи, мне что жалко? На, лови: http://emulek.ignorelist.com/sed/ Есть другие адреса, если этот не работает.

emulek
()
Ответ на: комментарий от LeninGad

Я тебе код обещал? ТСу сделаю (на jq, на котором нефиг делать, или на Tcl), когда прояснится ситуация с кривым json. А включаться в битву регексов готов только в качестве зрителя и комментатора.

прежде чем критиковать своё решение, можно выложить своё. А если своего нет — увы, ты балоболка. Типа Царя, который мне тут доказывал, насколько «его» qsort из stl лучше, чем «моя» qsort из glibc.

emulek
()

Да, я не знал, что нельзя менять структуру и вообще не знал что такое json:)

Разбираюсь с jq. Если разложить его, то код выглядит так:

{
  "data": [
    {
      "user": {
        "id": "0923144",
        "bio": "",
        "full_name": "Lagerfield AW",
        "profile_picture": "http://192.168.2.1/23a.jpg",
        "website": "",
        "username": "lag"
      },
      "id": "833129047541987_0922",
      "type": "image",
      "caption": {
        "id": "897410940981",
        "from": {
          "full_name": "Lagerfield AW",
          "id": "0923144",
          "profile_picture": "http://192.168.2.1/23a.jpg",
          "username": "lag"
        },
        "text": "",
        "created_time": "20140201"
      },
      "users_in_photo": [],
      "images": {
        "standard_resolution": {
          "height": 600,
          "width": 600,
          "url": "http://192.168.2.1/23b.jpg"
        },
        "thumbnail": {
          "height": 100,
          "width": 100,
          "url": "http://192.168.2.1/23thum.jpg"
        },

В идеале из этого нужно выбрать username и url который идет в секции standard_resolution

s0le
() автор топика
Ответ на: комментарий от emulek

Моё решение jq .images.standard_res.url, если я правильно угадал, какой там настоящий json. Т.е. это тоже пока не решение (хотя имеет шанс им оказаться), но покритиковать уже позволяет.

А ветки с Царём я читал, начиная с той, где ему объясняли про производную, и как раз до вашей беседы про qsort. Трудно не заметить, что чувак движется в правильную сторону огромными шагами (не знаю, как там сейчас у него с производной и вообще с пониманием новой матчасти, интересно бы проверить). У вас же как бы обратное движение (про qsort и stl вы вообще не поняли, что чувак утверждает — там не всё так прямолинейно и Царь необязательно 100% прав, но чтобы спорить, надо сначала понять).

Про sed книжечка нестрашная, даже неожиданно. Кинул немного ЯДу, а то вдруг покритиковать захочется :)

LeninGad
()
Ответ на: комментарий от s0le

Вот так попробуйте:

jq '.data | map(.user.username,.images.standard_resolution.url)'

А если вам потом обрабатывать чем-то юниксообразным, тогда так:

jq -r '.data | map(.user.username,"\n",.images.standard_resolution.url,"\n") | add'

LeninGad
()
Последнее исправление: LeninGad (всего исправлений: 1)
Ответ на: комментарий от LeninGad

да, спасибо, работает! Ушел разбираться с jq дальше.

s0le
() автор топика
Ответ на: комментарий от LeninGad

Моё решение jq .images.standard_res.url, если я правильно угадал, какой там настоящий json. Т.е. это тоже пока не решение (хотя имеет шанс им оказаться), но покритиковать уже позволяет.

$ jq
bash: jq: команда не найдена

это надо jq ставить. Решение не очень хорошее.

А ветки с Царём я читал, начиная с той, где ему объясняли про производную, и как раз до вашей беседы про qsort. Трудно не заметить, что чувак движется в правильную сторону огромными шагами (не знаю, как там сейчас у него с производной и вообще с пониманием новой матчасти, интересно бы проверить). У вас же как бы обратное движение (про qsort и stl вы вообще не поняли, что чувак утверждает — там не всё так прямолинейно и Царь необязательно 100% прав, но чтобы спорить, надо сначала понять).

царь ИМХО по другому не поймёт. Только так можно, никак иначе. Может кто-то что-то полезное извлечёт из нашей переписки. Я надеюсь. Что касается конкретно qsort и header'ов, то это там выше от меня почти незаметно пролетело, что я вообще-то и начал с того, что с этим согласен. А потом ВНЕЗАПНО стал кричать «дайте мне пруфов!». Тот любопытный факт, что я уорото требую пруфов фактически к своему же тезису остался незамеченным...

Про sed книжечка нестрашная, даже неожиданно. Кинул немного ЯДу, а то вдруг покритиковать захочется :)

спасибо. Несколько неожиданно. Over9000 человек благодарили, а вот денег никто не кинул. Ты первый (:

emulek
()
Ответ на: комментарий от ziemin

man jq

Какой-то он тяжелый: кажется, что на питоне будет проще набросать. Для простых случаев jshon не в моде?

anonymous
()
Ответ на: комментарий от anonymous

Какой-то он тяжелый: кажется, что на питоне будет проще набросать.

$ ls -lh `which jq`
-rwxr-xr-x 1 root root 218K окт 16 23:58 /usr/bin/jq

На сайте пишут, что ни от чего не зависит.

Для простых случаев jshon не в моде?

Я про jq узнал из статейки какого-то учёного из области data mining. Он примеры с jq приводил. Думаю они много чего перепробовали.

ziemin ★★
()
Ответ на: комментарий от ziemin

из статейки какого-то учёного <...> Думаю они много чего перепробовали.

«Учёные» обычно очень хреновые инженеры. Перепробовать то они могу многое, но часто останавливаются на каком-то дерьме. Если дальше с выдернутыми данными нужно что-то делать нетривиальное, то использование отдельной утилиты через stdin/stdout не очень хорошый вариант когда есть библиотека, отдающая данные в нативном виде.

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.