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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Я не знаю что Вам надо сказать, что бы поняли, что пишите криво.
Думаю примера вывода будет достаточно...
Вот конечный скрипт, который я запускал.Вот один из его выводов. Очевидно что он косячный — 2 пустых октября, в апереле 2 строки с 2 именами. Причём косяк проявляется не всегда. Пытаться его отловить или нет, это уже как хотите...
Также, замечу, что использовать подстановку file_name в нескольких местах по скрипту вместо того что бы завести соответствующую переменную это ужасно. Читать её из параметров или нет, это другой вопрос, но переменная должна быть.
 
FreeBSD 8.2-RELEASE
GNU bash, version 4.1.9(0)-release (amd64-portbld-freebsd8.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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 14:23 10-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да есть недочет, для исправления:
строку
mas="`grep -E "^${month}(${rz}[${rz}]*[${nabor}]*){${i}}$" $filename`"
заменить на  
mas="`grep -E "^${month}(${rz}[${rz}]*[${nabor}][${nabor}]*){${i}}$" $filename`"
 
Добавлено:
Вариант на awk однозначно будет работать быстрее(по моим замерам - раза в 3-4), предлагаю свой вариант((по начальному условию) для предварительно отсортированной базы):

Код:
#!/usr/bin/awk -f
 {
   if($0!="") {
     if (month!=$1){
 
        if(month!=""){
           month=""
           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)]
        }
        month=$1
        print "*"toupper(month)"*"
        delete w1
        delete w2
        delete w3
        i=j=k=0
     }
     if((NF-1)==1)w1[++i]=$0;
     if((NF-1)==2)w2[++j]=$0;
     if((NF-1)==3)w3[++k]=$0;
   }
 }
 END {
      if(month!=""){
          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
       }
     }
 

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



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Bash
 
Есть файлы, с унифицированными именами, которые содержат числовую часть с порядковым номером: 01 02 ... 17 18 19... Мне надо бы получить номера тех файлов, которые отсутствуют в списке. То есть недостающих номеров в последовательности.
 
Family.Guy.s08e12.Rus.mp4

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 22:16 19-01-2013 | Исправлено: ntmu, 22:27 19-01-2013
urodliv



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

Цитата:
Family.Guy.s08e12.Rus.mp4

В вашем примере это какая часть?

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

Всего записей: 6684 | Зарегистр. 29-04-2009 | Отправлено: 22:30 19-01-2013
ntmu



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А вообще вот так лучше.
 Есть последовательность: 1 2 3 4 ...20 21 22.. Некоторые элементы отсутствуют. Как их получить с учётом того, что есть.
 
Добавлено:

Цитата:
В вашем примере это какая часть?

Да можно обе. Речь скорей всё таки о математике. Выдрать sed'ом я сумею.
 

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 22:31 19-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ntmu
1.Подготовить список файлов к сортировке.
2.Отсортировать список.
3.Либо с помощью AWK, либо с помощью цикла пройти по всему списку, сравнивая текущий номер с предыдущим.
 
Добавлено:
Или :
1.Подготовить список файлов.
2.Сформировать список всех возможных номеров.
3.Применить утилиту join для этих двух списков.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ntmu
проверка на отсутствующие серии:
ls -1 /path/to/Family.Guy-season/ > /tmp/listdir; for i in {01..22}; do if ! grep -i "E$i" /tmp/listdir > /dev/null; then echo $i; fi; done
 
Если у Вас ещё и сезоны в кучу и надо их вычленить то соответственно меняем E, на S и всё в поряде будет, ну и 22 соответственно тоже.

----------
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 | Отправлено: 02:43 20-01-2013
ntmu



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Замечательно. Спасибо и за алгоритмы и за решение.
Насчёт сезонов в кучу, с сезонами (S) пройдёт, а с эпизодами не очень.  

Код:
s08e12
s08e13
s08e14
s08e15
s08e16
s08e17
s08e18
s08e19
s08e21
s09e01
s09e02
s09e03
s09e04
s09e08
s09e10
s09e12
s09e13
s09e14
s09e15
s09e17
 

grep тут видимо покажет серии отсутствующие только для каждого сезона. Нужен второй цикл наверное.
Хотя я вообще переформулировал задачу.
Меня математика интересует. Есть простая арифметическая прогрессия с шагом 1(один). Как вывести отсутствующие члены?  
1 2 3 4 5 ...
1 3 6 10 15 ...
 
 

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 11:00 20-01-2013 | Исправлено: ntmu, 11:10 20-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ntmu
Вам математическая формула нужна?
Я, конечно, не математик, но сдается мне, что данную задачу сложно (если вообще возможно) записать  математической формулой.
А вот алгоритмически - пожалуйста:

Код:
# номер сезона
SEASON=$1
# кол-во серий в сезоне
PART_COUNT=$2
 
# любым удобным способом получаем список имеющихся файлов
ls -1 /path/to/Family.Guy-season/ > /tmp/listdir
# формирование списка всех возможных номеров
seq ${PART_COUNT} | sed 's/.*/s'${SEASON}'e&/' > /tmp/list_number
# подготовка списка файлов
sed -n 's/^.*\.\(s'${SEASON}'e[0-9][0-9]*\)/\1 &/p' /tmp/listdir > /tmp/list_number_ready
# объединить два списка, отобрать отсутствующие
join -a1 /tmp/list_number /tmp/list_number_ready | grep "^s${SEASON}e[0-9][0-9]*$"
 


Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:51 20-01-2013 | Исправлено: kpp77, 13:26 20-01-2013
ntmu



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

Цитата:
Вам математическая формула нужна?

Нет, формул не надо, я тоже не математик. Просто я имею в виду не нужны ни серии ни сезоны. Это новая задача с рядом чисел, в котором отсутствуют некоторые элементы. В общем в том что тут уже написали ответ содержится. Можно ставить галочку.

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 14:01 20-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
> данную задачу сложно (если вообще возможно) записать  математической формулой
Да ну? Если    — наше множество, а    — его наибольший элемент, то математически это записывается элементарно:
 
   
 
По-моему, это в школе проходят, только толку-то — в Баше функций для работы со множествами нет. Впрочем есть утилиты класса diff, но их использовать, скорее всего, будет менее удобно.
 
$ wdiff -3 -x '' -w '' <(echo {1..10}) <(echo 1 2 4 5 6 7 9 10)
 
======================================================================
 3
======================================================================
 8
======================================================================



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:30 20-01-2013 | Исправлено: ASE_DAG, 14:47 20-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ntmu
Если Вы имеете в виду некий универсальный механизм для решения подобных задач, то :
 

Код:
 # префикс
 PREFIX=$1
 # маска значения
 MASK_VAL="$2"
 # файл - список всех элементов
 SEQUENCE_FULL="$3"
 # файл - список имеющихся элементов в подготовленном виде (первый столбец в формате PREFIX_MASK,
 # разделитель - пробел)
 SEQUENCE_EXISTS="$4"
 
 PREFIX_MASK="${PREFIX}${MASK_VAL}"
 
 # объединить два списка, отобрать отсутствующие элементы
 join -a1 "${SEQUENCE_FULL}" "${SEQUENCE_EXIST}" | grep -i "^${PREFIX_MASK}$"
 


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



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

Цитата:
Если Вы имеете в виду некий универсальный механизм

Ну не думаю, вряд ли мне его где-то применять придётся.

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 20:32 20-01-2013
ntmu



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Внезапно скрипт показался очень нужным.
Family.Guy.s08e12.Rus..mp4   Family.Guy.s08e13.Rus..mp4   Family.Guy.s08e14.Rus..mp4   Family.Guy.s08e15.Rus..mp4   Family.Guy.s08e16.Rus..mp4   Family.Guy.s08e17.Rus..mp4   Family.Guy.s08e18.Rus..mp4   Family.Guy.s08e19.Rus..mp4   Family.Guy.s08e21.Rus..mp4   Family.Guy.s09e01.Rus..mp4   Family.Guy.s09e02.Rus..mp4   Family.Guy.s09e03.Rus..mp4   Family.Guy.s09e04.Rus..mp4   Family.Guy.s09e08.Rus..mp4   Family.Guy.s09e10.Rus..mp4   Family.Guy.s09e12.Rus..mp4   Family.Guy.s09e13.Rus..mp4    Futurama.s01e05.Rus.mp4   Futurama.s01e06.Rus.mp4   Futurama.s01e08.Rus.mp4   Futurama.s01e09.Rus.mp4   Futurama.s02e01.Rus.mp4   Futurama.s02e02.Rus.mp4   Futurama.s02e03.Rus.mp4   Futurama.s02e05.Rus.mp4   Futurama.s02e06.Rus.mp4   Futurama.s02e07.Rus.mp4   Futurama.s02e08.Rus.mp4   Futurama.s02e09.Rus.mp4   Futurama.s02e10.Rus.mp4   Futurama.s02e13.Rus.mp4   Futurama.s02e14.Rus.mp4   Futurama.s02e15.Rus.mp4   Futurama.s02e16.Rus.mp4   Futurama.s02e17.Rus.mp4   Futurama.s02e18.Rus.mp4

Условия уточняются всё более:
Скрипту не требуются никакие файлы-списки и зничения-маски. Он берёт вывод команды ls. Сам понимает какую часть надо брать в названии файлов. Сам определяет последнюю добытую серию для каждого сезона ($MAX_COUNT). И выдаёт результат в виде:  
S01: 3 7 9 10 14
S04: 1 5 9 10
S09: 7 8 12 13 20
SXX -- одним цветом, остальное --другим
 
За работу!

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 11:53 21-01-2013 | Исправлено: ntmu, 11:58 21-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ntmu
Вам пора определиться что нужно, что не нужно.
Практически все, для решения Вашей задачи есть выше.
Ваше "За работу!"  - это глубоко завуалированная просьба помочь?
Работы у меня хватает, а написание скриптов - это хобби - для души, так сказать.

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



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

Цитата:
Вам пора определиться что нужно, что не нужно.

Постепенно

Цитата:
Практически все, для решения Вашей задачи есть выше.

Но нет ниже

Цитата:
Ваше "За работу!"  - это глубоко завуалированная просьба помочь?

За работу!

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 12:34 21-01-2013
karavan



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

Цитата:
За работу!

Если человек просит о помощи, то ее оказывают.
А когда человек требует выполнить работу, то требование без озвучивания размера оплаты труда выглядит не более чем хамством.
Вперед на фриланс-форумы, ищи работников там.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 15:27 21-01-2013
ntmu



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan
Не могу не согласиться, справедливые замечания. Человек, оплата, ищи там...  
Вообще это как бы фигура моей обеднённой речи. За годы жизни в условиях суровой среды речь немножко деградировала и мысль всегда не такая получается, какой хочешь её донести. Скрипт по-вашему усмотрению разумеется.

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 17:04 21-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый я сегодня, но галочку поставил.
Единственный параметр скрипта - путь к файлам.
 

Код:
 
#!/bin/sh
#
# Description
# version 1
#
 
FILE_SOURCE="/tmp/listdir"
 
ls -1 "${1}" > "${FILE_SOURCE}"
 
sed -n 's/\(^.*\)\.s\([0-9][0-9]*\)e\([0-9][0-9]*\).*/\2 \3 \1/pi' "${FILE_SOURCE}" | sort +0n -1 +1nr -2 | sort -fud +2 -3 +0 -1 |\
while read NUM_SE PART_COUNT NAME_SE
do
  [ "${OLD_NAME}" != "${NAME_SE}" ] && echo "\033[37;1;41m${NAME_SE} \033[0m"
  OLD_NAME="${NAME_SE}"
  seq ${PART_COUNT} | sort > /tmp/list_number
  sed -n 's/^'${NAME_SE}'\.s'${NUM_SE}e'0*\([0-9][0-9]*\)/\1 &/pi' "${FILE_SOURCE}" | sort +0 -1 > /tmp/list_number_ready
  echo "\033[37;1;42m S${NUM_SE}[${PART_COUNT}]:\033[0m\c"
  join -a1 /tmp/list_number /tmp/list_number_ready | sed -n 's/^[0-9][0-9]*$/&/p' |\
   sort -n | awk '{out=out" "$1} END{if(out==""){print " All parts are present."}else{print out}}'
done
 
#rm "${FILE_SOURCE}" /tmp/list_number /tmp/list_number_ready
 

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 19:59 21-01-2013 | Исправлено: kpp77, 13:03 22-01-2013
ntmu



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, работает.  
Ставлю пятёрку.  
                           5
 
Только вот с этой директорией возникли проблемы почему то.
ls dir/
В качестве вариантов определяет только:
01 10 King.of.the.Hill
02 09 King.of.the.Hill
03 24 Simpsons
04 27 Family.Guy
05 22 Simpsons
15 08 Simpsons
Но я разберусь короче. Благодарю.

Всего записей: 9 | Зарегистр. 18-01-2012 | Отправлено: 22:33 21-01-2013 | Исправлено: ntmu, 22:35 21-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