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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
> Надо будет получить не предыдущую строку, а на 2 выше (т.е. через строку)...
> Только меня это не устроит((( Иногда надо на 2 иногда на 1
Ну, вот в общем виде — искомая плюс n строк выше:
'/regex/{for (j=0; j<n; j++) print s[(i+j)%n]; print} {i%=n; s[i]=$0; i++}'

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кстати, о проверках. Если n строк выше нету (начало файла), то будут выводиться пустые, что не очень хорошо, поэтому проверка перед выводом не помещает, да:
 
'/regex/{for (j=0; j<3; j++) {t=(i+j)%3; if (s[t]) print s[t]}; print} {i%=3; s[i]=$0; i++}'

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А можно в проверку еще regexp как-то упихать?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> А можно в проверку еще regexp как-то упихать?
Не понял.
 
P.S. Но думаю, что можно.

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

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



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

Цитата:
if (s[t]) print s[t]
печатаем, если не пустая строка, а можно тут печатаем если содержит АБВ?

----------
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:01 07-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> тут печатаем если содержит АБВ?
Почему нет?
if (s[t] ~ /АБВ/) print s[t]

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Во новый для меня способ сравнения x ~ /regexp/
Спасибо.
 
Добавлено:
Хм... Такое у меня не проканало...
awk 'BEGIN{n=2} /ВАК/{for (j=0; j<n; j++) {t=(i+j)%n; if (s[t] ~ /^[[:digit:]]\{2\}\(\.\|[[:space:]]\)/) print s[t]}; print} {i%=n; s[i]=$0; i++}' "$src"
Выводит только искомую строку и ни каких строк до, пробовал с n=1,2,3
 
Либо я плохо изъясняю, либо вы меня плохо понимаете
Цитата:
Иногда надо на 2 иногда на 1(((
Структура документа следующая:
Код:
regexp1
  regexp2
  regexp3
Нужно! Найти все regexp3 и соответствующие им regexp1. При этом строки с regexp2 может вообще не быть. И regexp3 есть не у каждого regexp1, т.е. нельзя исходить от обратного.
В итоге надо получить соответствие regexp1 и regexp3.
 
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 | Отправлено: 22:15 07-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Выводит только искомую строку и ни каких строк до
Значит этот ваш регэксп /^[[:digit:]]\{2\}\(\.\|[[:space:]]\)/ неправильно составлен.
Можете убедиться, что без него работает.
 
P.S. А вообще таблицу соответствий классификаторов ГРНТИ, УДК и ВАК можно было бы давно найти в более машиночитаемом формате.
 
Добавлено:
> Значит этот ваш регэксп /^[[:digit:]]\{2\}\(\.\|[[:space:]]\)/ неправильно составлен.  
Я даже скажу как правильно:
/^[[:digit:]]{2}(\.|[[:space:]])/
 
и укажите авку ключ --re-interval, а то он их не очень любит.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Этот регэксп работает в grep замечательно - все проверялось - и в скрипте и в просто в терминале.
 
По поводу PS - взял doc с оф сайта ГРНТИ - там есть sql версия, но она платная... Решил по другим сайтам не искать - что бы херь не скачать... Тут точно свежее и корректное. К тому же опыт и знания об awk очень хочется получить...
А вообще да мне все в итоге надо в postgres будет слить...
 
оО  
awk --re-interval 'BEGIN{n=2} /ВАК/{for (j=0; j<n; j++) {t=(i+j)%n; if (s[t] ~ /^[[:digit:]]{2}(\.|[[:space:]])/) print s[t]}; print} {i%=n; s[i]=$0; i++}' grnti.txt|less
неужто правильно все выдал....
 
П****ц...
Разложил код как положено - я не вкуриваю, что реально происходит... Почему для каждой строки мы заново считаем i%=n и i++ или я не правильно читаю порядок действий awk?
Код:
    awk --re-interval '
        BEGIN{n=2}
        /ВАК/{
                        for (j=0; j<n; j++)  
                        {
                            t=(i+j)%n;
                            if (s[t] ~ /^[[:digit:]]{2}(\.|[[:space:]])/) print s[t]
                        };
                        print
        }  
        {
                        i%=n;
                        s[i]=$0;
                        i++
        }'  


----------
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:41 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Этот регэксп работает в grep замечательно - все проверялось - и в скрипте и в просто в терминале.
Почему вы думаете, что у Грепа (у к-рого, кстати, три разных режима с разным синтаксисом) и у Гавка надо экранировать одни и те же синтаксические эл-ты?
 
> неужто правильно все выдал
Должен. ;-) Я его, по крайней мере, на нескольких реальных тройках ГРНТИ—УДК—ВАК проверял.
 
> Почему для каждой строки мы заново считаем i%=n и i++
Я даже не знаю, как объяснить... То, что i в бесконечном цикле вида { i%=n; i++ } принимает значения: 0, 1, 2, ..., n-2, n-1, 0, 1, ..., n-1, 0, ... — понятно?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
То, что i в бесконечном цикле вида { i%=n; i++ } принимает значения: 0, 1, 2, ..., n-2, n-1, 0, 1, ..., n-1, 0, ... — понятно?
не совсем))) До какого числа будет расти i? до n??? Т.е. в нашем конкретном случае это выливается в 0,1,2,1,0,1,2,1,0...??? Типа хитрый способ вместо if (i==2) i=0 else i++???
Вопрос был более обширный) Я не понимаю мы что ли для каждой строки с ВАК просматриваем n строк выше для поиска строки с номером ГРНТИ?
Ваще мне интересно откуда у вас такие идеи с t=(i+j)%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 | Отправлено: 15:18 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> 0,1,2,1,0,1,2,1,0
Да.
 
> типа хитрый способ вместо if (i==2) i=0 else i++???  
Нет, это вот это с если-то-иначе — «способ через хитрое место», к тому же совершенно нерасширяемый (строго n=2).
 
> мы что ли для каждой строки с ВАК просматриваем n строк выше для поиска строки с номером ГРНТИ?  
Ну да, вы же сказали, что УДК у темы может не быть (и действительно, а никогда бы не подумал), поэтому просто взять энную назад от ваковского номера строку мы не можем, поэтому проверяем регэкспом.
 
Добавлено:
i здесь, кстати — лишняя сущность.
(a%n)%n == a%n жеж, поэтому можно просто номер строки использовать.
 
'/bar/{for (j=0; j<n; j++) {t=(NR+j)%n; if (s[t] ~ /foo/) print s[t]}; print} {s[NR%n]=$0}'

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

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



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

Цитата:
'/bar/{for (j=0; j<n; j++) {t=(NR+j)%n; if (s[t] ~ /foo/) print s[t]}; print} {s[NR%n]=$0}'

Цитата:
Ваще мне интересно откуда у вас такие идеи  
С каждым разом всё больше прусь... Прочитать готовый скрипт не большая проблема (если синтаксис знаешь), но как допереть до такого с нуля я хз...

----------
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 | Отправлено: 17:08 08-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
мб вы снимите завесу тайны с моего самого первого вопроса? Как в цикле for организовать нормальное построчное чтение?
 
Добавлено:
Мучения продолжаются) Можно как-то оптимизировать мать что я придумал?
awk '{gsub(/\./,"0",$1); print}' grnti/grnti.txt | sed 's/\([[:digit:]]\{2,8\}\)[[:space:]]*\(.*\)/(0\1,"\2"),/g; $s/\(.*\),$/\1;/g' >> "$dstfolder/grnti.sql"

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> мб вы снимите завесу тайны с моего самого первого вопроса?
> Как в цикле for организовать нормальное построчное чтение?  
На Баше?
 
> Можно как-то оптимизировать мать что я придумал?  
> awk '{gsub(/\./,"0",$1); print}' grnti/grnti.txt | sed 's/\([[:digit:]]\{2,8\}\)[[:space:]]*\(.*\)/(0\1,"\2"),/g; $s/\(.*\),$/\1;/g' >> "$dstfolder/grnti.sql"
Не думаю. Связки вида Гавк + Сед через пайп мало поддаются оптимизации, бо представляют собой разновидность write-only кода. ;-) Только переписыванию заново.
 
Что это штука должна делать?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
На Баше?  
ну bash или zsh - судя по всему я и так и так пробовал... т.к. скрипт #!/bin/bash а терминал у меня zsh...
Цитата:
Что это штука должна делать?
добавляет 0 в начало строки
заменяет точки между цифрами (в номере) на 0
превращает в sql удобоваримую форму - (номер, "текст"),
и в последней строке меняет запятую на точку с запятой
 
awk тут только потому, что я не знаю как на sed заменить точку только в первом столбце... Точнее смутновато представляю - но извращаться так не хочется (когда на awk это в пол действия)

----------
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:56 08-06-2011 | Исправлено: Alukardd, 20:58 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> добавляет <...> с запятой
И все это работает? А от меня требуется переписать это более читабельно?
Тогда без алгоритма: какой формат на входе и какой на выходе? На примере.
 
> Как в цикле for организовать нормальное построчное чтение?  
> ну bash или zsh
А что в итоге требуется-то? Обойтись без Авка — это более чем странная цель. Авк скорее будет на машине, чем Баш.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
А что в итоге требуется-то? Обойтись без Авка — это более чем странная цель. Авк скорее будет на машине, чем Баш.
таких задач не ставилось - уже спортивный интерес просто))) мб дело в том, что я скрипт запускаю из под zsh? Надо будет без него проверить... (пока руки не дошли)
Цитата:
И все это работает? А от меня требуется переписать это более читабельно?
Тогда без алгоритма: какой формат на входе и какой на выходе? На примере.  
угу работает) Вход:
00.08 Общественные науки и идеология
Выход:
(000008,"Общественные науки и идеология"), - в последней строке в конце ; вместо ,
 
И я тут еще одно чудо написал - тоже работает)))
awk --re-interval '/УДК/{gsub($1." ",""); gsub(";",""); for(i=1;i<=NF;i++){ print "("s", \""$i"\"),"}} {gsub(/\./,"0",$1); s="0"$1}' grnti/grnti-udk.txt | sed '$s/\(.*\),$/\1;/g'
Вход:
00.08 Общественные науки и идеология
УДК 3; 32.019.52

Выход:
(000008, "3"),
(000008, "32.019.52"),
последняя строчка так же должна иметь ; вместо ,
 
p.s. Я уже скоро буду смущаться Вас что-то спрашивать))) 3-е сутки мучаю галиматьей....

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> угу работает)
Тут едва ли можно более красиво написать. Разве что чуточку:
 
$ gawk '{
    match ($0, /([.0-9]*)[[:space:]]*([[:alnum:] ]*)/, s);
    gsub (/\./,"0",s[1]);            
    printf ("%s0%s %s", NR==1 ? "" : ",\n", s[1], s[2]);
    }  
    END{ print ";" }' grnti/grnti.txt

 
Основная проблема — с точкой с запятой. Определить, что текущая запись в потоке последняя не забегая вперед же принципиально невозможно. Если в Седе это «забегание» реализовали и имеется псевдономер $, то в Авке такого нет.  
В общем, сами все видите, что пришлось сделать.
 
> добавляет 0 в начало строки  
А зачем это, если не секрет?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
добавляет 0 в начало строки  
А зачем это, если не секрет?
Нам нужно превратить "сотичную систему рубрикатора в "тысячную" таким образом добавляем 0 ко всем разделам. Так мы сможем добавлять свои подпункты и деления за счет старшего разряда - ставя например туда 1 и при этом все точно будем знать что из это "самопал"...
Вы же заметили, что разделительные точки мы тоже не удаляли, а на 0 меняли...
 
Хм... Кажется вы не привели это к sql виду... Скобки и разделитель запятая...
 
Ладно оставим как есть, с комбинацией awk и sed.
 
У меня щас косяк и хз пока как решить. С ВАК'ами есть заморочка Надо либо отрезать в строке с ВАК если находим См. до ближайшей точки с запятой, либо реально "смотреть", т.е. искать пункт на который ссылается и брать номера и от туда и так возможна и рекурсия.
2-ой вариант реально запарный так что пока надо просто отрезать См., но как это сделать в awk я хз - а получается так, что надо сделать посреди сценария...
 
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 | Отправлено: 23:37 08-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