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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> ключ s
Ключ s расширяет диапазон удовлетворяющих точке символов на перевод строки, не более.
$ perl -e '$_ = "A\nB\n"; print if /A.B/'
$
$ perl -e '$_ = "A\nB\n"; print if /A.B/s'
A
B
$

 
> Но почему же оно не работает
Потому, что при ключе -n файл читается в анализируемую переменную $_ построчно.
 
> пример работает отлично :-)
Вот и славно. :-)
 
> а тут не совсем :-(
А что именно не понятно?

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

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

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

Код:
 

Цитата:
 
#!/usr/bin/gawk -f  
 BEGIN {  
     FILELIST="/home/alukardd/script/8975/base.txt"  
     RS=",\n";  
     FS="_";  
     while (getline < FILELIST) {  
         files[$1]=$0;  
     }  
     RS="\n";  
     FS=";";  
     OFS=";";  
 }  
 /[[:digit:]]{6,9}/{  
       print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");  
 }
 

 

 
Поставил xls2csv, чтобы он сразу из xls делал csv, так он каждую ячейку заключил в кавычки и все, скрипт не работает. В каком месте исправить?

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 22:30 12-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
#!/usr/bin/gawk -f  
 BEGIN {  
     FILELIST="/home/alukardd/script/8975/base.txt"  
     RS=",\n";  
     FS="_";  
     while (getline < FILELIST) {  
         files[$1]=$0;  
     }  
     RS="\n";  
     FS=";";  
     OFS=";";  
 }  
 /[[:digit:]]{6,9}/{
       last=gsub(/\"/,"",$NF);
       print ($0, last in files ? files[last] : "E: FILE " last " NOT FOUND");  
 }

 
Не проверял, но как вариант, так должно работать...

----------
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:40 12-09-2011 | Исправлено: Alukardd, 23:41 12-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не хочет. в последнем варианте не убирает лишние строки (верхние и ненужные ;;;"ИТОГО";"10";).
xls2csv делает вот так:

Код:
 
"10:10";" ";"ролик";"природа";"30";"123456"
 

Интересно, кто делает неправильные csv, ОО или xls2csv. OO слова без пробелов при экспорте не заключает в кавычки.
Появилась еще одна проблема: программа, которая импортирует конечный csv хочет чтобы первая колонка, в которой указанно время содержалось только в первой строке, остальные строки, где время дублируется были пустыми. Вот так:

Код:
 
"10:10";" ";"ролик";"природа";"30";"123456"
"";" ";"ролик2";"природа2";"10";"123457"
"";" ";"ролик3";"природа3";"20";"123458"
"18:00";" ";"ролик";"природа";"30";"123456"
"";" ";"ролик2";"природа2";"10";"123457"
"";" ";"ролик3";"природа3";"20";"123458"
 


Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 09:48 13-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
Не хочет. в последнем варианте не убирает лишние строки (верхние и ненужные ;;;"ИТОГО";"10";).  
так кавычки он номр обработал? Вопрос только про верхние и ненужные?
Цитата:
остальные строки, где время дублируется были пустыми.
щас допишем...

----------
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 | Отправлено: 11:20 13-09-2011
digital422

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

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 12:09 13-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да понял уже. Я криво написал... И вообще хз зачем их отрабатывать - и так пашет - ему побоку на них:
Код:
#!/usr/bin/gawk -f
BEGIN {
    FILELIST="/home/alukardd/script/8975/base.txt"
    RS=",\r\n";
    FS="_";
    while (getline < FILELIST) {
        files[$1]=$0;
    }
    RS="\r\n";
    FS=";";
    OFS=";";
}
/[[:digit:]]{6,9}/{
      if ($1 == time)
          print ("",$2,$3,$4,$5,$6, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
      else {
          print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
        time = $1;
      }
}
у меня это работает с csv у которого последнее поле(номер) в кавычках... если очень хотите то можете добавить строку gsub(/"/,"",$NF); перед if'ом.

----------
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 | Отправлено: 12:18 13-09-2011 | Исправлено: Alukardd, 12:19 13-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день
Подскажите пожалуйста, может кто сталкивался (понимаю, что не совсем по теме но более подходящую не нашел)
Sed 4.2.1 (и 4.2) при попытке запуска в WinXP, WinXP+MSYS, иногда Win98 строкой вида  
sed -e '/regexp/d' filename.txt  
выдает ошибку  
-e expression #1 char 2: extra characters after command
При этом нормально работает если пробовать запускать тот же скрипт через
1) '-f' (но для .configure не годится)
2) sed -e '\/regexp/d' filename.txt (но вручную править configure и makefile.in перед компиляцией долго и не всегда удобно).  
Это блажь системы или Sed?
Заранее благодарю.
 
 
 

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 12:24 13-09-2011
Alukardd



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

----------
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 | Отправлено: 12:37 13-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
Спасибо за ответ и совет, но, к сожалению, в приведенной ниже последовательности команд это помогает мало (кусок makefile из Wget).

Код:
 
    $(AM_V_GEN)rm -f $@-t $@ && \
    { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
      sed -e 's|@''GUARD_PREFIX''@|GL|g' \
          -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
          -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
          -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
          -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
          -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
          -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
          -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
          -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
          -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
          -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
          -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
          -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
          -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
          -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
          -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
          -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
          < $(srcdir)/fcntl.in.h; \
    } > $@-t && \
    mv $@-t $@
 


Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 13:06 13-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - 3 строчки кода, а сколько времени экономится. У меня тоже работает, отдаю на тестирование.
 
Что надо сделать чтобы добавлять строки и изменять в них значение ?
так есть:

Код:
 
"10:10";"ролик";"природа";"30";"123456"  
"";" ";"ролик2";"природа2";"10";"123457"
 

надо сделать так:

Код:
 
"10:10";" ";"";"";"";""  
"";" ";"ролик";"природа";"30";"123456"  
"";" ";"ролик2";"природа2";"10";"123457"
 

 
И еще одна проблема нарисовалась. При импорте csv в программу запускается механизм поиска локальных файлов в папках и происходит он очень долго. Поэтому файл базы я привел к реальному виду:
h:\sound\rolik1\123122769_rolik1_july-10.mp3

Код:
 
find $PATH_BASE -type f -printf "%p\n" | sed -e 's/\/data\/home\/sound-base\/efir/h:\/sound/g' | sed -e 's/\//\\/g' | sort -n
 

и само собой скрипт не видит этих имен. Подозреваю что надо исправить в FS="_"; ?

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 13:44 13-09-2011 | Исправлено: digital422, 07:25 14-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Ну еще если вы запускаете это в винде, я не уверен что в качестве разделителя можно использовать прямой слеш (/), тильду (~), двоеточие (:), подчерк (_) и думаю еще кучу всего.


----------
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 | Отправлено: 16:34 13-09-2011 | Исправлено: Alukardd, 16:38 13-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
> Win
> sed -e '/regexp/d' filename.txt
А что в виндовом коминтерпретаторе означает одиночная кавычка? Я под Виндой как-то всегда использовал двойные:
 
>sed -e "/regexp/d" filename.txt
 
> makefile
Мэйкфайл же завязан не только на Сед, что вы еще установили? Не проще было взять Цигвин и не мучаться?
 
Alukardd
> ключик-то -e уберите... Он для вызова скрипта

Цитата:
      -e script, --expression=script
 
              add the script to the commands to be executed
 
      -f script-file, --file=script-file
 
              add the contents of script-file to the commands to be executed

Откуда цитата, догадываетесь? ;-)
 
 
> я не уверен что в качестве разделителя можно использовать прямой слеш (/), тильду (~), двоеточие (:), подчерк (_) и думаю еще кучу всего
Почему?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:53 13-09-2011 | Исправлено: ASE_DAG, 17:02 13-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Я не так написал)))
Хотел сказать, что заменить прямой слэш, на перечисленное далее...

Цитата:
догадываетесь?  
да сам читаю его переодически))) ну в любом случае, для одной операции ключ не требуется... Да и более чем одну можно через ; выполнить.

----------
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:22 13-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасибо
ASE_DAG
>А что в виндовом коминтерпретаторе означает одиночная кавычка?
I'm sorry. В cmd.exe не используется одинарная кавычка. Набрал на автомате. С двойной та же беда. (А в bash, который из MSYS, одинарные используются)
 
 >>makefile  
 >Мэйкфайл же завязан не только на Сед, что вы еще установили? Не проще было взять Цигвин и не мучаться?
Когда-то я думал, что поставлю себе MinGW32+MSYS и не буду мучатся... Считал, что MSYS и Cygwin - аналоги. Ошибался?
И самое неприятное  
1) после "sed -i -e "s|-e '\/|-e '\\\/|g" Makefile.in" 90% что заработает ( правда, может еще нужно будет поискать пропущенные.)
2) на ноуте на Viste и XP все работает нормально.
 
Alukardd
Прошу прощения, привычка ремонтника - для диагностики находить минимальное состояние, при котором проявляется ошибка. В одной строке действительно другие разделители использовать можно. А я пытаюсь добится состояния "скачал и собрал" - в смысле, что бы по "tar xvzf program.tar.gz&&cd program&&./configure&&make" получать готовый бинарник.
Кстати, ради интереса проверил - со всеми перечисленными Вами разделителями sed работает правильно.

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 18:53 13-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
> С двойной та же беда.
Без конкретных примеров, скорее всего, ничего более сказать не смогу. Может быть у вас там все регэкспы с циркумфлекса (^) начинаются, например, а я этого не вижу.
 
> что MSYS и Cygwin - аналоги
Безусловно, аналоги.
 
> я пытаюсь добится состояния "скачал и собрал" - в смысле, что бы по "tar xvzf program.tar.gz&&cd program&&./configure&&make" получать готовый бинарник
Поставьте Цигвин и собирайте под него. ;-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:09 13-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
> Без конкретных примеров, скорее всего, ничего более сказать не смогу. Может быть у вас там все регэкспы с циркумфлекса (^) начинаются, например, а я этого не вижу.
Вроде как уже приводил (на пару постов выше)?. Выдает ошибку "-e expression #15 char 2: extra characters after command". Если надо, завтра сброшу лог configure и make -debug от Wget 1.13.3.
Скорее всего буду или Cygwin ставить или MinGW обновлять.
 
Спасибо Вам и Alukardd за участие.
P.S. А кстати, при чем здесь "^"? Сколько помню, он и без двойных кавычек нормально обрабатывается...
 

Всего записей: 1906 | Зарегистр. 07-08-2002 | Отправлено: 20:43 13-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Данный скрипт берез из файла (/home/alukardd/script/8975/base.txt) значение в виде:
123456789_rolik1_0-10.mp3,
132456789_rolik2_3-15.mp3 и т.д.

Код:
 
#!/usr/bin/gawk -f  
 BEGIN {  
     FILELIST="/home/alukardd/script/8975/base.txt"  
     RS=",\r\n";  
     FS="_";  
     while (getline < FILELIST) {  
         files[$1]=$0;  
     }  
     RS="\r\n";  
     FS=";";  
     OFS=";";  
 }  
 /[[:digit:]]{6,9}/{  
       if ($1 == time)  
           print ("",$2,$3,$4,$5,$6, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");  
       else {  
           print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");  
         time = $1;  
       }  
 }
 

Как его изменить, чтобы он понимал строки в таком виде:
h:\sound\rolik1\123122769_rolik1_july-10.mp3,
h:\sound\rolik2\123122769_rolik2_july-15.mp3 и т.д.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 20:11 14-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Да видел я ваш вопрос с первого раза... только вот без дополнительных приблуд я хз как это сделать в awk.
 
Добавлено:
Хотя вот решил:
Код:
    while (getline < FILELIST) {
        var=$0;
        gsub(/.*\\/,"",$1);
        files[$1]=var;
    }
замените тот while что у вас есть на этот...

----------
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:30 14-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Целый день сегодня пытался вникнуть в awk, безуспешно ).
Не получается с заменой while, строка выдается (после ID):
"123475796";E: FILE "123475796" NOT FOUND
Файл с базой на месте.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 21:52 14-09-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