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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я seq-ом создал шаблоны: 1) папки seq -w 01 31, 2) часы seq -w 00 23, 3) минуты с интервалом 10 seq -w 00 10 50, 4) секунды seq -w 01 02. bash скрипт это все мне генерит, дальше тупик, можно наверно сделать сравнение шаблона seq с содержимым в папке, но не знаю как.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
А-а-а!
Уважаемый, мы вам кладём скрипты от и до в тэг code. А вы нам речь толкаете. Можно листинг скрипта. И маленький комментарий после что там-то застопорился, а лучше это отметить как комментарий в скрипте.
Вы не ругайтесь  - я често не понимаю что вы хотите

----------
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:20 09-11-2011 | Исправлено: Alukardd, 22:20 09-11-2011
digital422

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

Код:
 
#!/bin/bash
month_day_ago1=`date '+%Y%m%d' -d "1 day ago"`
find $PATH/$month_day_ago1 -name "*_*_*" -printf "%f\n" | sort > /tmp/check-dir
 
echo  > /tmp/shablon
 
for hour in `seq -w 00 23` ; do
for minute in `seq -w 00 10 59` ;do
for second in `seq -w 00 01` ;do
echo $hour\_$minute\_$second >> /tmp/shablon
done
done
done
 

Итого в /tmp получаем 2 файла, check-dir - реальные файлы на диске, shablon - шаблон по которому надо делать сравнение. Почему в строке echo $hour\_$minute\_$seconde > /tmp/shablon появляется только одна запись, приходится ставить знак >> и строку очистки echo  > /tmp/shablon, но в этом случае в начале появляется пустая строка. Как дальше сделать сравнение файлов ?

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 10:40 10-11-2011 | Исправлено: digital422, 14:30 10-11-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Тезисно:
1. Форматирование кода отступами придумали не идиоты.
2. Башевская конструкция {} числа с ведущим нулем обрабатывает вполне корректно
$ echo {00..23}
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23

использовать утилиту seq с ключом -w необходимости нет.
3. Смысла сначала составлять списки, а только затем их сверять, не вижу никакого.
4. Тем паче не надо заводить для такой ерунды временные файлы на диске.
5. Существование файла, папки и т.д. в Баше проверяется конструкцией [[ -e file ]].
6. Слово «секунда» на английском пишется как «second».
7. Вместо `command` в Баше рекомендуется использовать $(command).

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
1. Не совсем понял про отступы.
2. Принято, не знал. {00..59..10} - так сделал интервал.
6 - 7. Исправил.
 

Код:
 
#!/bin/bash
 
for hour in {00..23} ; do
for minute in {00..59..10} ; do
for second in {00..02} ; do
        if [[ -e $PATH/$hour\_$minute\_$second ]]; then echo "not found" ; fi
done
done
done
 

 
Не получается с секундами, они в файлах плавающие, соотв. если задавать шаблон, то файлы помечаются как отсутствующие.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 15:05 10-11-2011 | Исправлено: digital422, 15:06 10-11-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
1. есть такое понятие как coding standard... В общем оттабулируйте тело цикла/функции/условия относительно его объявления.

----------
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:19 10-11-2011
digital422

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

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 15:31 10-11-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> Не получается с секундами, они в файлах плавающие
Чего? Какие еще «плавающие» секунды? Вы хотели сказать, что из файлов 00_00_00, 00_00_01, 00_00_02 два могут не существовать, и это не ошибка? Или существует только один из них? Если второе, то зачем вообще указывать секунды в имени файла?
 
> $PATH/$hour\_$minute\_$second
Подчеркивание спецсимволом не является. Зачем вы его экранируете?
 
> if [[ -e $PATH/$hour\_$minute\_$second ]]; then echo "not found" ; fi
Во-первых, вам не кажется, что информация «not found» — какая-то бесполезная? А во-вторых, я здесь вижу логическое несоответствие — если файл существует, то вывести «не найден». Очевидно, требуется, что-то выводить, если не существует.
if [[ ! -e $PATH/${H}_${M}_${S} ]]; then echo >&2 "${H}_${M}_${S} not found"; fi
или без оператора if:
[[ -e $PATH/${H}_${M}_${S} ]] || echo >&2 "${H}_${M}_${S} not found"
.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:14 10-11-2011 | Исправлено: ASE_DAG, 19:50 10-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> Файлы могут быть 00_00_00, 00_10_01,00_20_02, т.е. секунды не всегда могут быть равны 0. Как делать поиск в таком случае, приводить их к виду без секунд описывая переменной при помощи find + seed? Например:  find $PATH -printf "%f\n" | sed -e 's/_0[0-2]//'
 
> Подчеркивание спецсимволом не является. Зачем вы его экранируете?
Я тоже вначале так думал, без экранирования не хочет выводить, по крайней мере в таком виде:
for hour in {00..23} ; do  
for minute in {00..59..10} ; do  
          echo $hour_$minute # выводит только $minute
          echo $hour\_$minute # так выводит нормально 00_10
done  
done  
 
> not found
Остаток от последнего теста, временная информация, с отрицанием я разобрался.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Он скорее всего считает что это продолжение имени переменной...
В таком случае записывать надо так: echo ${hour}_${minute} - тем самым жёстко ограничивая имя переменной.
 
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 | Отправлено: 19:07 10-11-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Он скорее всего считает что это продолжение имени переменной.
> ${hour}_${minute}
Да, это я не сообразил. :-/
 
digital422
> Файлы могут быть 00_00_00, 00_10_01,00_20_02, т.е. секунды не всегда могут быть равны 0.
Если файл за минуту таки один (из вашего ответа это не понятно), то я таки не понимаю зачем добавлять к имени секунды. Но ладно, они уже есть, а нам надо удостовериться, что существует хотя бы один из трех файлов. Вот так, например, это может выглядеть:
 
for H in {00..23}; do
    for M in {00..59..10}; do
        F=0
        for S in {00..02}; do
            [[ -e $PATH/${H}_${M}_${S} ]] && ((F++))
        done
        ((F)) || echo >&2 "${H}_${M}_?? not found"
    done
done


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:14 10-11-2011 | Исправлено: ASE_DAG, 20:17 10-11-2011
digital422

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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, подскажите, пожалуйста как лучше сделать это сравнение:
 
имеется str1="абвгд 123-ж" и str2="123-"  
 
необходимо проверить имеется ли str2 в str1

Всего записей: 283 | Зарегистр. 11-01-2006 | Отправлено: 19:28 12-11-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DooMLorD
Речь о Баше, да?
[[ $str1 == *$str2* ]]

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Очередной ступор )
Есть папка с csv файлами, надо проверить, если в одном из файлов есть текст (NOT FOUND), то этот  csv не передавать для дальнейшей обработки, а все остальные обрабатывать.
CSV1 - выводит все файлы в папке
NF - выводит файл, который содержит строку "NOT FOUND" . Не ругайте за конструкцию, все что умею ).

Код:
 
#!/bin/bash
CSV1=$($FIND $PATH -type f -name "*.csv")
NF=$($FIND $PATH -type f -name "*.csv" | xargs grep -E "NOT FOUND" | awk -v FS=';' '!a[$6]++' | awk -F";" '{print $1}' | sed -e 's/:""//' )
 
for a in $CSV1; do
    for aa in $NF; do
    if [  ]; then
        echo "No_Run"
    else
        echo "Run"
        script-awk.sh
    fi
    done
done
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
выводит файл, который содержит строку "NOT FOUND" .
grep -sr 'NOT FOUND' /path/to/folder/
можно покрасивше обработать, если надо: дописать в конец строки | gawk -F: '{gsub(/.*\//,"",$1); print $1}', при условии, что в именах каталогов по пути и в имени самого файла нету двоеточий.
 
Добавлено:
Вообще вот наверное весь скрипт - проверяйте и правьте как удобно:
Код:
#!/bin/bash
IFS=$'\n'
for file in $(grep -Lr 'NOT FOUND' /path/to/your/folder | gawk -F: '{gsub(/.*\//,"",$1); print $1}'); do
  script-awk.sh "$file"
done
В общем-то так самое короткое, для всех файлов у которых не был найден 'NOT FOUND' вызвать script-awk.sh с именем нормальных файлов в качестве параметра.

----------
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:45 13-11-2011 | Исправлено: Alukardd, 16:00 13-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - работает, Спасибо!

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Так тут кое-что лишнее в скрипте... Так что как-то так:
Код:
#!/bin/bash
IFS=$'\n'
for file in $(grep -Lr 'NOT FOUND' /path/to/your/folder | gawk '{gsub(/.*\//,""); print}'); do
  script-awk.sh "$file"
done  
Или, если вас устроит и полный путь к файлу, а не только его имя, то перенаправление в gawk можно и вовсе удалить.
Кстати теперь и двоеточие может быть в именах

----------
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:40 13-11-2011 | Исправлено: Alukardd, 17:40 13-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не, двоеточие не надо в именах файлах, в своем скрипте когда давил строку, непонятно откуда они появились, ну я их sed-ом и убрал (подозреваю, что двоиточие от буквы диска). С именами нормально получилось, удобно делать путь к финальной папке: script-awk.sh $PATH_IN/$file > $PATH_OUT/$file.

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 17:57 13-11-2011
digital422

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

Код:
 
"00:01";"1";"";"";"";"";d:\path\000000001-one
"00:02";"1";"";"";"";"";d:\path\000000002-one
"00:03";"1";"";"";"";"";d:\path\000000003-1
"";"2";"";"";"";"";d:\path\000000004
"";"3";"";;"";"";d:\path\000000005
"";" ";"";"";"";"";d:\path\000000006
"";" ";"";"";"";"";d:\path\000000007
"";" ";"";"";"";"";d:\path\000000008
"";" ";"";"";"";"";d:\path\000000009-e
"00:04";"1";"";"";"";"";d:\path\000000010-one
"00:05";"";"";"";"";"";d:\path\000000011-1
"";"2";"";"";"";"";d:\path\000000012
"";"3";"";"";"";"";d:\path\000000013
"";" ";"";"";"";"";d:\path\000000014
"";" ";"";"";"";"";d:\path\000000015
"";" ";"";"";"";"";d:\path\000000016
"";" ";"";"";"";"";d:\path\000000017-e
"00:06";"1";"";"";"";"";d:\path\000000018-one
"00:07";"1";"";"";"";"";d:\path\000000019
"00:08";"1";"";"";"";"";d:\path\000000020
 


Код:
 
#!/usr/bin/gawk -f  
 BEGIN {  
     COMMAND="\"e:\\mencoder.exe\" -forceidx -ovc copy -oac copy -o "  
     COMMAND2="some command"  
   RS="\n";  
   FS=";";  
   OFS="\n";  
     ORS="\n";  
 }  
 {  
   if ($1 ~ /[[:digit:]]/) {  
         LN=$NF  
         gsub(/\"/,"",$1);  
         NM=$1;  
         gsub(/:/,"-",NM);  
         gsub(/\\.*/,"",$NF);  
         if (FNR == 1) {  
             print "rem "$1,COMMAND$NF"\\name-"NM" ^",COMMAND2"^",LN"^";  
         } else {  
             if (s == "0" ) {  
                 print COMMAND2,"rem "$1,COMMAND$NF"\\name-"NM" ^",COMMAND2"^",LN"^";  
             } else {  
                 print s"^",COMMAND2,"rem "$1,COMMAND$NF"\\name-"NM" ^",COMMAND2"^",LN"^";  
                 s="0";  
             }  
         }  
         i=1;  
     } else {  
         if (i == 1) {  
             i=0;  
         } else {  
            print s" ^";  
         }  
         s=$NF;  
   };  
 }  
 END {  
     print $NF"^",COMMAND2;  
 }
 

Почему в случае появления в начале или в конце одиночной строки скрипт выдает пустую строку с символом "^", например:
в начале:

Код:
 
COMMAND1 ... ^
COMMAND2 ...^
d:\path\000000001-one^
^
COMMAND ...
rem 00:02
 

в конце:

Код:
 
COMMAND2 ...^
d:\path\000000019^
COMMAND2
rem 00:08
COMMAND1 ... ^
COMMAND2 ...^
d:\path\000000020^
d:^
COMMAND2
 

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