Скушать вывод после echo

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
sedikpoll
Сообщения: 100

Скушать вывод после echo

Сообщение sedikpoll »

Пишу сценарий который будет обращаться к сайту и просто выбирать текст.

Код: Выделить всё

#!/bin/bash
for i in `seq 27493 27495`
    do
        curl -s http://site/$i/| grep -i "<title>.*</title>" | sed 's/<title>//;s/<\/title>//'
    done


Но столкнулся с трудностью. В своем выводе я хочу так же указать переменную i. Пример:

27493; 123
27494; 123
27495; 123

Делаю это так:

Код: Выделить всё

curl -s http://site/$i/; echo "$i"; grep -i "<title>.*</title>" | sed 's/<title>//;s/<\/title>//'

Ну и конечно же это не работает т.к. grep не видет нужного вывода от curl.

Подскажите, пожалуйста, решение. Понимаю что оно где то совсем не поверхности но не могу сообразить.

PS: что бы не создавать лишний топик хочу сразу спросить как можно сократить "grep -i "<title>.*</title>" | sed 's/<title>//;s/<\/title>//'" до одного sed-варианта. Так же понимаю что там должна учавствовать $1.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Скушать вывод после echo

Сообщение Bizdelnick »

Не совсем понял, в каком месте нужно вставить переменную.

sedikpoll писал(а):
30.11.2013 23:20
хочу сразу спросить как можно сократить "grep -i "<title>.*</title>" | sed 's/<title>//;s/<\/title>//'" до одного sed-варианта

sed -n 's/<\/\?title>//gp'
Upd. Хотя нет, Вам, наверное, надо sed -n 's|.*<title>\(.*\)</title>.*|\1|p'
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
sedikpoll
Сообщения: 100

Re: Скушать вывод после echo

Сообщение sedikpoll »

Заменил "grep -i "<title>.*</title>" | sed 's/<title>//;s/<\/title>//'" на sed -n 's/<title>//;s/<\/title>//p', все работает. Спасибо.


Сейчас у меня такой вывод:

123
123
123

Получаю я его при помощи:

Код: Выделить всё

...
curl -s http://site/$i/| grep -i "<title>.*</title>" | sed 's/<title>//;s/<\/title>//'
...


Хочу сделать такой:

27493; 123
27494; 123
27495; 123

но если вставлю echo "$i" перед grep то логика нарушится.
Спасибо сказали:
sedikpoll
Сообщения: 100

Re: Скушать вывод после echo

Сообщение sedikpoll »

Проблема решина, был просто невнимательный. echo "$i" надо ставить перед curl.
Спасибо сказали:
sedikpoll
Сообщения: 100

Re: Скушать вывод после echo

Сообщение sedikpoll »

Оказалось что не совсем решина.

Код: Выделить всё

...
echo `echo "${i};";curl -s http://site/$i/|sed -n 's|.*<title>\(.*\)</title>.*|\1|p'`
...


Получаю на выходе:
27493; 123 abc
27494; 123 abc

Все правильно, но оказалось что нужно:
27493;123 abc
27494;123 abc
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Скушать вывод после echo

Сообщение Bizdelnick »

Как-то Вы всё сильно усложняете.

Код: Выделить всё

#!/bin/bash
for i in `seq 27493 27495`
    do
        echo -n "$i;"
        curl -s "http://site/$i/" | sed -n 's|.*<title>\(.*\)</title>.*|\1|p'
    done
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
sedikpoll
Сообщения: 100

Re: Скушать вывод после echo

Сообщение sedikpoll »

Действительно, все оказалось намного легче.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Скушать вывод после echo

Сообщение drBatty »

Bizdelnick писал(а):
01.12.2013 01:01
#!/bin/bash
for i in `seq 27493 27495`

Код: Выделить всё

for (( i = 27493; i <= 27495; i++ ))
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Скушать вывод после echo

Сообщение SLEDopit »

Ещё, кстати, можно и в одну строчку:
Bizdelnick писал(а):
01.12.2013 01:01
curl -s "http://site/$i/" | { echo -n "$i;" ; sed -n 's|.*<title>\(.*\)</title>.*|\1|p' ; }

UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Скушать вывод после echo

Сообщение Bizdelnick »

SLEDopit писал(а):
01.12.2013 12:57
Ещё, кстати, можно и в одну строчку

ИМХО только чтобы себя же больше запутать.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Скушать вывод после echo

Сообщение Rootlexx »

drBatty писал(а):
01.12.2013 12:15
Bizdelnick писал(а):
01.12.2013 01:01
#!/bin/bash
for i in `seq 27493 27495`

Код: Выделить всё

for (( i = 27493; i <= 27495; i++ ))


Код: Выделить всё

for i in {27493..27495}
:)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Скушать вывод после echo

Сообщение SLEDopit »

Rootlexx писал(а):
01.12.2013 14:47
for i in {27493..27495}
Только если диапазон большой, то лучше так не делать (:
Если небольшой, как в данном случае, то всё ок.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
lgar
Сообщения: 117
ОС: Ubuntu

Re: Скушать вывод после echo

Сообщение lgar »

Что делают скобки '{' '}', то есть куда пойдут данные из конвеера? Если без них то в echo, с ними сразу к echo и к sed?

Блок команд, заключенный в фигурные скобки не приводит к запуску дочерней подоболочки.

{ command1; command2; command3; ... }


SLEDopit писал(а):
01.12.2013 12:57
Ещё, кстати, можно и в одну строчку:
Bizdelnick писал(а):
01.12.2013 01:01
curl -s "http://site/$i/" | { echo -n "$i;" ; sed -n 's|.*<title>\(.*\)</title>.*|\1|p' ; }


Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Скушать вывод после echo

Сообщение SLEDopit »

lgar писал(а):
11.12.2013 13:34
Что делают скобки '{' '}', то есть куда пойдут данные из конвеера? Если без них то в echo, с ними сразу к echo и к sed?
Кто первый встал, того и тапки: данные пойдут к тому, кто первый будет их читать. echo не читает stdin, поэтому данные пойдет к следующему. sed читает stdin, поэтому он весь stdin и съест.

Пример для иллюстрации:

Код: Выделить всё

echo -e "123\n123\n123" | { echo 1 ; echo 2 ; echo 3 ; sed 's/1/9/' ; sed 's/2/8/' ; }

тут 3 echo отработают и не тронут stdin. первый sed съест всё и заменит единицы на 9, а второму sed'у ничего не достанется.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Скушать вывод после echo

Сообщение drBatty »

Rootlexx писал(а):
01.12.2013 14:47
for i in {27493..27495}

простите, но это не комильфо.
lgar писал(а):
11.12.2013 13:34
Что делают скобки '{' '}'

это подстановка. Что-то вроде такой звёздочки: *. Разница в том, что вместо звёздочки подставляются имена всех файлов в алфавитном порядке

$

$ echo * bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var


а вместо скобок -- числа

$

$ echo {10..20} 10 11 12 13 14 15 16 17 18 19 20 $ echo {10..20..3} 10 13 16 19 $ echo {x..z} x y z



SLEDopit
хватит уже народ путать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Скушать вывод после echo

Сообщение SLEDopit »

drBatty писал(а):
11.12.2013 15:41
хватит уже народ путать.
вы прочитайте сначала вопрос внимательно, потом мой ответ, потом свой. а потом скажите, где конкретно у вас идёт речь про поток данных, про который спрашивал lgar, и вообще при чём он в вашем ответе. а потом сделайте вывод, кто из нас тут кого путает.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Скушать вывод после echo

Сообщение drBatty »

SLEDopit писал(а):
11.12.2013 15:55
вы прочитайте сначала вопрос внимательно, потом мой ответ

я как раз про него и говорю:
SLEDopit писал(а):
01.12.2013 12:57
Ещё, кстати, можно и в одну строчку:
curl -s "http://site/$i/" | { echo -n "$i;" ; sed -n 's|.*<title>\(.*\)</title>.*|\1|p' ; }

вот вы со своими скобками только путаете людей, ибо они здесь совсем не нужны. Вы ещё программу из одной строки на перле разберите...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить