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

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

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

Код:
 
"09:38";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
;" ";"text";"text";"15";123456789;c:\path\123456789-02.mp3
"11:58";" ";"text";"text";"5";123456789;c:\path\123456789-03.mp3
;" ";"text";"text";"15";123456789;c:\path\123456789-04.mp3
"12:58";" ";"text";"text";"5";123456789;c:\path\123456789-05.mp3
;" ";"text";"text";"15";123456789;c:\path\123456789-06.mp3
 

его надо привести к такому виду:

Код:
 
rem 09:38
%COMMAND%\name-09-38.mp3 ^
c:\path\123456789-01.mp3 ^
c:\path\123456789-02.mp3
 
rem 11:58
%COMMAND%\name-11-58 ^
c:\path\123456789-03.mp3 ^
c:\path\123456789-04.mp3  
 
rem 12:58
%COMMAND%\name-12-58 ^
c:\path\123456789-05.mp3 ^
c:\path\123456789-06.mp3
 

 

Код:
 
awk -F "\"*;\"*" '{print $1,$7}' /tmp/test.txt | sed -e 's/"//g' | tr ' ' '\n' | sed '/^$/d'
 

 
сделал пока только перенос:
09:38
c:\path\123456789-01.mp3
c:\path\123456789-02.mp3

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 08:31 01-10-2011 | Исправлено: digital422, 09:01 01-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Вы еще более извратное выражение написали, чем это делаю обычно я)))
А циркумфлекс в конце строки так и должно быть? И %COMMAND% тоже так и надо оставить (типа это для батника заготовка)?

----------
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 | Отправлено: 12:54 01-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
%COMMAND% - уже не надо, у меня получилось поместить переменную в sed. Теперь надо сделать дозапись времени в имя файла.
COMMAND='"e:/mencoder.exe" -forceidx -ovc copy -oac copy -o с:/name-$ВРЕМЯ1.avi'

Цитата:
А циркумфлекс в конце строки так и должно быть?

Да, он в винде - перенос строки и тем самым склеивает файлы в один.
Вот что у меня получается:

Код:
 
awk -F "\"*;\"*" '{print $1,$7}' /tmp/01_03-10.txt \
| sed -e 's/"//g' \
| tr ' ' '\n ' \
| sed '/^$/d' \
| awk '{print $0" ^"}' \
| sed "/[0-9]:[0-9]/a$COMMAND" \
| sed -e 's/\//\\/g'
 

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 13:26 01-10-2011 | Исправлено: digital422, 13:34 01-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
В общем вот...
Код:
#!/usr/bin/gawk -f
BEGIN {
  RS="\n";
  FS=";";
  OFS="\n";
  ORS="\n";
}
{
    if ($1~ /[[:digit:]]/) {
        gsub(/\"/,"",$1);
        gsub(/.*\\/,"",$NF);
        print "rem "$1,"%COMMAND%\\"$NF" ^";
    } else {
        print $NF" ^";
    };
}

Как обычно не забываем изменить RS, ORS и OFS на \r\n в случае dos'овского окончания строки.

----------
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:17 01-10-2011 | Исправлено: Alukardd, 14:18 01-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И вновь могучий gawk, я в нем как в темном лесу, думал можно на bashе все сделать.
COMMAND, в предыдущем сообщении я отредактировал, что она должна быть переменной в этом же скрипте, т.е. подставляться пути и параметры mencoderа:
COMMAND='"e:\mencoder.exe" -forceidx -ovc copy -oac copy -o с:\name-$ВРЕМЯ.avi'
Вот результат работы скрипта:

Код:
 
rem 21:58
%COMMAND%\123456789-01.mp3 ^
c:\path\123456789-02.mp3 ^
 

а должно быть так:

Код:
 
rem 21:58
"e:\mencoder.exe" -forceidx -ovc copy -oac copy -o с:\name-21-58.mp3 ^  
c:\path\123456789-03.mp3 ^  
c:\path\123456789-04.mp3  
 

1. в последней строке не должно быть символа ^
2. время, которое находится поверх строки с менкодером дописывалось к имени пути или просто файл бы обзывался время.расширение (например 21-58.mp3)

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 17:48 01-10-2011 | Исправлено: digital422, 17:51 01-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
думал можно на bashе все сделать.  
вы же все равно вызывали sed и awk)))
Ладно щас ваши замечания применю к скрипту...

----------
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 | Отправлено: 17:55 01-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
%COMMAND% заменил строкой
print "rem "$1,"e:\\mencoder.exe -forceidx -ovc copy -oac copy -o с:\\"$NF" ^";

Цитата:
Как обычно не забываем изменить RS, ORS и OFS на \r\n в случае dos'овского окончания строки.

RS - выдается одна строка
ORS и OFS - с этими 2-мя виндовый (dos) символ переноса строки в конце строки появляется, этого достаточно.

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 18:04 01-10-2011 | Исправлено: digital422, 18:16 01-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Вот моё очередное криволапое творение, думаю можно было и покрасивше сделать...
Код:
#!/usr/bin/gawk -f
BEGIN {
    COMMAND="\"e:\\mencoder.exe\" -forceidx -ovc copy -oac copy -o "
  RS="\n";
  FS=";";
  OFS="\n";
    ORS="\n";
}
{
  if ($1 ~ /[[:digit:]]/) {  
        gsub(/\"/,"",$1);
        NM=$1;
        gsub(/:/,"-",NM);
        gsub(/\\.*/,"",$NF);
        if (NR == 1) {
            print "rem "$1,COMMAND$NF"\\name-"NM" ^";
        } else {
            print s,"rem "$1,COMMAND$NF"\\name-"NM" ^";
        }
        i=1;
    } else {
        if (i == 1) {
            i=0;
        } else {
           print s" ^";
        }
        s=$NF;
  };  
}  
END {
    print $NF;
}


----------
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 | Отправлено: 19:31 01-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> думал можно на bashе все сделать.
Можно и на Баше. Вот, например:
 

Код:
#!/bin/bash
MENCODER='e:\mencoder.exe -forceidx -ovc copy -oac copy -o'
IFS=';';
while read -r TIME F2 F3 F4 F5 NAME FILE; do
    if [[ $TIME ]]; then
        TIME=${TIME//\"/}
        echo -e "\n\nrem $TIME"
        echo -n "$MENCODER с:\name-${TIME/:/-}.mp3"
    fi
    echo -n " $FILE"
done
echo

 

Код:
$ /tmp/digital422.sh < /tmp/digital422.csv
 
 
rem 09:38
e:\mencoder.exe -forceidx -ovc copy -oac copy -o с:\name-09-38.mp3 c:\path\123456789-01.mp3 c:\path\123456789-02.mp3
 
rem 11:58
e:\mencoder.exe -forceidx -ovc copy -oac copy -o с:\name-11-58.mp3 c:\path\123456789-03.mp3 c:\path\123456789-04.mp3
 
rem 12:58
e:\mencoder.exe -forceidx -ovc copy -oac copy -o с:\name-12-58.mp3 c:\path\123456789-05.mp3 c:\path\123456789-06.mp3


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:23 01-10-2011 | Исправлено: ASE_DAG, 20:30 01-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Ну я знаю что я как всегда извращаюсь с кучей if'ов.. Ну мозг работает у меня только на них((( ХОТЯ если ваш пример пытаться привести к форме с циркумфлексами на конце, то думается мне что if'ов добавится еще парочка...
Так и не понял как у вас работает строка ${TIME//\"/} и почему именно так... С заменой : всё понятно так и должно быть, но что до 1-ой замены - я не понимаю... Если сделать как мне понятно ${TIME/\"/}, то заменится только 1-ая кавычка...
Пока искал объяснения наткнулся на прекрасную статейку - не знал о таких возможностях...

----------
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 | Отправлено: 20:54 01-10-2011 | Исправлено: Alukardd, 20:56 01-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> наткнулся на прекрасную статейку - не знал о таких возможностях...
Из шапки: Мендель Купер. Искусство программирования на языке сценариев командной оболочки. — Ч. 3 — Гл. 9.2
 
> если ваш пример пытаться привести к форме с циркумфлексами на конце
Так здесь такой вид и не нужен. Тов. Диджитал, очевидно, посчитал, что всегда будет проще реализовать тогда, когда одной строке на входе соответствует одна строка на выходе, но это не так.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Спс. Надо шапку почитывать)))
Да про конец строки я и так понял, но что попросили, то и дал)))
 
Добавлено:
И еще меня вопрос мучает достаточно давно, есть ли в awk функция, которая производит замену в переменной, но результат отдает на выход, а не изменяя исходную переменную, например:
x=$NF; gsub(/\"/,"",x); Хочу нормальную функцию x=gsub2(/\"/,"",$NF);

----------
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 | Отправлено: 21:30 01-10-2011 | Исправлено: Alukardd, 21:36 01-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
В ГНУ Авке есть — gensub.
 
P.S. Но про нее вы знаете, значит вопрос про какой-то другой АВК. Какой?

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

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

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

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 21:52 01-10-2011 | Исправлено: digital422, 21:58 01-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Ну да, раздолбай я))) Ни памяти, ни внимательности)))
 
digital422
Для интереса, что в итоге поставили для работы bash или awk?)

----------
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 | Отправлено: 21:57 01-10-2011
digital422

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

Цитата:
Для интереса, что в итоге поставили для работы bash или awk?)

awk вариант выполняет свои функции, но разбираться с ним не просто, не мое это.

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 22:01 01-10-2011
GeMir



Ich finde dich
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Буду признателен за помощь с простеньким скриптом, задача которого,
создать уменьшенные копии всех файлов с расширением *.JPG в активной
директории:

Код:
for i in '*.JPG'; do  
    convert $i -resize 1024x1024\> $i;
done

 
Данный вариант, почему-то, выдаёт одно и то же имя файла на выходе.
В чём ошибка?
 
ImageMagick, используемый для уменьшения, по необходимости автоматически
добавляет -0, -1 и так далее к имени файла, мне же хотелось бы, чтобы вместо
имя_файла вывод производился в имя_файла_small.jpg.  

Всего записей: 10296 | Зарегистр. 15-02-2004 | Отправлено: 15:47 02-10-2011 | Исправлено: GeMir, 15:51 02-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GeMir
> i in '*.JPG'
> имя_файла_small.jpg
Именно так? Выбрать все файлы с раcширением JPG, но сохранить с jpg?
 
> В чём ошибка?
Джокеры (*) даже в нестрогих кавычках не раскрываются, а вы в строгие забрали.
 
> Данный вариант, почему-то, выдаёт одно и то же имя файла на выходе.  
Не понял, что вы хотели сказать. Давайте без косвенных описаний, ОК?
 
> мне же хотелось бы, чтобы вместо имя_файла вывод производился в имя_файла_small.jpg
Если средствами Баша, то:
$ for i in *.JPG; do convert "$i" -resize 1024x1024\> "${i%.*}_small.jpg"; done

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:26 02-10-2011
GeMir



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

Цитата:
Выбрать все файлы с раcширением JPG, но сохранить с jpg?  

Угу.

Цитата:
Не понял, что вы хотели сказать

Имеем: DSC_1215, DSC_1216, DSC_1217.
Скрипт выдаёт: DSC_1215-0, DSC_1215-1, DSC_1215-2 ("-0", "-1" и "-2" это от ImageMagick).

Цитата:
Если средствами Баша, то:  

Спасибо.

Всего записей: 10296 | Зарегистр. 15-02-2004 | Отправлено: 18:46 02-10-2011 | Исправлено: GeMir, 18:49 02-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток.  
 
Есть много файлов. Каждый файл - множество абзацев, разделенных тремя пустыми строками (кроме первого абзаца, в начале файла пустых строк нет).  
Нужно выбрать абзацы, в которые входит одно какое-то конкретное слово. Оно может быть в любом месте абзаца (в конце, в начале, в середине). И сложить эти абзацы в файлы размером где-то в мегабайт.  
 
Я понимаю, что это grep и split, но нужно конкретное решение.

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 22:04 02-10-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

Компьютерный форум 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