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

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

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

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
      Шпаргалка по частым синтаксическим оборотам.

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

 

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> Я понимаю, что это grep и split
Не понимаете :-) Грепом это не реализовать — ему IRS нельзя указывать произвольно.
 
Вот как-то так:
 
$ find -exec 'awk -v RS=\n\n\n\n -v ORS=\n\n\n\n /mypattern/{ print >> myoutput.txt } {}' \;
$ find -exec awk -v RS='\n\n\n\n' '/mypattern/{ print >> "myoutput.txt" }' {} \;
 
Ключи файнду задать по надобности; и ORS — по вкусу.
 
P.S. Примера вы не дали, так что написано «вслепую» и не проверено; могут быть ошибки вплоть до синтаксических.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:19 02-10-2011 | Исправлено: ASE_DAG, 00:30 03-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Thx за оперативность. Пробую, find пишет: "No such file or directory".
 
Пример готов дать. Залил пять типичных файлов: http://zalil.ru/31796981 Ищу слово "Jaybe1310"

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 23:04 02-10-2011 | Исправлено: Frank Fox, 23:05 02-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> Пробую
Что вы пробуете?
 
> find пишет: "No such file or directory"
И больше ничего не пишет?
 
Конкретно в данном случае, это, конечно, придирки, но надо, наверное, уже в шапке красными буквами написать: «не надо давать косвенных описаний ввода и вывода, их надо приводить дословно».
 


> пять типичных файлов
Ага. Ну, во-первых, там параграфы разделены странной последовательностью \r\n\n\r\n (было бы \r\n\r\n\r\n — было бы понятно). А во-вторых, как я и говорил «могут быть ошибки вплоть до синтаксических» — так и есть. ;-)
 
$ find -exec awk -v RS='\r\n\n\r\n' '/Jaybe1310/{ print >> "myoutput.txt" }' {} \;

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:13 03-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
root@vm7002:~/FindTest# find -exec awk -v RS='\r\n\n\r\n' '/Jaybe1310/{ print >> "myoutput.txt" }' {} \;
awk: read error (Is a directory)
 
Команда отрабатывает, но что за ошибки чтения?  
Про не сидеть под root'ом я знаю =)
 
Big thx.  

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 00:16 03-10-2011 | Исправлено: Frank Fox, 00:27 03-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
И? Все, как я вижу, отработало корректно. См. что у вас в myoutput.txt.
 
А awk: read error (Is a directory) — это вы файнд ничем не ограничили, он первое что выдал — была . (текущая директория). Я же написал: «ключи файнду задать по надобности». Если нужны все файлы из иерархии текущей директории, то -type f укажите.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:27 03-10-2011 | Исправлено: ASE_DAG, 00:27 03-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А как  теперь сделать, что бы он делил этот файл на части по, скажем, сто абзацев?

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 20:20 04-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> на части по, скажем, сто абзацев?
Сразу или можно после?
 
Если после, то:
$ awk -v RS='\r\n\n\r\n' -v i=0 '{ print > "myouput." i }  0==NR%100{ i++ }' myoutput.txt
 
Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:34 04-10-2011 | Исправлено: ASE_DAG, 20:35 04-10-2011
lilitaibolit

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите решить такую задачу:
есть n интерфейсов, которые получают адрес, маску, шлюз и днс по дхцп.
надо:
- потушить все интерфейсы

Код:
#!/bin/sh
ifconfig n1 down
ifconfig n2 down

- по-очереди включить каждый и для верности запустить получение адреса по дхцп

Цитата:
ifconfig n1 up
dhclient n1

- парсить вывод netstat -rn на предмет дефолтного шлюза

Код:
 netstat -rn | grep default
default            1.1.1.1     UGS       12 73504426     -     8 fxp1
 

- или, если система смогла получить два значения параметра default, то парсим эти два адреса            

Код:
netstat -rn | grep default
default            1.1.1.1     UGS       11 73406860     -     8 fxp1
default            2.2.2.2     UGS       11 73406860     -     8 fxp2

- если не смогла получить два шлюза, то выключаем n1, включаем n2 и находим значение другого шлюза

Цитата:
ifconfig n1 down
ifconfig n2 up
dhclient n2
netstat -rn | grep default
default            2.2.2.2     UGS       11 73406860     -     8 fxp2

- смотрим файл и вносим значение шлюза1 в первую попавшуюся строку $ext_gw1 = "сюда",
а шлюза2 в строку $ext_gw2 = ""

Цитата:
cat /etc/pf.conf | grep ext_gw1
ext_gw1 = "3.3.3.3"
 

- заносим значение любого из найденных шлюзов в файлик

Код:
echo '1.1.1.1' > /etc/mygate

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

Цитата:
pfctl -f /etc/pf.conf

надо для НАТ-а соурса в разные сетки через некстхоп, поэтому нужен параметр шлюза, чтоб корректно отрабатывать автоматом, после конца аренды выданного адреса.

Всего записей: 15 | Зарегистр. 30-11-2009 | Отправлено: 00:04 05-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
На небольших файлах отрабатывает адекватно.  
На больших (около 300 мегабайт) очень долго грузит процессор и винт, но создания самих файлов дождаться не получалось.  
 
А если сразу, а не после, то как?

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 12:43 05-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> А если сразу, а не после, то как?
А у вас там вообще, я смотрю, все разбираемые файлы в одной директории, так? И так всегда будет? Их вообще сколько? Если в одной и если их счетное количество (ну, до пары сотен), то файнд здесь вообще и не нужен — обходимся одним процессом:
 
$ awk -v RS='\r\n\n\r\n' -v i=0 -v j=0 '/Jaybe1310/{ print >> "myoutput." i; j++ } 0==j%100{ i++ }' *.txt
 
маску (*.txt) задать по надобности; i (т.е. номер после имени файла) здесь будет номером параграфа во входном потоке, если не хотите сбивать лексикографическую сортировку выходных файлов, то:
$ awk -v RS='\r\n\n\r\n' -v i=0 -v j=0 '/Jaybe1310/{ print >> "myoutput." sprintf("%04d", i); j++ } 0==j%100{ i++ }' *.txt
, 04 можно, понятное дело, и увеличить.
 
Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:09 06-10-2011 | Исправлено: ASE_DAG, 01:10 06-10-2011
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попрошу тоже помощи уважаемых аксакалов
Дано:
Две дирректории - "источник" и "цель". Дирректория "цель" должна быть синхронизована с "источник". Причем файлы в "цель" не должны быть просто перезаписаны - файлы, подлежащие замене, должны быть перенесены в дирректорию, которую мы задаем в командной строке скрипта, например Ch67483 и за tarz-ены. При необходимости, при помощи соответствующего ключа, должна быть возможность откатить изменение назад. Может есть уже у кого такой скрипт?
 
Парочка заготовок:
Так я гоняю файлы по сети:
Код:
# rsync --partial --progress --rsh=ssh  $source $user@$host:$destination

Так можно перекинуть определенные файлы, если их много, нет МНОГО:
Код:
# tar cpfP - $(find <somedir> -type f -name *.php) | ssh user@host | tar xpfP -

Так можно копировать файлы если машины не видят друг друга - в обход:
Код:
# ssh root@host1source "cd /somedir/tocopy/ && tar -cf - ." | ssh root@host2destination "cd /samedir/tocopyto/ && tar -xf -"

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:50 06-10-2011 | Исправлено: CrownRU, 10:58 06-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lilitaibolit
Вы бы всё-таки сами скрипт бы написали, а непонятные моменты мы бы вам прояснили, а то писать за вас с нуля, да еще и не имея возможности протестировать (шлюз у меня лично один) совсем нет желания.
 
CrownRU
Я сам тоже не внимательный и это с завидной периодичностью мне показывает т.ASE_DAG
Но на этот раз я вам покажу
Цитата:
Читаю мануалы — 10$
Читаю мануалы с акцентом и ударениями — 50$
man rsync
Цитата:
-b, --backup
              With  this option, preexisting destination files are renamed as each file is transferred or deleted.  You can control where the backup file
              goes and what (if any) suffix gets appended using the --backup-dir and --suffix options.
 
              Note that if you don’t specify --backup-dir, (1) the --omit-dir-times option will be implied, and (2) if --delete is also in effect  (with&#8208;
              out  --delete-excluded),  rsync will add a "protect" filter-rule for the backup suffix to the end of all your existing excludes (e.g. -f "P
              *~").  This will prevent previously backed-up files from being deleted.  Note that if you are supplying your own filter rules, you may need
              to  manually  insert  your  own  exclude/protect rule somewhere higher up in the list so that it has a high enough priority to be effective
              (e.g., if your rules specify a trailing inclusion/exclusion of ’*’, the auto-added rule would never be reached).
 
       --backup-dir=DIR
              In combination with the --backup option, this tells rsync to store all backups in the specified directory on the receiving side.  This  can
              be  used for incremental backups.  You can additionally specify a backup suffix using the --suffix option (otherwise the files backed up in
              the specified directory will keep their original filenames).
 
       --suffix=SUFFIX
              This option allows you to override the default backup suffix used with the --backup (-b) option. The default suffix is a ~ if no  --backup-
              dir was specified, otherwise it is an empty string.


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:38 06-10-2011 | Исправлено: Alukardd, 13:40 06-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то не могу разобраться с uniq. Все тот же csv:

Код:
 
"09:38";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
"";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
"";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
 

надо удалить строки, где идет совпадения по ID номеру, делаю
cat $NAME | sort -u
строка
"09:38";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
остается, т.к. она отличается от нижних.
Как сделать uniq по 6 ячейке ?

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 14:50 07-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Для этого надо, очевидно, либо сортировать по шестой ячейке, либо держать всю шестую колонку в памяти. Файл, как я помню, вполне конечный, так что последнее проблемы не составляет:
$ awk -v FS=';' '!a[$6]++' "$NAME"

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:05 07-10-2011 | Исправлено: ASE_DAG, 15:08 07-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Работает )
 
Как в bash сделать счетчик, после которого надо делать действие. Скрипт срабатывает каждую минуту, если в течении 5 мин. результат одинаковый-запускаем скрипт2 ?
 
вот сам скрипт:

Код:
 
if ping -q -c 2 $HOST; then
echo "ping OK"
else
echo "ping Bad"
/script2.sh
fi
 

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 15:17 07-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> Работает )  
Удивлены? :-)
 
> cкрипт срабатывает каждую минуту, если в течении 5 мин. результат одинаковый-запускаем скрипт2
Если временные интервалы нестрогие, то:

Код:
#!/bin/bash
HOST='example.org'
while :; do
    if ping -qc 2 "$HOST"; then
        echo >&2 "ping $HOST: OK"
        ((C=0))
    else
        echo >&2 "ping $HOST: FAIL"
        ((C++))
        ((C >= 5)) && hostisunreachable.sh
    fi
    sleep 1m
done

 
Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:40 07-10-2011 | Исправлено: ASE_DAG, 17:45 07-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Комментарии нужны?
Разумеется! Ппц, сколько тут можно узнать пока читаешь ваши скрипты))) т.е. (( )) заменяет let?

Цитата:
Удивлены?  
И етому удивлён) Не думал что конструкция !var++ сработает как if not exist var then var=0; var++...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:02 07-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> т.е. (( )) заменяет let?

Цитата:
      ((expression))
              The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION.  If the value of the expression is non-zero, the return
              status is 0; otherwise the return status is 1.  This is exactly equivalent to let "expression".

 
 
> Не думал что конструкция !var++ сработает как if not exist var then var=0; var++...
А это и не так.
Если расписать '!a[$6]++' будет что-то такое:
'{ if (a[$6] == 0) print $0; a[$6]++ }'.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Цитата:
я всегда просто let пользовался...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:29 07-10-2011
digital422

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

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 21:16 07-10-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

Компьютерный форум 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