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

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

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

 

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

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

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

Благодарю за разъяснение. Теперь всё понятно.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Коллеги, а как можно работать в tcsh с файлами,  имена которых содержат пробел? В bash`е IFS достаточно подправить и можно работать. А что делать с tcsh ума не приложу. Там этой переменной нема.

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 21:31 29-12-2012
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:37 29-12-2012
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Прошу прощения за суточное молчание, но тут выяснилось досадное недоразумение. В сборке где я хотел поставить этот эксперимент нет команды for. А предлагать скрипт написанный под башем мне кажется не совсем корректным.

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 00:21 31-12-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
> предлагать скрипт написанный под башем мне кажется не совсем корректным
Есть мнения [1] [2], что некорректно вообще писать скрипты на Си-шелле.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:24 31-12-2012
urodliv



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

Цитата:
Есть мнения [1] [2], что некорректно вообще писать скрипты на Си-шелле.

Мнение поддерживаю, но не в силу своих выдающихся знаний, а токмо по лености переучивания. Беда в другом. Иногда приходится выбирать (по собственной лености/тупости) уже готовые дистрибутивы. А их авторы не всегда разделяют подобные мнения.

Цитата:
Поясните, что вы такое работаете с файлами, что кавычки не спасают.

Разрешите вам не отвечать на этот вопрос, ибо придётся приводить свой код, за который мне уже стыдно.

----------
Очень скоро еда станет совершенно безвкусной, и тогда этот недостаток придётся компенсировать хорошо развитым воображением.

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 12:29 01-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
> готовые дистрибутивы. А их авторы не всегда разделяют подобные мнения.
Забавно, не встречал таких, что, впрочем, неудивительно — за пределами ГНУ я сталкивался только с FreeBSD, и то очень поверхностно. В общем, покажите, пожалуйста, пальцем в тот дистрибутив, где системообразующие скрипты написаны на Си-шелле — это мне для общего развития.
А вас все-таки никто не обязывает вас писать на нем же, благо борн-совместимый шелл просто обязан быть в любой юникс-подобной системе под именем /bin/sh.
 
> Разрешите вам не отвечать на этот вопрос
Да пожалуйста. Просто в таком случае, я, увы, никак не смогу ответить на ваш вопрос по существу.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:44 01-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть база текстовая:
april
april aleksey
april boris
april boris aleksey
april boris sanya
april victor
april victor sanya aleksey
april victor vanya  
april zhenya
april zina aleksey
april zina boris
december boris zina vasya
may aleksey victor
may boris
may boris aleksey zhenya
may boris zina
may zhenya
may zina victor aleksey boris
may zina victor boris aleksey
october  
october vasya
из этой предварительно отсортированной базы нужно извлечь название месяца и три полностью рандомных строчки с этого месяца. На AWK написал следующий скрипт:

Код:
BEGIN {vari="none";FS=" "; c=0; }
$1!~/[\)\(]/ {if ($1~vari)  
        {arr[c]=$0;
        if (c<500) {c=c+1} else {c=c+0}; #c-number of rezov v pamyat' pri obrabotke
        vari=$1}
 else  
        {
        if (c>1) {print vari};
        k=3; n=c; srand (); #k-number of rezov s mesyaca  
        for (i = 0; n > 0; i++)   if (rand() < k/n--) { print arr[i]; k--;} ;
        delete arr;  
        c=1; vari=$1;arr[0]=$0  
         }    
}  

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

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 21:49 08-01-2013 | Исправлено: Krist, 22:03 08-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что значит "полностью рандомные строчки" ?
Какие именно 3 строки с разными кол-вами столбцов необходимо вывести? Первые попавшиеся?

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 22:46 08-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
"полностью рандомные "в случае старого скрипта можно "полностью' опустить.  
По 3 строкам с разными кол-
вами столбцов я имел ввиду что например собрать массивы с 1, 2, 3-мя  (максимум 3 стобца, больше все в 1 массив). столбцами, затем из этих массивов выбрать по одной случайной строке из каждого и среди них 3случайных строки. Т.е. не первые попавшиеся а случайные.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:57 08-01-2013 | Исправлено: Krist, 00:30 09-01-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Ух, как тяжко мне даются такие скрипты... Всю голову сломал пока просчитал как цикл надо сделать, плюс синтаксические ошибки... Жесть в общем.
Результат выглядит так:
Код:
#!/usr/bin/gawk -f
{
  while ($1 == month)
  {
    switch (NF-1)
    {    
      case 1: w1[++i]=$0; break
      case 2: w2[++j]=$0; break
      case 3: w3[++k]=$0; break
    }    
    if (getline == 0)
      break
    if ($0 == "")  
      next
  }
  print "*"toupper(month)"*"
  month=$1
  srand()
  if (length(w1))
    print w1[int(1+rand()*i)]
  if (length(w2))
    print w2[int(1+rand()*j)]
  if (length(w3))
    print w3[int(1+rand()*k)]
  delete w1
  delete w2
  delete w3
  i=j=k=0
  switch (NF-1)
  {
    case 1: w1[++i]=$0; break
    case 2: w2[++j]=$0; break
    case 3: w3[++k]=$0; break
  }
}
Код не самый красивый, зато на сколько смог проверить рабочий. Так же, на всякий, добавил защиту от пустых строк.

----------
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 | Отправлено: 17:21 09-01-2013 | Исправлено: Alukardd, 17:26 09-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ого, попробовал, работает! Спасибо большое. Я таких операторов в примерах не видел, пойду читать мануалы, что да как.  
Сила руборда forever.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 20:08 09-01-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Всегда пожалуйста. Можно навести некую красоту, конечно... Например, вынести дублирующийся switch в функцию.

----------
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 | Отправлено: 21:38 09-01-2013 | Исправлено: Alukardd, 21:38 09-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну не знаю, как по мне, можно поступить проще (к тому же gawk-а у меня в базе нет ни в Дебиане, ни во ФриБСД...):

Код:
 
mas_i="`grep -v " " vhod`"
echo "${mas_i}"
echo
mas_j="`grep -E "^[a-z]* [a-z]*$" vhod`"
echo "${mas_j}"
echo
mas_k="`grep -E "^[a-z]* [a-z]* [a-z]*$" vhod`"
echo "${mas_k}"
echo
echo "  Random strings:"
get_random_str "${mas_i}"
get_random_str "${mas_j}"
get_random_str "${mas_k}"
 

Функция get_random_str :
под bash и если нет утилиты jot

Код:
get_random_str()
{
  a=`echo "${1}" | wc -l | tr -d " "`
  a=($a+1)
  number=${RANDOM}
  let "number %= ${a}"
  [ ${number} -eq 0 ] && number=1
  echo "${1}" | sed -n "${number}p"
}
 

Если есть утилита jot (по умолчанию есть во ФриБСД, например)

Код:
 
get_random_str()
{
  a=`echo "${1}" | wc -l | tr -d " "`
  number=`jot -r 1 1 ${a}`
  echo "${1}" | sed -n "${number}p"
}
 

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 00:00 10-01-2013 | Исправлено: kpp77, 00:10 10-01-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Во-первых, я вроде ни чего специфичного для gawk не использовал, так что это обычный awk.
Во-вторых, в чём проблема установить gawk? Что в портах фри, что в репах дебиана лежит ждёт пока его накатят.
В-третьих, разбирать строку grep'ом это жесть, к тому же на переключении между утилитами (bash, sed, grep) получается огромный overhead. Если сравнить производительность на исходном файле хотя бы в 10Мб, то ой как разница будет видна...
 
И самое главное, у Вас не законченное, не корректное относительно условия решение. У вас нету разбивки по месяцам. Вы не внимательно читали изначальный пост вопрошающего.
 
Кстати, Вы ещё почему-то ограничили имена только буквами ([a-z]), да ещё и маленькими, тогда уж grep -i?
Дальше, использовать квантификатор * тут не особо умно, т.к. 2-ой пробел даст ложные срабатывания, а тройной так вообще всё испортит, я уже не говорю о trailing space, который далеко не редкость.
 
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:29 10-01-2013 | Исправлено: Alukardd, 00:35 10-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Упаси Боже к чему-то или к кому-то придираться. (Где Вы заметили придирки?)
Это всего-лишь еще один вариант решения.
Ведь в программировании основная мощь - множество вариантов решения одной задачи.  
В моем дистрибутиве ФриБСД Ваш вариант в чистом виде не заработал.
Разбираюсь почему.
Согласен, что правильно понятое условие задачи - 50% решения.
Про разбивку по месяцам в задании не наблюдаю...
Условия, в которых скрипт должен выполнять свою работу, могут быть разные, очень разные.
Насчет "то, что Вы на писали совсем ни куда не годится" - и меня еще кто-то упрекает в придирках?

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 02:15 10-01-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Цитата:
Где Вы заметили придирки?
это я про мои придирки к Вашему коду, помимо адекватных замечаний.
Цитата:
Про разбивку по месяцам в задании не наблюдаю

Цитата:
из этой предварительно отсортированной базы нужно извлечь название месяца и три полностью рандомных строчки с этого месяца


----------
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 | Отправлено: 11:33 10-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Новое условие разве не начинается после фразы:
Цитата:
однако с течением времени задача поменялась и не в лучшую сторону.
?
А затем уточнение условия:
Цитата:
"полностью рандомные "в случае старого скрипта можно "полностью' опустить.  
По 3 строкам с разными кол-  
вами столбцов я имел ввиду что например собрать массивы с 1, 2, 3-мя  (максимум 3 стобца, больше все в 1 массив). столбцами, затем из этих массивов выбрать по одной случайной строке из каждого и среди них 3случайных строки. Т.е. не первые попавшиеся а случайные.

Ограничения [a-z] и одним пробелом внесены исходя из предоставленного условия.
При наличии более точной постановки задачи (набор возможных символов, разделитель полей, объем текстовой базы, окружение выполнения и т.д.) всегда можно доработать или переработать скрипт.
 
Версия awk во FreeBSD не понимает конструкцию switch, переделал на if-ы, тестирую.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:20 10-01-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Цитата:
Ограничения [a-z] и одним пробелом внесены исходя из предоставленного условия.  
вижу только фразу про количество столбцов, на что я тоже завязал свой код. Ни слова про то что там только буквы, причём только в нижнем регистре. И тем более ни слова про то, что разделитель именно одиночный пробел. И как я уже упомянул, пробел в конце строки так же не даст вашему скрипту работать корректно.
 
Действительно во фре даже с gawk'ом он отказался понимать switch, т.к. бинарный пакет, который я поставил через pkg собран без опции --enable-switch, в отличии от аналогичного в Debian. Собственно собрал из портов с нужней опцией, всё завелось. Правда пришлось предварительно ещё массивы инициализировать, хз почему он этого требовал.

----------
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:19 10-01-2013 | Исправлено: Alukardd, 13:22 10-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если нужна разбивка по месяцам:

Код:
# разделитель полей
rz=" "
# набор допустимых символов в полях
nabor="a-z"
# кол-во строк
kol_str="1 2 3"
 
sort -u +0 -1 file_name |\
while read month mes
do
  echo "*${month}*"
  for i in ${kol_str}
  do
    mas="`grep -E "^${month}(${rz}[${rz}]*[${nabor}]*){${i}}$" file_name`"
    [ -n "${mas}" ] && get_random_str "${mas}"
  done
done
 

 
Добавлено:

Цитата:
Ни слова про то что там только буквы

В условии приведена текстовая база, из которой явно следует: буквы в нижнем регистре и одиночный пробел.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 13:24 10-01-2013 | Исправлено: kpp77, 13:30 10-01-2013
Открыть новую тему     Написать ответ в эту тему

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