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
Скрипт свое дело делает, но исполнение не нравится мне. Не знаю как обойтись без промежуточного файла. А также как записать результат в файл не в трех командах, а после последней. Подскажите как подправить.

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

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

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

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

achilles_85 ()
Ответ на: комментарий от 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 ★★★★★ ()
Ответ на: комментарий от anonymous

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

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

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

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

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

blexey ★★★★ ()
Ответ на: комментарий от 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

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

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

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

Kroz ★★★★★ ()