Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, Alex_Piggy
Нет, некоторые страницы интернета правильно выводятся, склеиваются  awk в одну строку. А вот эта никак не выводится.

Цитата:
из-за чего Вы не можете обработать после закачки?  

Там идут строки типа:
                                      ...
11111111111111111111111111111111111111111111111111
11111111111111111начало нужного текста2222222222222
22222222222222222222222222222222222222222222222222
22222222222222222конец нужного текста
11111111111111
11111111111111111111111111111111111111111111111111
                                      ...
 
или может быть:
                                      ...
11111111111111111111111111111111111111111111111111
1начало нужного текста22222222222222конец нужного текста1111
11111111111111111111111111111111111111111111111111
                                      ...
 
Мне нужно вывести в одну строку:
начало нужного текста222222222222222222222222222222222222222222222конец нужного текста
Причём построчный разбор sed ом очень долгий, желательно awk ом склеить все строки в одну строку,  
11111111111111111начало нужного текста222222222222222222222222222222конец нужного текста1111111111
а затем sed ом выцеплять.
 
Добавлено:

Код:
sed -n "/начало нужного текста/,/конец нужного текста/p"

пока так сделал, направил wget не на awk а на sed, но будет ли всегда корректно овыходить, не знаю.

Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 14:45 10-02-2012 | Исправлено: king_stiven, 15:34 10-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
> склеил в одну строку всю страницу
А зачем вам это сдалось, если не секрет?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:53 10-02-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Давайте код.

Цитата:
А зачем вам это сдалось, если не секрет?

Элементарно, выцеплять нужную инфу со страниц в базу.

Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 16:00 10-02-2012
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
king_stiven
Многострочный поиск/замена в sed - это беда.
Сейчас проблема в -v RS="\r\n". На стороне сайта, похоже, только \n. Попробуйте -v RS="\r\n|\n"
И мне кажется, что for совсем-совсем лишний...:
wget  "http://rutracker.org/forum/viewtopic.php?t=3908777"  -O- |awk -v RS="\r\n|\n" -v ORS=" " "{print( $0 );}" | sed -e "s|Начало нужного текста|\r\n\0|g" -e"s|Конец нужного текста|\0\r\n|g" 1.txt | sed -n -e"\|Начало нужного текста|p" > data.txt

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 16:13 10-02-2012 | Исправлено: Alex_Piggy, 16:29 10-02-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Спасибо попробую.  

Цитата:
> data.txt

Не годится.
 
Добавлено:

Код:
wget  "http://rutracker.org/forum/viewtopic.php?t=3908777"  -O- |awk -v RS="\r\n|\n" -v ORS=" " "{print( $0 );}"

Кажется то, что надо, пример сработал, спасибо.

Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 17:05 10-02-2012 | Исправлено: king_stiven, 17:05 10-02-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а вот и sed заработал на склейку строк
sed -e :a -e "/$/N; s/\n/ /; ta"

Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 20:51 10-02-2012 | Исправлено: king_stiven, 20:52 10-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос
Weinaum
А решение всё также просто и красиво
Код:
awk '/index\.html/ && /main\.html/ && uniq[$0]==0{print;uniq[$0]=1}' /исходный/файл > /выходной/файл


----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 22:19 10-02-2012
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
сорри, может, не совсем корректно описал задачу, но в данном случае получается, что в новый файл записываются только строки, в каждой из которых есть как первое, так и второе слово - т.е. оба, если слов 2, или все слова, если слов больше. Спасибо, буду иметь в виду.  
В данный же момент мне нужно сделать так, чтобы записывались строки, в которых есть как минимум одно из заданных слов. Вот тогда может получиться, что появится достаточное количество строк, в которых есть и первое и второе слово, такие то строки и будут дублироваться, для этого лишние и надо удалять.  
Собственно, можно наверное сделать сначала отдельно файлы по каждому слову, потом объединить эти файлы в один и по окончании удалить дубли, но подумалось, что все таки можно как то все одним махом, опять таки "просто и красиво".)))

Всего записей: 2155 | Зарегистр. 18-06-2006 | Отправлено: 03:34 11-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
> одно из заданных слов
Ну вот И на ИЛИ никак, да, не заменить? ;-)
 
$ awk '(/index\.html/ || /main\.html/) && uniq[$0]==0{print;uniq[$0]=1}' /исходный/файл > /выходной/файл
 
> тогда может получиться, что появится достаточное количество строк, в которых есть и первое и второе слово, такие то строки и будут дублироваться
С какого перепугу? Дубли будут найдены, если они есть изначально. Если дублей в исходном файле нет, то и задаче по их устранению не стоит
 
$ awk '/index\.html/ || /main\.html/' /исходный/файл > /выходной/файл
— и все.
 
Еще более разумно, по идее, использовать только один регэксп:
 
$ awk '/(main|index)\.html/' /исходный/файл > /выходной/файл

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:52 11-02-2012 | Исправлено: ASE_DAG, 03:56 11-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Еще более разумно
я-то уж точно не сомневался, что Ваши выражения красивее моих...
А вот что можно {print} не писать (так же как в find) - я не знал. (при условии что вообще нету тела {}, разумеется)

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 13:27 11-02-2012
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
спасибо
упс, и правда - все работает, и дублей тоже нет- я думал, что раз в исходном файле есть строки, в которых есть и первое, и второе слово, то такие строки таки будут выведены дважды...
вумный же энтот авк ))))))

Всего записей: 2155 | Зарегистр. 18-06-2006 | Отправлено: 14:03 11-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
awk не умный - а практичный. Просто конструкция что я вам привел проверяет всю строку независимо от шаблона поиска.
Надеюсь вы наложили последний пример т.ASE_DAG на код с uniq?.. И теперь все не просто работает, а еще и красиво выглядит

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 14:28 11-02-2012
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd

Цитата:
Надеюсь вы наложили последний пример т.ASE_DAG на код с uniq?.. И теперь все не просто работает, а еще и красиво выглядит

безусловно

Всего записей: 2155 | Зарегистр. 18-06-2006 | Отправлено: 15:00 11-02-2012
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
у меня тут снова возникли сложности с вроде бы уже решенной проблемой

Цитата:
vim -c '%s/archiv\/index\.html/http:\/\/mydomain.com\/archiv\/index.html\//g' -c 'wq!' ${BACKUPFILE}  

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

Код:
src=\"archiv\

 
надо после замены получить

Код:
src=\"http:\/\/mysite.net\/archiv\

Еще раз, все символы именно в таком виде хранятся в бд, пробовал уж по всякому, и дополнительные обр. слеши, и переменные, может, что то неправильно делаю или что то недопонимаю, но не проходит..

Всего записей: 2155 | Зарегистр. 18-06-2006 | Отправлено: 15:51 16-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
В таких случаях пользуйтесь тем, что в большинстве реализаций синтаксис s и подобных ему операторов позволяет использовать любой символ в роли разделителя, а не только /.
 
$ perl -i -np -e 's|(?<=src=\\")archiv|http:\\/\\/mysite.net\\/archiv|' ${BACKUPFILE}
 
Если не понятно, то поясняю, что в том случае, когда экранирующих черт в исходном потоке нет это выглядело бы так:
$ perl -i -np -e 's|(?<=src=")archiv|http://mysite.net/archiv|' ${BACKUPFILE}
 
P.S. g добавьте обратно, если она здесь таки нужна.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:45 16-02-2012
slech



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
Есть вопросик про демоны и ключики некторых приложений -D
Вот есть Snort, который принимет трафик из stdin

Код:
 
trafr -s | snort -r -
 

И snort начинает принимать трафик.
 
Теперь я пробую запустить snort как daemon

Код:
 
trafr -s | snort -D -r -
 

И моя связка перестаёт работать.
 
Есть ли возможность приложение, в моём случае trafr запустить как daemon что бы он продолжал отдавать трафик snort ?
 
Спасибо.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 20:43 16-02-2012 | Исправлено: slech, 20:44 16-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
> Snort, который принимет трафик из stdin
> пробую запустить snort как daemon
> связка перестаёт работать
Предельно логично. Демон от обычного процесса отличается в т.ч. и тем, что стандартные потоки у него перекрыты.
 

Цитата:
@Elemir: Читатель, а ты знаешь какой-нибудь верный способ стать демоном? Какие минусы?
@proton: надо форкнуться и убиться
@dk: daemon(). Из минусов: закрываются stdin, stdout и stderr

 
;-)
 
> Есть ли возможность
Обрисуйте задачу, которая перед вами стоит.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:58 16-02-2012 | Исправлено: ASE_DAG, 23:10 16-02-2012
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
спасибо,
предыдущий пост был как продолжение этого .
Я несколько неправильно обозначил строки,
так, как я их обозначил в предыдущем посте, так я их вижу в phpmyadmin - если же сам файл дампа базы данных открыть в текстовом редакторе, то там эти строки еще веселее выглядят, вот так:

Код:
src=\\\"archiv
src=\\\"http:\\/\\/panofactory.net

 
В общем, тут еще те заморочки. Ну хорошо, от первой части допустим можно избавиться, т.е. от src=\\\,  
но от кавычек никак, поскольку в дампе есть строки с вхождением archiv , без кавычек, которые нельзя ессно менять. А вот строки с вхождением "archiv - с кавычками, только те, что нужно изменять.  
Решил я все таки попытаться остаться с вимом.
Остальное у меня получилось вот так:

Код:
vim -c '%s/"archiv/"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' -c 'wq!' /home/dumps/db_120216.sql

причем эта конструкция срабатывает нормально при прямом указании файла дампа.
 
Однако, у меня все это дело завязано в скрипт, вим работает с архивом, и вот в случае скрипта - он теперь вот такой -
Код:
BACKUPFILE=/home/путь_к_дампу_бд/dumps/db_`date "+%y%m%d_%H%M"`.sql.gz
mysqldump -u user1 -ppassword1 dbase1 -h host1 | gzip > ${BACKUPFILE}
vim -c '%s/"archiv/"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' ${BACKUPFILE}
/bin/gunzip < ${BACKUPFILE} | /usr/bin/mysql -u user2 -ppassword2 dbase2 -h host2
a=$(ls -ltr /home/путь_к_дампу_бд/dumps|wc -l);cd /home/путь_к_дампу_бд/dumps; rm $(ls -rt1 .|head -$(($a-4)))  

получается косяк, что вим продолжает что то делать уже после того, как данная строчка -  
vim -c '%s/"archiv/"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' ${BACKUPFILE} -  
была отработана. Видимо, дело в кавычках, поскольку в случае, когда в строке поменьше слешей и нет совсем кавычек, скрипт работает без проблем....
Кавычки эти тоже пытался экранировать, но в том то и дело, что без скрипта, одной командой, все работает и без экранирования кавычек, а со скриптом и с экранированием не идет...
Где то я косячу, не пойму где...

Всего записей: 2155 | Зарегистр. 18-06-2006 | Отправлено: 23:03 16-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
зачем же сразу на чистый perl переходить?)
 
Weinaum
Я собственно не понял в чём проблема-то? Экраниируйте всё что душе угодно...
vim -c '%s/\(src=\\"\)archive\\/\1http:\\\/\\\/mydomain.com\\\/archive\\/g' -c 'wq!' ${BACKUPFILE}
Часть регулярки с src="\ и последний \ можно вообще убрать из обихода, оставил для полноты картины, т.к. пример привели вы с ними...
 
Добавлено:

Цитата:
-c 'wq!
а эту часть команды вы где в скрипте потеряли? оО Или вы думаете это для красоты?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 23:15 16-02-2012
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd

Цитата:
-c 'wq!
а эту часть команды вы где в скрипте потеряли? оО Или вы думаете это для красоты?

...а я всю голову сломал..(посыпая ее самую пеплом...)

Всего записей: 2155 | Зарегистр. 18-06-2006 | Отправлено: 23:42 16-02-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru