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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Кажется вы не привели это к sql виду... Скобки и разделитель запятая...  
Блин, нашли проблему — пять символов (плюс две экранир. черты) дописать в нужное место:
 
$ gawk '{
    match ($0, /([.0-9]*)[[:space:]]*([[:alnum:] ]*)/, s);
    gsub (/\./,"0",s[1]);            
    printf ("%s(0%s, \"%s\")", NR==1 ? "" : ",\n", s[1], s[2]);
    }  
    END{ print ";" }' grnti/grnti.txt

 
Добавлено:
> отрезать в строке с ВАК если находим См. до ближайшей точки с запятой
Пример? Это вообще к чему относится? К прошлой задачке?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:47 08-06-2011 | Исправлено: ASE_DAG, 23:57 08-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Блин, нашли проблему
я так, к слову...
Цитата:
Пример?
ок, ок... ЗабылЪ
ВАК См. 00; 10.02.19
ВАК 01.01.09, 07.00.00/24.00.00
ВАК 09.00.00
ВАК 05.25.00,09.00.00
ВАК 09.00.01; +09.00.04; +09.00.05; 09.00.11; 09.00.13
ВАК См. 02.31
ВАК См.05
ВАК См.05, 05.13.01

Вроде представил вам все возможные вариант засад.
Вид надо получить всё тот же... Есть еще тут косяк, но его можно решить заранее - у этих дегенератов иногда в Cм - С в латинице!!! Ну и как видите не везде есть пробелы... И кое где запятая а не ;, хотя См. не было - такой вариант наверное рассматриваем как обычный (как и ;).
 
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 | Отправлено: 00:02 09-06-2011 | Исправлено: Alukardd, 00:06 09-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Вид надо получить всё тот же... где-то есть пробелы где-то нету...
Т.е. это к этому вот, не к прошлому? И надо просто удалить только «см.» или «см.» и номер к нему относящийся?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Да, как я уже сказал обрабатывать см. как ссылку щас не будем. Как нибудь в другой раз
 
Поэтому надо удалить См (напоминаю про подставу с языком) и пункты к нему относящиеся. Будем считать, что к нему относится все до ближайшей ;. Собственно тут и вопрос, я хз как так удалить на awk... А в середину выражения sed не воткнёшь....
 
Добавлено:
Долбаные мудаки делали этот документ! Щас проверял как УДК сформировалось нашёл десяток строк со слитным написание или с ; там где её быть не должно... Что б их всех!!!
Если щас вы мне покажите как в awk со строками работать, то наверное можно будет обобщить проблему с УДК примерно таким способом sed 's/^УД.{1,2}([[digit:]].*)/\1/g', вместо gsub($1." ","") - который был рассчитан именно на УДК .
 
p.s. оО почитал немного man vi - я всё больше прусь с возможностей этого редактора - он блин и шифровать документы умеет! Ключик -x.

----------
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:18 09-06-2011 | Исправлено: Alukardd, 00:19 09-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> я хз как так удалить на awk...  
> А в середину выражения sed не воткнёшь
Да точно так же, как и на Седе:
sub(/[CС]м[^;]*; */, "")
регистронезависимость я бы для такой задачи глобально включил.
 
Добавлено:
> примерно таким способом
> sed
Да забудьте пока вы про Сед. Не мешайте все в кучу.
 
P.S. В Гавке функция замены, поддерживающая обратные ссылки, — gensub(r, s, h [, t]), если вы не в курсе.
 


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Так gensub написано, что строку не меняет и результат возвращает как функция...
 
Ваш sub ровным счётом ни чего не дал - так же пробовал в нём менять regexp, тоже безрезультатно.
awk --re-interval '/ВАК/{gsub($1." ",""); sub(/[CС]м[^;]*; */, ""); gsub(";",""); for(i=1;i<=NF;i++){print "("s", \""$i"\"),"}} {gsub(/\./,"0",$1); s="0"$1}' grnti/grnti-vak.txt | sed '$s/\(.*\),$/\1;/g' | less
 
Пробовал менять [CС] на .
 
Добавлено:
Для УДК вышло - sub(/УД[^[:digit:]]{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 | Отправлено: 00:52 09-06-2011 | Исправлено: Alukardd, 00:53 09-06-2011
olegpronin



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужна помощь!
 
Вот структура каталогов:
/FLAC/Artist {Genre 1, Genre 2}/Artist - Album (Year) [FLAC]
 
shell скрипт кидаю во FLAC
 
в списке list.txt должны появиться только папки Artist - Album (Year) [FLAC]  
 
решение для bat-файла винды
@echo off
for /r c:\flac /d %%i in (*[FLAC]*) do echo %%~nxi >> list.txt  
 
кто-нибудь может помочь сделать тоже самое на unix?
спасибо!

Всего записей: 5365 | Зарегистр. 31-01-2007 | Отправлено: 18:20 16-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
olegpronin
find /FLAC/ -type d -name '*\[FLAC\]*' -exec basename {} \; > list.txt
вроде так.

----------
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 | Отправлено: 20:57 16-06-2011
olegpronin



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

Всего записей: 5365 | Зарегистр. 31-01-2007 | Отправлено: 23:08 16-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> find /FLAC/
FLAC в корне? О_о
FLAC/ (или ./FLAC/) вы, наверное, хотели сказать?
 
Добавлено:
> -exec basename {} \;
А вызывать при каждой находке внешнюю утилиту — ой как не рационально, при условии, что вывод файнда настраивается куда гибче:
 
$ find FLAC/ -type d -name '*\[FLAC\]*' -printf '%f\n' > list.txt
 
Но это уже придирки. ;-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:43 16-06-2011 | Исправлено: ASE_DAG, 23:44 16-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
FLAC в корне? О_о
FLAC/ (или ./FLAC/) вы, наверное, хотели сказать?  
что просили то и написал...
Цитата:
find FLAC/ -type d -name '*\[FLAC\]*' -printf '%f\n' > list.txt
к своему сожалению я не знаю утилиту printf ну совсем и не могу найти где можно толково прочитать про неё... А Си в своё время я очень плохо учил и всегда юзал std::cout

----------
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:59 17-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> я не знаю утилиту printf ну совсем
Ну это не утилита, а именно что одна из самых интересных сишных функций.
 
> где можно толково прочитать про неё
C http://ru.wikipedia.org/wiki/printf вполне можно начать. ;-)
 
Но в данном-то случае собственно к принтэфу это отношения не имеет — просто принтэф-подобный синтаксис описания формата вывода уже давно стандарт де-факто. Не может быть, чтоб вы не пользовались там stat'ом или date'ом — у find'а то же самое.  
А «типы» (ну эти %f, %S и т.д.) — они все-равно у каждой утилиты свои — не упомнить — надо открывать ман и смотреть.
 
> всегда юзал std::cout
Жжете. А на самом деле — много времени на этом потеряли, имхо.

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

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



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

Цитата:
Жжете. А на самом деле — много времени на этом потеряли, имхо.
я не программист (хотя образование говорит об обратном), и искренне не люблю писать программы и делаю это ужасно криво и в основном процедурное программирование. Вот скрипты - другое дело и то именно bash(не php или cgi ) на худой конец batch...
Цитата:
Не может быть, чтоб вы не пользовались там stat'ом или date'ом
Ну date'ом разумеется пользовался... Ёмаё!!! Шикарная тулза - stat!!! Спс)))
Эх пожалуй надо будет покурить инфу по printf, а то вот мы с вами с awk ***лись и в какой-то момент вы поюзали printf я так и не понял как его правильно читать, после этого еще для себя методом тыка получил нужный вариант (полагаю очень кривой, но работает)...

----------
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:42 17-06-2011 | Исправлено: Alukardd, 01:43 17-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> я не программист
А я и тем паче не он. ;-)
 
> Спс
Всгд пжлст.

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

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



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

Цитата:
echo $HOSTNAME

 из консоли возвращяет имя узла,  

Цитата:
#!/bin/bash
echo $HOSTNAME

а то же самое из скрипта нет
это вроде встроенная переменная BASH.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 22:04 21-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
> это вроде встроенная переменная BASH.
Нет (хотя это смотря что считать «встроенным»). Эта переменная инициализирована только в интерактивном режиме (bash -i).
Используйте $(uname -n) для получения имени хоста.
 
P.S. Хм... А у меня и в неинтерактивном режиме тоже определена.  
В общем, не суть, важно то, что эти переменные где-либо ранее должны быть установлены, что имеет место не всегда. Вызов внешней утилиты в момент выполнения скрипта всегда надежней в плане кроссплатформенности.

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

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



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

Цитата:
P.S. Хм... А у меня и в неинтерактивном режиме тоже определена.

и у меня на некоторрых серверах, а вот тут возьми и перестань работать.
 

Цитата:
Используйте $(uname -n) для получения имени хоста.  

я неребрался на  

Цитата:
hostname=$(hostname)

 

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 18:53 22-06-2011
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нужно выполнить определенную последовательность команд, зависящую от счетчика, над результатом find:
export a=0; find . -exec echo {} \; -exec echo $a \; -exec a=$[$a+1] \;
вот здесь и возникает проблема  - find -exec не умеет выполнять внутренние команды баша, соответственно счетчик не увеличивается
 
как можно реализовать счетчик в командах обработки результатов find ?

Всего записей: 2078 | Зарегистр. 08-01-2008 | Отправлено: 20:27 01-07-2011 | Исправлено: DrakonHaSh, 20:33 01-07-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
> find -exec не умеет выполнять внутренние команды баша
Так запустите Баш.
$ find -exec bash -c "echo $a; a=$(($a+1))" \;

 
P.S. Но это крайне неэффективно, обрисуйте задачу, мне кажется, ее можно решить иначе.
P.P.S. $[expression] — устаревшая конструкция, пишите $((expression)).
 
Нет, прощу прощения, переменная родительского процесса так не меняется.
В общем, опишите задачу.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:56 01-07-2011 | Исправлено: ASE_DAG, 21:23 01-07-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
Да уж такое не пашет...
 
В общем как сказал ASE_DAG - опишите задачу
 
Хотя если попробовать додумать за вас , то выйдет нечто такое - find . | grep -n ''

----------
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:29 01-07-2011 | Исправлено: Alukardd, 23:31 01-07-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