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

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



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

Цитата:
THE_IG0R  
Либо в правах, либо в пути. Проверяйте что правильно написали (без ошибок), точно ли там 2 каталога BACKUP  один в одном?

 
Каталога два точно.  
Там штука какая. Кто-то все сделал, все работало как часы, человек этот уехал, в один момент бэкапы литься перестали, после чего - никто не знает? Говорят никто никуда не лазил.
 
кстати, после исполнения в root выдал :tar: Removing leading `/' from member names

Всего записей: 16 | Зарегистр. 20-11-2004 | Отправлено: 16:12 02-08-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
THE_IG0R
Это нормально) tar при создании архива удаляет начальные слэши из абсолютных путей...
 
Удачи в поисках проблемы...

----------
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:17 02-08-2011
THE_IG0R



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое Спасибо, не судите строго )))

Всего записей: 16 | Зарегистр. 20-11-2004 | Отправлено: 16:30 02-08-2011
Smoker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Зачем в sh скриптах используют which?
 
Много где видел использование такой конструкции, в начале стоит:
   COMMAND=”$(which command)”
затем по тексту используют:
   $COMMAND parameters
 
Полученный скрипт запускается через cron.
 
which ищет команду в PATH.
Если в скрипте использовать команду без полного пути, то она тоже будет искаться в PATH.
 
Так может правильней использовать просто:
   command
и не искать, предварительно, её полный путь?

Всего записей: 775 | Зарегистр. 28-01-2002 | Отправлено: 12:01 01-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smoker
> Полученный скрипт запускается через cron.
> Если в скрипте использовать команду без полного пути, то она тоже будет искаться в PATH.
Нет. Крон не наследует переменную PATH.
 
P.S. Что у вас за кавычки странные (RIGHT DOUBLE QUOTATION MARK's вместо понятных шеллу QUOTATION MARK's)?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 12:06 01-09-2011 | Исправлено: ASE_DAG, 12:14 01-09-2011
Smoker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Да, для задач в crontab можно задать свой PATH.
Или он будет использовать минимальный PATH - /usr/bin:/bin
 
Но это не меняет вопроса, какая разница между:
   COMMAND="$(which command)"
   $COMMAND
и
   command
 
Или which сможет найти что-то вне PATH?
 
Кавычки были скопированы из примера. Кстати с ' или ` в CentOS 5.6 данная конструкция не работает.

Всего записей: 775 | Зарегистр. 28-01-2002 | Отправлено: 13:37 01-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smoker
> Кстати с ' или ` в CentOS 5.6 данная конструкция не работает.
А с чего ей работать? «"», «'» и «`» — три разных синтаксических элемента. Для чего каждый, я думаю, сами найдете. :-) А «”» — такую кавычку сабж не понимает.
 
> which сможет найти что-то вне PATH?
По идее, не должен.
 
Ну зачем команда вообще выделена в переменную, надеюсь, понятно. Определенно хороший тон — писать скрипт так, чтоб его легко было адаптировать под разные системы. А $(which command), могу предположить, что это просто дополнительное указание на то, что $COMMAND, по замыслу, предназначена для полного пути.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smoker
Для обычных скриптов это признак хорошего тона, а для одно строчных crontab скриптов это необходимость...
 
ASE_DAG
Цитата:
По идее, не должен.  
vi `which which`
^_^

----------
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 | Отправлено: 14:53 01-09-2011
ASE_DAG



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

Код:
#! /bin/sh
set -ef
if test -n "$KSH_VERSION"; then
        puts() {
               print -r -- "$*"
        }
else
        puts() {
               printf '%s\n' "$*"
        }
fi
ALLMATCHES=0
while getopts a whichopts
do
        case "$whichopts" in
                a) ALLMATCHES=1 ;;
                ?) puts "Usage: $0 [-a] args"; exit 2 ;;
        esac
done
shift $(($OPTIND - 1))
if [ "$#" -eq 0 ]; then
 ALLRET=1
else
 ALLRET=0
fi
case $PATH in
        (*[!:]:) PATH="$PATH:" ;;
esac
for PROGRAM in "$@"; do
 RET=1
 IFS_SAVE="$IFS"
 IFS=:
 case $PROGRAM in
  */*)
   if [ -f "$PROGRAM" ] && [ -x "$PROGRAM" ]; then
    puts "$PROGRAM"
    RET=0
   fi
   ;;
  *)
   for ELEMENT in $PATH; do
    if [ -z "$ELEMENT" ]; then
     ELEMENT=.
    fi
    if [ -f "$ELEMENT/$PROGRAM" ] && [ -x "$ELEMENT/$PROGRAM" ]; then
     puts "$ELEMENT/$PROGRAM"
     RET=0
     [ "$ALLMATCHES" -eq 1 ] || break
    fi
   done
   ;;
 esac
 IFS="$IFS_SAVE"
 if [ "$RET" -ne 0 ]; then
  ALLRET=1
 fi
done
exit "$ALLRET"



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:07 01-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, помогите дописать скрипт.
Задача следующая: есть csv файл в котором есть ячейка с цифровыми значениями (у нас она называется ID). ID в ячейке бывают 6 и 9 символьные, например 335123 и 812345678. Есть второй файл, в котором прописаны правильные имена с существующими ID и расширениями, например 335123_music_1.mp3 и 812345678_kino_na_24.mp3. Задача скрипта - заменять в csv файле цифровые значения на правильные имена из 2 файла.
 
Что я сделал:
symvol9=`$CAT $FILE_CSV | $GREP -o -E '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' | sort -n | uniq`
Проблема 1: в таком виде не находит 6 символьные имена.
 
symvol6=`$CAT $FILE | $GREP -o -E '[0-9][0-9][0-9][0-9][0-9][0-9]' | sort -n | uniq`
Проблема 2: так выводит 6 символов от 9 символьного слова.
 
symvol6=`$CAT $FILE | $GREP -o -E '1[0-9][0-9][0-9][0-9][0-9]' | sort -n | uniq`
Проблема 3: так находит имя начинающееся с 1 (вроде бы правильно, но надо создавать 9 строк)
 
Далее по скрипту, ищем совпадения ID из ячейки с реальными:
for id6 in $symvol6
do
    echo $id6
    $GREP $id6 $FILE2
done
 
тут находятся совпадения 6 символьных в 9-ти, например 335123 находится в имени 123335123, что не правильно, по 9-ти символьным все в порядке.
 
Как решить вышеперечисленные проблемы и продвинуться дальше, сделать замену в csv файле ?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Ваши попытки решить проблему вынесли мне мозг окончательно...
Дайте пожалуйста пример обоих файлов и результата (2 строки на каждый из 3-х файлов + шапка), тогда я думаю что напишу Вам скрипт...

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
=========================== исходный csv =============================
 
        30 августа вторник    Канал1        
Время выхода блока    Поз. в блоке    Ролик    Версия    Хрон.    ID ролика
            Н.шапка    5        654321
09:30    1    Ролик1    без. даты 2011    10    123456789
09:30    2    Ролик2    август 2011    15    123456
                    ИТОГО    130
 
09:52    1    Ролик3    без. даты 2011    10    123456790
09:52    2    Ролик4    август 2011    15    123470
                    ИТОГО    130
 
=========================== должно быть ==============================
Прибиваем первые 2 строки и строку "ИТОГО"
 
            Н.шапка    5        654321_zastavka1.mp3
09:30    1    Ролик1    без. даты 2011    10    123456789_deti.mp3
09:30    2    Ролик2    август 2011    15    123456_s_5_sent.mp3
09:52    1    Ролик3    без. даты 2011    10    123456790_promo.mp3
09:52    2    Ролик4    август 2011    15    123470_do_27_okt.mp3
 
=========================== файл с исходниками ========================
654321_zastavka1.mp3,
123456789_deti.mp3,
123456790_promo.mp3,
123470_do_27_okt.mp3,

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Вы хотите сказать что разделитель в csv у вас пробел?!?!?! (извращенцы!)
Щас попробую состряпать...

----------
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 | Отправлено: 14:12 04-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Разделитель - можно все что угодно, в данном примере табуляция, скажите какой лучше использовать-сделаем. Вообще-исходник xls. Что-то подобное я пытался сделать на 2 странице этой темы, только там были jpg файлы.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Это ппц))) За 3месяца всё под чистую забыл))) Еле вымучил... Еще сначала не тем путём пошёл... В общем вот:
Код:
#!/bin/bash
 
src="src"
srccsv="src.csv"
 
for line in `cat "$src"`; do
  num=`echo "$line" | sed 's/\([[:digit:]]\{6,9\}\)_.*/\1/g'`
  fullname=`echo "$line" | sed 's/\(.*\),/\1/g'`
  sed -i 's/'"$num"'/'"$fullname"'/g' "$srccsv"
done
src - это файл с id_name, а src.csv - ваш csv. ВНИМАНИЕ! Замена производится в csv файле, поэтому предварительно скопируйте исходник...

----------
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:18 04-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здорово, получается так как надо. Можно попросить еще 3 вещи?
1. Можно ли ускорить работу скрипта, в файле с "src - это файл с id_name" около 9000 записей, скрипт отрабатывает около 5 минут.
2. Прибить первые 2 строчки и строчку со словом "ИТОГО".
3. В конце переименованной строки стоит виндовый символ ^M, как его убрать.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
 Можно ли ускорить работу скрипта
надо подумать... щас sed вызывается каждый раз для нового файла, что очень не рационально...
Цитата:
В конце переименованной строки стоит виндовый символ ^M
щито? это после моей замены типа что-то появляется? Мб это просто так выглядит UNIX коец строки в виндовом блокноте?
Цитата:
Прибить первые 2 строчки и строчку со словом "ИТОГО"
Добавьте в самый конец скрипта строку sed -i '/ИТОГО/d; /^$/d; 1,2d' "$srccsv"    - удалятся первые 2, ИТОГО, и пустые строки

----------
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:06 04-09-2011 | Исправлено: Alukardd, 16:06 04-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
 
> Можно ли ускорить работу скрипта
Можно. Использовать не шелл, постоянно дергающий процессы, а что-нибудь более для вашей задачи предназначенное, напр. AWK.
 

Код:
#!/usr/bin/gawk -f
BEGIN {
    FILELIST="filelist"
    RS=",\n";
    FS="_";
    while (getline < FILELIST) {
        files[$1]=$0;
    }
    RS="\n";
    FS="\t";
    OFS="\t";
}
/^.*\t.*\t.*\t.*\t.*\t[0-9]+$/ {  
    print ($1, $2, $3, $4, $5, $6 in files ? files[$6] : "E: FILE " $6 " NOT FOUND");
}

 
Расположение файллиста, я так понял, у вас не меняется, поэтому оно вписано с скрипт, а tsv-файл передается скрипту первым параметром. А вот какие у вас там еще поля, кроме ID обязательные, я не понял; сами поправите звездочки на плюсики, если надо будет.
 
P.S. Как можно придать своему вопросу более презентабельный вид:  
а) обернуть листинги в [font=monospace][/font];
б) привести реальные файлы, из приведенного совершенно неясно, какой из файлов больше объемом, например;
в) продублировать листинги на каком-нибудь пастбине, если знаете, что местный недопарсер захавает важные символы, здесь-то табуляцию восстановить несложно: %s/ \{2,\}/\t/g, но это не всегда так.
 
P.P.S. У меня дежа-вю, или вы уже раз обращались с этой задачей?
 
Добавлено:
digital422
> В конце переименованной строки стоит виндовый символ ^M, как его убрать.
Вот это я еще не понял. Файл живьем куда-нибудь (на Дропбокс, например) киньте.
 
Alukardd
> За 3месяца всё под чистую забыл
Что вы делали эти три месяца? :-)
 
ASE_DAG
> У меня дежа-вю, или вы уже раз обращались с этой задачей?
А! ну вы и написали, что таки да, обращались.

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот так видится в редакторе mc.
360240227_izm_rus-10.mp3^M....
а вот так в исходнике: 360240227

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> 360240227_izm_rus-10.mp3^M....
Вы прочитали мой пост выше?

Цитата:
Файл живьем куда-нибудь (на Дропбокс, например) киньте.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:26 04-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