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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А для реализации респаўна «на коленке» достаточно просто не уводить процесс в фон (&) и загнать все это в бесконечный цикл:
 
#!/bin/sh  
if ps -U root -o command | grep -q 'tcpdump.* \-i pdp_ip0'; then  
 echo >&2 'tcpdump has already started'  
 exit 1  
fi  
while true; do
 while ! ifconfig pdp_ip0 | grep -q 'UP'; do  
  sleep 30  
 done  
 tcpdump -i pdp_ip0 -s 1450 -w /var/mobile/`date +%m-%d`.txt # вот здесь при копировании у вас обратные кавычки внезапно стали прямыми
done

 
Добавлено:

Цитата:
while ! ifconfig pdp_ip0 | grep -q 'UP'; do  
  sleep 30  
done  
tcpdump -i pdp_ip0

А вообще мне вот это не очень нравится, мы проверяем одно, а делаем другое. Нас в конце концов интересует не поднят ли интерфейс, а можем ли мы запустить tcpdump:
 
#!/bin/sh  
if ps -U root -o command | grep -q 'tcpdump.* \-i pdp_ip0'; then  
 echo >&2 'tcpdump has already started'  
 exit 1  
fi  
while true; do  
 until tcpdump -i pdp_ip0 -s 1450 -w /var/mobile/`date +%m-%d`.txt; do  
  sleep 30  
 done  
done


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:57 28-05-2011 | Исправлено: ASE_DAG, 03:46 29-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Т.е. проверка статуса интерфейса лишнее? В принципе, логично...
 
Еще один глупый вопрос: как запустить скрипт, чтобы он не прекращал выполняться при закрытии терминальной сесии?

Всего записей: 1070 | Зарегистр. 30-05-2006 | Отправлено: 23:37 28-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
$ nohup script.sh &
, хотя переводить в фон (&), собственно, не обязательно.
 
Во Фре эта штука есть. Есть ли в вашей айоси — проверьте.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:51 28-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
да, сработало, спасибо за помощь!

Всего записей: 1070 | Зарегистр. 30-05-2006 | Отправлено: 00:39 29-05-2011
Alukardd



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

я уже как комиксы дочитывал эту беседу
просто
с каждым постом выясняются всё более душераздирающие подробности желаемого)))


----------
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 | Отправлено: 01:46 29-05-2011
ASE_DAG



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


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:39 29-05-2011 | Исправлено: ASE_DAG, 02:46 29-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Блин! В ps -U root -o command | grep -q 'tcpdump.* \-i pdp_ip0' и подобных конструкциях выше перед \-i должен стоять пробел. Иначе Греп находит сам себя, что логично — \ тоже попадает под .*.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 04:53 29-05-2011 | Исправлено: ASE_DAG, 04:53 29-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Все душераздирающие подробности были описаны еще на 11 странице.
 
ASE_DAG
Насчет GNU, было бы еще более ценным наличие небольшого HOWTO по идентификации...
Насчет пробела перед \-i, глюк возможен, если запущено несколько tcpdump'ов с разными параметрами?
 

Всего записей: 1070 | Зарегистр. 30-05-2006 | Отправлено: 11:45 29-05-2011 | Исправлено: gap5, 11:47 29-05-2011
king_stiven

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

Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 08:49 02-06-2011 | Исправлено: king_stiven, 08:59 02-06-2011
Alukardd



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

Код:
for line in "`grep -n '[[:space:]]*УДК' "$src"`"; do
  ln="`echo "$line" | awk -F\: '{print $1}' | tr -d '\n'`"
  echo "$ln q "
done
штука в том, что как только я ставлю кавычки вокруг grep'а в for'е так он заходит внтурь цикла только 1 раз!!! Если кавчки снять вокргу ``, то тогда он не правильно работает и выходит хрень несусветная (видимо for сам берет после последнего пробела... или все по очереди гонит - в общем не то, что надо делает).
Подскажите как записать правильно? Пытался заменить `` на ${}, но лезут синтаксические ошибки - не умею я второй конструкцией пользоваться(((

----------
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:52 06-06-2011 | Исправлено: Alukardd, 23:55 06-06-2011
ASE_DAG



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

Цитата:
for line in "`grep -n '[[:space:]]*УДК' "$src"`"; do  
  ln="`echo "$line" | awk -F\: '{print $1}' | tr -d '\n'`"  
  echo "$ln q "  
done

 
ОМГ! О_о Что эта конструкция должна делать? Выводить в одну строку номера строк, удовл. '[[:space:]]*УДК', плюс " q " из файла?
 
$ awk -v ORS=" " '/[[:space:]]*УДК/{print NR, "q"}' "$src"

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:36 07-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Надо получить содержимое предыдущей строки, если в данная совпадает с регуляркой.
Цикл должен был дать нам номера всех строк совпавших и далее хотел через sed -n "$lnp" получить содержимое предыдущих, где let ln--. Кстати как в sed поместить эту $ln тоже вопрос)))
 
Добавлено:
awk '/[[:space:]]*УДК/{print NR-1}' "$src"
вот собственно номера но как получить теперь содержимое этих строк?
Кстати спс, а то у меня туго с awk
 
Добавлено:
Получил желаемое так
    for ln in `awk '/[[:space:]]*УДК/{print NR-1}' "$src"`; do
     awk "{if (NR==$ln) print \$1}" "$src"
    done
 
Добавлено:
А-а-а вы меня совсем с мысли сбили)))
НЕТ
Можно ли что-то сделать с моим старым выражением? Мне все равно нужно полное содержимое и найденной и предыдущей строк...
Запускать как это сделал я поиск по документу внутри цикла это жёстко долго, а если сделать таких поисков несколько... Так это вообще ппц будет.

----------
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 | Отправлено: 00:56 07-06-2011 | Исправлено: Alukardd, 01:36 07-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Надо получить содержимое предыдущей строки, если в данная совпадает с регуляркой.
Ну, наиболее кратко это можно записать, если дважды перевернуть порядок строк:
$ tac "$src" | awk '/[[:space:]]*УДК/{getline; print}' | tac
, но это, понятно, не рационально.
 
Лучше, все-таки, будет в два прохода:
$ awk '/[[:space:]]*УДК/{ln[i]=NR; i++} END{close(FILENAME); NR=1; while (getline < FILENAME) {if (NR==ln[j]-1) {print; j++}; NR++}}' "$src"
 
P.S. Вы, случаем, не в курсе, как по-нормальному запустить второй проход в авке?
 
 
Добавлено:
> нужно полное содержимое и найденной и предыдущей строк
Тогда, как не трудно догадаться:
$ awk '/[[:space:]]*УДК/{ln[i]=NR; i++} END{close(FILENAME); NR=1; while (getline < FILENAME) {if (NR==ln[j]-1) print; if (NR==ln[j]) {print; j++}; NR++}}' "$src"

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:48 07-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
вы мне просто вынесли мозг - можно немного комментариев по поводу while...
А счетчики i,j они типа по дефолту 1?
А getline что ли счетчик NR не трогает? Зачем мы его сами ++, да еще и не каждый раз, а только если наткнулись на строку с УДК???

----------
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 | Отправлено: 02:13 07-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем, авк не поощряет работу в несколько проходов. И правильно делает! Ибо если «задняя память» у нас всего в одну строку, то ее всяко лучше просто удерживать в памяти:
 
$ awk '/[[:space:]]*УДК/{print s; print} {s=$0}' "$src"
 
Вот!
 
P.S. Итого, меня на ночь лучше ни о чем не спрашивать — я сразу начинаю все переусложнять. ;-)
 


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:14 07-06-2011 | Исправлено: ASE_DAG, 02:18 07-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Я просто ахреневаю с того, что как всегда вот оно под носом)  
И тем не менее хотелось бы получить ответы на вопросы по предыдущему выражению?
 
p.s. И главное, что на сях это первое что пришло бы в голову!

----------
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 | Отправлено: 02:20 07-06-2011 | Исправлено: Alukardd, 02:20 07-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> getline что ли счетчик NR не трогает?
getline — трогает, getline < file — нет.
 
> мы его сами ++, да еще и не каждый раз, а только если наткнулись на строку с УДК?
Нет, каждый раз. Если это переписать нормально, а не в одну строку, то будет хорошо видно:
while (getline < FILENAME) {
   if (NR==ln[j]-1) {
      print;
      j++;
   }
   NR++;
}

 
> счетчики i,j они типа по дефолту 1?
Нет, ноль.
$ awk 'BEGIN{i++; print i}'
1


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:28 07-06-2011 | Исправлено: ASE_DAG, 02:29 07-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Если это переписать нормально
А-а вторая закрывающая скобка это от END.
Цитата:
Нет, ноль.  
Я почему 1 написал, а не ноль собственно... Из-за ln[j]-1 - куда оно обращается при первом проходе?
 
Добавлено:
У меня на завтра есть продолжение геморроя)))
Надо будет получить не предыдущую строку, а на 2 выше (т.е. через строку)...

----------
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 | Отправлено: 02:32 07-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> ln[j]-1 - куда оно обращается при первом проходе?
Эээ... ЩИТО? ln[j] (при первом проходе ln[0]) — номер первой строки, удовл. регэкспу. Соотв. ln[j]-1 — номер строки, предшествующей первой строке, удовл. регэкспу.
 
P.S. Это не логарифм, а имя массива. Лол. :-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:37 07-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Это не логарифм, а имя массива. Лол.
спс, кэп! ))) :rofl:
Я идиот, но по другой причине) Я читал это как ln[j-1] и думал что мы выйдем за границы массива)))
 
 
Добавлено:
awk 'BEGIN {j=2} /[[:space:]]*УДК/{print s; print} {if (j%=2) {s=$0} else {a=$0}; j++}' "$src"
Вот для получения на 2 строки выше... Только меня это не устроит((( Иногда надо на 2 иногда на 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 | Отправлено: 02:39 07-06-2011 | Исправлено: Alukardd, 02:50 07-06-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 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