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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tmpl
> это будет замена (http://example.com/)page.php?id=([0-9]+) на $1$2
 
Да?  А по-моему много проще.
 
> не смог найти, как это можно сделать с помощью awk, т. к. из доков следует, что он не умеет работать с найденными совпадениями, которые в скобках. . ..нашел только, что в gawk есть нестандартное расширение для такого. Можно ли сделать желаемое на awk?
 
Во-первых, «awk» — это что?  Если не ГНУ АВК, то какой?
 
Во-вторых, разумеется, можно.   Не говоря уж о том, что любой АВК — это полноценный язык, функция sub(), емнип, существовала еще в том интерпретаторе, что написали Ахо, Вейнбергер и Керниган в семидесятых.  Так что:
 
$ gawk '{ sub ("page\\.php\\?id=", ""); print }' <<< 'http://example.com/page.php?id=NNN'
http://example.com/NNN


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:34 10-10-2016 | Исправлено: ASE_DAG, 22:36 10-10-2016
tmpl

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

Цитата:
sed

 
Да там ссылки на найденные подстроки есть, спасибо, изучу внимательнее. Дело в том, что моя замена не такая простая, как в примере выше, и на mawk я писал отдельную программку для этого. Можно ли все так же просто переписать на sed, пока вопрос.
 

Цитата:
AWK более универсальный язык

 
И это меня и удивило, что в языке нет такой базовой функции регулярок как ссылка на найденную подстроку.
 
ASE_DAG

Цитата:
Да?  А по-моему много проще.

 
Я сильно упростил. Задача: использовать в замене найденную подстроку.
 

Цитата:
Во-первых, «awk» — это что?  Если не ГНУ АВК, то какой?

 
Использую mawk. А расширение стандарта в gawk, про которое я упоминал, это:
 

Цитата:
gensub(regexp, replacement, how [, target]) #
 
gensub() provides an additional feature that is not available in sub() or gsub(): the ability to specify components of a regexp in the replacement text. This is done by using parentheses in the regexp to mark the components and then specifying ‘\N’ in the replacement text, where N is a digit from 1 to 9.
 

Всего записей: 1274 | Зарегистр. 22-03-2008 | Отправлено: 22:57 10-10-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tmpl
С gawk'ом, конечно проще, т.к. gensub умеет backreference.
Но варианты есть всегда.
 
1. взять Perl: perl -ne 'print "$1$2\n" if m|(https?://[^/]+\.[^/]+/)page\.php\?id=(\d+)|' <<< "http://example.com/page.php?id=666"
 
2. mawk
 
  2.1 mawk 'match($0, "http://[^/]+\.[^/]+/") {s[0]=substr($0, RSTART, RLENGTH)} match($0, "[0-9]+$") {s[1]=substr($0, RSTART, RLENGTH)} /https?:\/\/[^\/]+\.[^\/]+\/page\.php\?id=[0-9]+/ {print s[0]s[1]}' <<< "http://example.com/page.php?id=666"
 
  2.2 mawk -F'/page|=' '/https?:\/\/[^\/]+\.[^\/]+\/page\.php\?id=[0-9]+/{print $1"/"$3}' <<< "http://example.com/page.php?id=666"

----------
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 | Отправлено: 00:09 11-10-2016 | Исправлено: Alukardd, 10:32 11-10-2016
tmpl

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
 
Спасибо, но это хардкор. Все-таки буду использовать gawk. Там все оказалось намного удобнее, тот же match() умеет сохранять найденные подстроки в массив: "match(string, regexp [, array])". Но mawk работает в разы быстрее.

Всего записей: 1274 | Зарегистр. 22-03-2008 | Отправлено: 22:54 11-10-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tmpl
Цитата:
Но mawk работает в разы быстрее
вот это новость...

----------
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 | Отправлено: 23:15 11-10-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Благодаря этой теме был написан небольшой скрипт, который из xls файла выделяет ячейки с временем и доп.информацию. У этого скрипта есть один недостаток-он обрабатывает ячейки времени как есть во входном файле. Появилась задача обрабатывать ячейки сравнивая с текущим временем и не выводить те ячейки, где время уже прошло. Т.е. если сейчас 13:00 то вывести те, которые начинаются с 13 часов, минуты плавающие и не выводить 11:00, 11:10, 12:50 и т.д.
 

Код:
 
#!/usr/bin/gawk -f
 
BEGIN {
    RS=",\n";
    RS="\n";
    FS=";";
    OFS=";";
}
 
/[[:digit:]]{6,9}/{
    print ($3);
}
 

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 08:37 23-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
>    RS=",\n";
>    RS="\n";
 
Опечатка, надо полагать?
 
А в целом — я не понял вопроса, то есть чего вы от нас хотите.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:08 24-11-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
А в целом — я не понял вопроса, то есть чего вы от нас хотите.
Очевидно, что функцию преобразования строки в дату и функцию сравнения полученной даты с now().
 
 
digital422
Пару строк исходного CSV файла-то приведите для примера...
 
p.s. xls документ на awk разобрать ооооочень запарно, так что называем вещи своими именами, у вас csv документ.
 
У GNU AWK есть встроенные функции для работы с временем — https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

----------
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 | Отправлено: 16:16 24-11-2016 | Исправлено: Alukardd, 16:22 24-11-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Давайте считать это csv, тем более на входе txt файл, а не xls, перепутал с другой системой, где xls.

Код:
 
09:29;2663827178;text
09:29;2633827178;text
10:15;2663824178;text
10:15;2663824178;text
11:10;3663824178;text
13:19;2663824178;text
 

Если сейчас например 10:10 то должно быть:

Код:
 
10:15;2663824178;text
10:15;2663824178;text
11:10;3663824178;text
13:19;2663824178;text
 


Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 17:23 24-11-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
А, там только время в формате HH:MM, ну тогда это руками вполне  просто:

Код:
awk -F':|;' 'BEGIN{OFS=";"; HH=strftime("%H",systime()); MM=strftime("%M",systime())} {if($1 > HH) print; else if($1 == HH) if($2 > MM) print }' /tmp/111


----------
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:45 24-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Очевидно, что функцию преобразования строки в дату и функцию сравнения полученной даты с now().  
 
Как видите, не угадали — наоборот.
 
digital422, ну и в чем проблема?

#!/usr/bin/gawk -E
 
BEGIN {
    FS = ";";
    now = strftime ("%H:%M");
}
 
$1 > now {
    print ($3);
}


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:51 24-11-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Воу, не думал, что оно так сравнит HH:MM... Так явно короче)))

----------
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 24-11-2016 | Исправлено: Alukardd, 17:56 24-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, а почему нет — не подумали же вы, что в языке для обработки текста нет операторов сравнения строк?  ;-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:01 24-11-2016 | Исправлено: ASE_DAG, 18:02 24-11-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Работает, осталось прописать /[[:digit:]]{6,9}/ - для выделения только времени, т.к. сверху есть текст, без этой строки он появляется.

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 18:54 24-11-2016
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:09 24-11-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Где ошибка, почему выводится все время? $3 - это столбец времени.
/[[:digit:]]{6,9}/{
    $3 > now;
    print $3;
}
 
 
Добавлено:
Сделал.
/[[:digit:]]{6,9}/{
    if($3 > now)
    print ($3);

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 19:21 24-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422> Где ошибка
 
В логике.
 
> if($3 > now)
 
Можно и так, конечно — два вложенных if’а, да.  Но на всякий случай напоминаю, что существует оператор «И»:

/[[:digit:]]{6,9}/ && $3 > now {
    print ($3);
}

 
Плюс, вы уверены, /[[:digit:]]{6,9}/ — это самый понятный способ отфильтровать ненужные строки?  Что у вас там?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:34 24-11-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
/[[:digit:]]{6,9}/ - цифровые кода, минимальное значение цифр-6, максимальное-9.
Нашел еще одну проблему, если в папке лежит больше одного файла то время урезается у всех файлов. Во 2 строке моих файлов есть дата, попробую сделать по аналогии с сегодняшним примером, только вместо времени будет дата.

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 19:48 24-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> /[[:digit:]]{6,9}/ - цифровые кода, минимальное значение цифр-6, максимальное-9.
 
Вы это кому рассказываете и зачем?
 
> если в папке лежит больше одного файла то время урезается у всех файлов
 
Не понял.  Вы не рассказывали, что у вас за файлы.
 
> попробую сделать по аналогии
 
Попробуйте.  Будут вопросы — пишите.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:55 24-11-2016
digital422

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

Цитата:
Плюс, вы уверены, /[[:digit:]]{6,9}/ — это самый понятный способ отфильтровать ненужные строки?  Что у вас там?

Цифровые кода (ID номера) в виде 6-9 значных цифр. ASE_DAG - спросили-ответил .

Всего записей: 351 | Зарегистр. 19-04-2003 | Отправлено: 20:09 24-11-2016
Открыть новую тему     Написать ответ в эту тему

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