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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> # awk -v FS='' '{r($1) }' test
Ну и что это, позвольте узнать, за '{r($1) }'?
 
Добавлено:
Впрочем, если бы дело было только в этой фигне, которую вы невесть откуда взяли, то ошибка была бы другая — awk: cmd. line:1: (FILENAME=../test FNR=1) fatal: function `r' not defined
 
А здесь дело, по-видимому, в том, что я опрометчиво положил, что любая строка обязательно содержит первый символ, когда у вас там есть и пустые. Нужна проверка:
 
$ awk -v FS='' '$1 { print >> tolower($1) }' yourfile

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:04 05-12-2012 | Исправлено: ASE_DAG, 18:20 05-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
'{r($1) }'?  это так с терминала скопировал некорректно.
 
Большое спасибо! Скрипт работает только счас допилить попробую чтоб он только [a-zA-Z0-9] раскидывал (а все остальное в один файл) и не вылетал когда точку встречает awk: (FILENAME=test FNR=4516) fatal: can't redirect to `.' (Is a directory)

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 22:43 05-12-2012 | Исправлено: Krist, 22:45 05-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Цитата:
счас допилить попробую
awk -v FS='' '/^[a-zA-Z0-9]/{ print >> tolower($1) }' yourfile
Правда, я хз как Вы смотрите на то, что остальные строки будут потеряны, например те что начинаются с точки.

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

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 22:47 05-12-2012
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый вечер Alukardd
Прошу прощения, а чем плохо решение типа ?
awk -v FS='' '/^[a-zA-Z0-9]/{ print >> tolower($1) } ; !/^[a-zA-Z0-9]/{ print >> "@" }' yourfile

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 23:21 05-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо за помощь
добавил в хвост grep -E "^[^a-zA-Z0-9].*" test > other (не видел предыдущего сообщения когда писал это)
 
Только почему-то я думал что в [a-zA-Z0-9] входит только английские буквы, а он раскидал еще и остальные, которых очень мало. Пробовал awk -v FS='' '/^\p{L}/{ print >> tolower($1) } ; !/^\p{L}/{ print >> "@" }' не получается.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:21 05-12-2012 | Исправлено: Krist, 00:04 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Ну потому что формулируя задачу надо изъясняться чётко, что на выходе, а что на входе.

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

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 23:25 05-12-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> почему-то я думал что в [a-zA-Z0-9] входит только английские буквы
Да, в [a-zA-Z0-9] должны входить только 26 букв обоих регистров и десять цифр, вне зависимости от локали. У вас не так?
 
Покажите
$ awk -v RS=' ' -v FS='' '$1 ~ /[a-zA-Z0-9]/' <<< 'a z b &#228; ф'
 
Добавлено:
Гребаный Руборд! &#228; — это а-умляут.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Кстати, весьма не ожидал такого вывода, я думал что это цельный символ, а он идёт как символ "a" с дополнением и проходит фильтр. Печально.

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

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 10:17 06-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
awk -v RS=' ' -v
FS='' '$1 ~ /[a-zA-Z0-9]/' <<< 'a z b&#8200;&#228;&#8200;ф'
a
z
b&#8200;&#228;&#8200;ф
 
вот так получилось  
 
Добавляю. Не так получилось а получились те же символы что и на вводе. Локаль US.UTF-8.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 14:21 06-12-2012 | Исправлено: Krist, 14:44 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
А "ф"-то каким макаром пролезла?
И почему у Вас вечно изменяется конструкция откуда эти u2008 символы взялись вместо стандартных пробелов?

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

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 16:24 06-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В терминале все отображалось корректно и при копировании в текстовом редакторе перед отправкой сюда тоже и в форме поста корректно, все символы появились здесь.
 
ф это с предложенной Вами команды в посте от 08:22 06-12-2012

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 16:37 06-12-2012 | Исправлено: Krist, 16:54 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Во-первых, пост не мой, а т. ASE_DAG.
Во-вторых, недоумение по поводу "ф" вызывает вывод, а не входная строка.
 
Добавлено:
Кстати, mawk отработал более правильно на мой взгляд. Он не пропустил буквы с "загогулинами".
Причём ключ -W posix на результате не сказывается...

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

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 18:18 06-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое спасибо всем за участие! С mawk все работает.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 19:19 06-12-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, где ошибка. Вот такой скрипт не хочет работать:

Код:
#!/bin/bash
for NAME in * ; do
catdoc "$NAME" > "$NAME.txt"
 if [[ `file -b "$NAME"` == directory ]]; then
 cd "$NAME"
 "$0"
 cd ..
 fi
done

catdoc - конвертор из *doc в *.txt
Особенность - имена файлов русскими буквами и с пробелами.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:53 06-12-2012 | Исправлено: Maximus777, 22:27 06-12-2012
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, Maximus777

Код:
 
#!/bin/bash  
MyScript=`readlink -f $0`
for NAME in * ; do  
 if [[ `file -b "$NAME"` == directory ]]; then  
 cd "$NAME"  
 "$MyScript"
 cd ..  
 else catdoc "$NAME" > "$NAME.txt"  
 fi  
done
 

или  

Код:
 
IFS=$'\n'; for i in `find . -type f -name "*"`; do catdoc "$i" > "$i.txt"; done
 

Объяснить, к сожалению, не могу.

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 22:29 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Цитата:
`file -b "$NAME"` == directory
во-первых, вместо ``, лучше использовать $().
Во-вторых, это полный извратif [[ -d "$NAME" ]]; then, за справкой, man bash или man test, почему "или" читать в man bash.
 
А что хоть за ошибку выдаёт?
 
А вообще всё это я не пойму к чему, да ещё и с рекурсией скрипта, что противопоказано!
 
find /your/folder/with/docs -type f -exec sh -c 'catdoc "{}" > "{}.txt"' \;
 
Добавлено:
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 22:43 06-12-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_PiggyСпасибо. Воспользовался вторым вариантом. Там всё более менее понятно, кроме:
IFS=$'\n';

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:45 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Это изменение разделителя записей во входном потоке — утилита find выдает по записи на строку, а по умолчанию for ждёт пробел, а не перевод строки.
НО это как я написал find сам всё может обработать.

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

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 22:46 06-12-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
find /your/folder/with/docs -type f -exec sh -c 'catdoc "{}" > "{}.txt"' \;

О! Это вообще Дзен! А что значит "sh -c"? В двух словах, если не трудно. В смысле ясно, что запуск команды, но почему -exec недостаточно?
 
За советы спасибо. Постараюсь запомнить. В итоге вот такую оставил команду:

Код:
find . -type f  -exec sh -c 'catdoc "{}" > "{}.txt"' \;

Всё переколбасилось отлично. Но "sh -c" для меня слишком замудрённое. И man sh ситуацию не сильно прояснил.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:51 06-12-2012 | Исправлено: Maximus777, 23:15 06-12-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
> почему -exec недостаточно?
Потому что перенаправление вывода (>) — функционал шелла, а -exec запускает исполняемый файл, указанный аргументом, непосредственно (не в шелле).

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:08 07-12-2012
Открыть новую тему     Написать ответ в эту тему

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