LINUX.ORG.RU

Bash скрипт

 ,


0

1

Накидал скрипт, который парсит инфу с страницы Что-то типа этого

#!/bin/sh
temp=/home/user/temp
file=/home/user/file
url='http://blabla.bla'
curl -v $temp $url
cat $temp | sed 'blabla' | grep "blabla" > $file
cat $temp | sed 'blabla' | grep "blabla" >> $file
cat $temp | sed 'blabla' | grep "blabla" >> $file
Скрипт свое дело делает, но исполнение не нравится мне. Не знаю как обойтись без промежуточного файла. А также как записать результат в файл не в трех командах, а после последней. Подскажите как подправить.



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

О мой макаронный бох, что я только что увидел.

Начинай читать ABS, man grep, man sed до просветления. А потом начинай искать подходящий для твоих целей инструмент (читай язык).

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

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

achilles_85
() автор топика

Временные файлы это удобно. Не хочешь «насиловать» диск, создавай их в (RAM) tmpfs (/dev/shm, ...)

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

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

achilles_85
() автор топика

Perl или Python.

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

Временные файлы это удобно. Не хочешь «насиловать» диск, создавай их в (RAM) tmpfs (/dev/shm, ...)

Нет, временные файлы - это неудобно, так как:
1) их нужно правильно называть - man mktemp
2) их нужно подчищать в конце выполнения программы, а точек выхода из программы может быть несколько
3) а еще интересней их подчищать когда программа упала где-то посередине, например, по Ctrl+C или просто если внутри что-то свалилось.

Так что если ты там не магабайты ворочаешь, используй переменные или научись комбинировать пайпы.

Да, и судя по curl, тебе явно не grep нужен, а может даже и не bash. Вот тут в первом посте убедительно расписано почему: https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtm... (осторожно: epic thread)

Kroz ★★★★★
()
cat $temp | sed 'blabla' | grep "blabla" > $file
cat $temp | sed 'blabla' | grep "blabla" >> $file
cat $temp | sed 'blabla' | grep "blabla" >> $file

А как такую конструкцию упростить? Чтоб не каждый раз после каждой команды писать в файл, а после выполнения всех один раз?

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

А как такую конструкцию упростить?

res1=$(echo $temp | sed 'blabla' | grep "blabla")
res2=$(echo $temp | sed 'blabla' | grep "blabla")
res3=$(echo $temp | sed 'blabla' | grep "blabla")
echo "$res1$res2$res3" > $file
Deleted
()

И хорошо, что не нравится.

curl 'http://blabla.bla' | awk '
/blabla/ { sub(/regexp/,"replacement"); print; }
/blabla2/ { sub(/regexp/,"replacement"); print; }
/blabla3/ { sub(/regexp/,"replacement"); print; }
' > /home/user/file
legolegs ★★★★★
()
< $temp | tee >(sed 'blabla' | grep "blabla") >(sed 'blabla' | grep "blabla") >(sed 'blabla' | grep "blabla") > $file

Но строки перемешаются.

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

Бывает, что такое нужно, но уж не для выдирания строк с вебстранички.

Если, например, качать образ сидюка, прожигать его на болвань, сохранять на нжмд и считать контрольную сумму md5 и sha256, то можно и tee >() >()... А так - ну нафиг.

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

Использовал твой ответ, то что нужно. По ссылке открывается плейлист iptv, твои оба ответа то что нужно. Перенос строк только добавил.

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

Использовал твой ответ, то что нужно.

А чем awk не угодил? Решение, предложенное legolegs вроде идеально для тебя?

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

Имхо, более общий случай, если планируется использовать разнообразный выхлоп, а не только sed|grep:

{
  cat $temp | sed 'blabla' | grep "blabla"
  cat $temp | sed 'blabla' | grep "blabla"
  cat $temp | sed 'blabla' | grep "blabla"
} > $file

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

более общий случай

Твою мать. Группировка. Забыл, твою мать. Сэнькс за напоминание.

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

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

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

это фигня, по-сравнению с тем что через месяц смотришь на этот скритп как на чужой и с матюками начниаешь раскручивать пятиэтажные конструкции. Промежуточные файлы и простые конструкции, так не любимые местной школотой типа sed ... | grep ... | awk ... вместо одного awk , здорово облегчает жизнь в перспективе

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

1) их нужно правильно называть - man mktemp
2) их нужно подчищать в конце выполнения программы, а точек выхода из программы может быть несколько
3) а еще интересней их подчищать когда программа упала где-то посередине, например, по Ctrl+C или просто если внутри что-то свалилось.

1. элементарная вещь, не стоило даже упоминать

2. множество точек выхода только у криворуких, но даже здесь им помогут функции, перед выходом вызывай clean_n_exit, вместо exit

3. man trap (bash)

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

Я не сказал писать нечитабельный код. Я сказал комбинировать пайпы. Одно перпендикулярно другому.

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

1) их нужно правильно называть - man mktemp
2) их нужно подчищать в конце выполнения программы, а точек выхода из программы может быть несколько
3) а еще интересней их подчищать когда программа упала где-то посередине, например, по Ctrl+C или просто если внутри что-то свалилось.

1. элементарная вещь, не стоило даже упоминать
2. множество точек выхода только у криворуких, но даже здесь им помогут функции, перед выходом вызывай clean_n_exit, вместо exit
3. man trap (bash)

1. Я не тебе упоминаю, а ТС'у. Посмотри его код.
2. Как научишься правильно применять несколько точек выхода, приходи.
3. Я вроде не спрашивал...

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

писал мне, я и ответил, а если тебе не надо проходи мимо молча

futurama ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.