На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
sedikpoll
Сообщения: 100
Сообщение
sedikpoll » 30.11.2013 23:20
Пишу сценарий который будет обращаться к сайту и просто выбирать текст.
Код: Выделить всё
#!/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
Сообщение
Bizdelnick » 30.11.2013 23:36
Не совсем понял, в каком месте нужно вставить переменную.
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
Сообщение
sedikpoll » 30.11.2013 23:48
Заменил "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
Сообщение
sedikpoll » 01.12.2013 00:47
Оказалось что не совсем решина.
Код: Выделить всё
...
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
Сообщение
Bizdelnick » 01.12.2013 01:01
Как-то Вы всё сильно усложняете.
Код: Выделить всё
#!/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
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:
Сообщение
drBatty » 01.12.2013 12:15
Bizdelnick писал(а): ↑ 01.12.2013 01:01
#!/bin/bash
for i in `seq 27493 27495`
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
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' ; }
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
Сообщение
Bizdelnick » 01.12.2013 13:06
SLEDopit писал(а): ↑ 01.12.2013 12:57
Ещё, кстати, можно и в одну строчку
ИМХО только чтобы себя же больше запутать.
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 01.12.2013 15:55
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
Сообщение
lgar » 11.12.2013 13:34
Что делают скобки '{' '}', то есть куда пойдут данные из конвеера? Если без них то в 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
Сообщение
SLEDopit » 11.12.2013 13:48
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
Контактная информация:
Сообщение
drBatty » 11.12.2013 15:41
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
хватит уже народ путать.
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 11.12.2013 15:55
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
Контактная информация:
Сообщение
drBatty » 11.12.2013 16:59
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' ; }
вот вы со своими скобками только путаете людей, ибо они здесь совсем не нужны. Вы ещё программу из одной строки на перле разберите...