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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7

Открыть новую тему     Написать ответ в эту тему

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
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
> хотелось бы сделать копирование аналогичное выньному
Я повторю еще раз.
Копирование, реализованное в WinNT, насколько можно судить, принципиально от реализованного в утилите cp по интересующему вас признаку не отличается — они оба работают со всем диапазоном символов, не деля буквы на верхний и нижний регистр вовсе.
Эквивалентность буквы строчной и заглавной в имени файла определяется драйвером ФС. Можете в этом воочию убедиться: смонтируйте под вашей ГНУ, напр., раздел с FAT32, и попробуйте на него записать два файла, отличающиеся в именах регистром, при помощи cp или любой другой утилиты — у вас не выйдет — это с одной стороны; с другой же — установите в вашей Винде HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\dword:ObCaseInsensitive равным 0, т. е. сделайте ядро NT регистрочувствительным и убедитесь, что альтернативные реализации копирования (Total Commander, напр.) так же изменили свое поведение.
 
> в архиве обновления существует некий бардак, то файло то в одном регистре обозвано может быть, то в другом
Не рассматривая возможности дать втык архивариусу, чтоб навел порядок, наиболее разумным решением вижу предложенное тов. Алукардом — приводить все одному регистру, с одним уточнением — это должно делаться еще до копирования на сервер, на Винде.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:31 05-11-2012 | Исправлено: ASE_DAG, 16:33 05-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
смонтируйте под вашей ГНУ, напр., раздел с FAT32, и попробуйте на него записать два файла, отличающиеся в именах регистром, при помощи cp или любой другой утилиты — у вас не выйдет
С чего бы это?) И хотя сейчас у меня есть только NTFS разделы, могу Вас заверить что с ними пркрасно проходит запись двух файлов - aa и AA, более того - Windows 7 их видит оба, однако при попытке открыть любой из них открывается файл в верхнем регистре т.е. AA, как это регулируется я хз. Т.е. видятся оба, а работа идёт только с одним.
 
Добавлено:
Так же могу добавить, что если попытаться прочесть какой-либо из файлов из командной строки (type aa.txt), то команда type читает по сути оба файла с содержимым написанного в верхнем регистре.  Т.е. содержимое выводится два раза.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:30 05-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> С чего бы это?
С того, что спецификация FAT32, афайк, предусматривает case-insensitivity. Возможно, вы сочтете забавной ошибку, которую возвращает Баш:
$ ls
$ echo A >> FILE
$ ls
FILE
$ echo a >> file
bash: file: File exists
$ ls
FILE
$ cat FILE
A
$

 
Проверьте, может быть у вас что другое будет, мне было б интересно сравнить. Только не надо говорить, что у вас «сейчас у меня есть только NTFS разделы». Во-первых, не верю, что под рукой у вас ней не единой флэшки с ФАТом. А во-вторых, создать ФС в файле — дело одной минуты.
 
> NTFS разделы, могу Вас заверить что с ними пркрасно проходит запись двух файлов - aa и AA
Могу вас заверить, что и на другие современные ФС: ext*, UFS, UDF и т. д. совершенно спокойно можно записать два файла: aa и AA, только какое имеет отношение к тому, что я сказал?
 
> если попытаться прочесть какой-либо из файлов из командной строки (type aa.txt), то команда type читает по сути оба файла с содержимым написанного в верхнем регистре
Да, любопытная информация.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:00 05-11-2012 | Исправлено: ASE_DAG, 18:07 05-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Конечно сочту забавной) У меня он просто запишет указанный текст в тот же файл...
Хотя, если честно, меня сильно удивляет эта ситуация. Мне прекрасно известно о свойствах FAT32, но тем не менее меня это сильно удивляет. NTFS должна так же себя вести но как видите... Собственно всё должно зависеть от драйвера.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:43 05-11-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В моём случае на исходной папке фс NTFS (ну это так, к слову). Спасибо за совет по приведению к нижнему регистру, но мне проще убивать ранее скопированное на Линь и затем копирование обновлённого виндового каталога.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 19:59 05-11-2012 | Исправлено: Maximus777, 20:02 05-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помощи, т.к. у меня мозг начинает закипать и думает о задаче в целом, а тут локальная проблема и ни как не могу на неё целиком сосредоточиться.
Косяк идёт с кавычками в bash скрипте.
Скрипт целиком не привожу, только значащие строки:
Код:
FULLNAME="'${OPTARG}'"
ADTOOL userrename $USERNAME $FULLNAME
# И сама функция, создана для разгрузки кода, т.к. таких вызово в нём много.
ADTOOL() {
    adtool -H "$AD_SERVER" -b "$SEARCH_BASE" -D "$AD_ADMIN_USER" -w "$ADMIN_PASSWORD" $*
}
Проблема в том, что строка из OPTARG, например "Ivanov Ivan Ivanovich" превращается в конечном вызове утилиты adtool в ''\''Ivanov' Ivan 'Ivanovich'\'''
Я пробовал различные комбинации двойных и одинарных кавычек, с экранированием и без. Ни черта не выходит.
Нужно что бы вызов шёл с ФИО в любых кавычках.
 
Отказываться от использования $* не хочется ,т.к. эта конструкция серьёзно разгрузила мой код и сделал его читабельным.
Надо понять на каком этапе какие кавычки раскрываются и что в итоге остаётся.
Вывод смотрел через set -x
 
Добавлено:
Сразу добавлю, что не надо мне советовать эту строку вызова сделать без вызова функции ADTOOL, прямым вызовом утилиты adtool. Да, я знаю, что так будет работать.
Меня интересует именно вопрос с кавычками в рамках текущих условий.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:35 07-11-2012 | Исправлено: Alukardd, 14:42 07-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> у меня мозг начинает закипать
Да, очень похоже, поскольку очень простое правило — все переменные на каждом шаге забирать в кавычки — применимо всегда, но это пол-решения. Вторая половина в том, что от использования $* таки придется отказаться, поскольку правильным тут будет $@.
 
$ USERNAME="Ivanov"
$ OPTARG="Ivanov Ivan Ivanovich"
$ FULLNAME="$OPTARG"
$ ADTOOL() { true "$@"; }
$ set -x
$ ADTOOL userrename "$USERNAME" "$FULLNAME"
+ ADTOOL userrename Ivanov 'Ivanov Ivan Ivanovich'
+ true userrename Ivanov 'Ivanov Ivan Ivanovich'


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:04 07-11-2012 | Исправлено: ASE_DAG, 16:06 07-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
ВОТ ОНО!!!
$* и $@ по разному действуют!!! В первом случае вся хрень с пробелами или без рассматривается как одно большое "слово" даже с пробелами, а $@ раскрывает как и положено по параметрам, разделённым пробелами!
 
Спасибо
И конечно же в мане всё это написано, но пока вы меня не ткнули носом в $@ я даже не думал тут проблему искать.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:06 07-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Всегда пожалуйста. Могу еще пару способов предложить, наверняка вам известных, кстати.
 
Первый — alias.
$ alias ADTOOL='true --key'
$ set -x
$ ADTOOL userrename "$USERNAME" "$FULLNAME"
+ true --key userrename Ivanov 'Ivanov Ivan Ivanovich'

 
Второй — простая переменная.
$ ADTOOL='true --key'
$ $ADTOOL userrename "$USERNAME" "$FULLNAME" # да, именно без кавычек
+ true --key userrename Ivanov 'Ivanov Ivan Ivanovich'

 
Второй к вашему капсовому «ADTOOL» идет куда больше, чем функция и алиас, имена которым принято давать все-таки в нижнем регистре.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:49 07-11-2012 | Исправлено: ASE_DAG, 18:51 07-11-2012
Alukardd



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

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:28 07-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist (10:35 16-11-2012)
Цитата:
Доброго всем дня, может кто поможет с такой задачкой, есть утилита uniq которая после сортировки убирает или повторяющиеся строки (-u) или неповторяющиеся (-d), а как сделать чтоб вывести именно строки повторяющиеся n раз и более. Т.е. образно говоря мне из отсортированного утилитой sort файла нужно выбрать только те строки которые повторяются более n раз.
Спасибо.

 
 
ASE_DAG (03:59 17-11-2012)
Цитата:
Krist
Во-первых, совершенно излишне было создавать новую ветку, когда можно было обратиться в «UNIX Shell».
 
А по существу могу предложить вот такую строчку:
$ awk -v n=3 '++a[$0]==n' file
— работает без сортировки, но с загрузкой всего файла в память.
 
$ cat file
A
B
C
D
A
D
B
A
A
E
R
A
B
$ awk -v n=3 '++a[$0]==n' file  
A
B

 
Комментарии нужны? Или все понятно?

 
 
Krist (19:25 17-11-2012)
Цитата:
ASE_DAG, спасибо, большое за решение! скорость наманого больше чем мой самописный полускрипт.
 
P.S. честно искал тему, но на эту не обратил внимание, извините.
 
Добавлено:
Может еще кто подскажет, как из текстового файла выбрать и вывести строки с n по k например, пока только через split -l(количество_строк_от_n_до_k), но это костыль, долго потом удалять ненужные части файла.

 
> как из текстового файла выбрать и вывести строки с n по k
$ awk -v n=3 -v k=7 'NR==n, NR==k' file
или
$ n=3 k=7
$ sed -n "${n},${k}p" file

 


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 10:11 18-11-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо за ответ и что перенесли.  Для первой части вопроса нашел потоком решение на основе
 
Цитата:
cat /tmp/bla | uniq -c | grep "6" | sed 's/^\ *6\ //'

 
 не могу только нормальное регулярное выражение подобрать.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 12:15 18-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> спасибо за ответ и что перенесли
Да не за что.
 
> Для первой части вопроса
Речь о выводе строк, повторяющихся не менее, чем n раз, я так понимаю.
 
> cat /tmp/bla | uniq -c
Надеюсь, вы помните, что uniq работает только с сортированным потоком.
 
> grep "6" | sed 's/^\ *6\ //'
Что, Сед разучился грепать? И почему '6', а не '^\s*6'?
 
$ sort file | uniq --count | sed -n 's/^\s*6\s//p'
— дословно то, что вы хотели написать, но рабочее. Только не надо так делать.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:31 18-11-2012 | Исправлено: ASE_DAG, 14:32 18-11-2012
JekaRus

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Как из командной строки обновить данные в таблице mysql
Нужно выполнить такой скрипт UPDATE table set date='%data%';
где %data% это дата завтрашнего дня в формате 2012-11-19
То есть нужно чтоб скрипт к сегодняшней дате прибавлял 1 день

Всего записей: 1046 | Зарегистр. 10-08-2005 | Отправлено: 16:23 18-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
JekaRus
$ date -d tomorrow +%Y-%m-%d
2012-11-19


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:29 18-11-2012
JekaRus

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

Всего записей: 1046 | Зарегистр. 10-08-2005 | Отправлено: 01:57 19-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2 ASE_DAG
Есть какие-то преимущества при передаче параметров в awk:
 
$ awk -v n=3 -v k=7 'NR==n, NR==k' file
 
$ awk 'NR==n, NR==k' n=3 k=7 file

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 19:22 20-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Простите, я вашего вопроса не понял. Вы спрашиваете о разнице между этими двумя синтаксическими конструкциями?
 
Добавлено:
Если так, то посмотрите 6.1.3.2 Assigning Variables on the Command Line // The GNU Awk User's Guide.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:47 20-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Просто интересно, почему Вы используете контрукцию с -v ?
Для наглядности\читабельности, сила привычки либо иная причина?
 
Приведеная ссылка ссылается на Ваш локальный файл.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 23:22 20-11-2012 | Исправлено: kpp77, 23:23 20-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
> ссылка ссылается на Ваш локальный файл
На мой? В /usr/share/ нет моих файлов, у вас точно такой же, если gawk-doc установлен. Ну или найдите онлайновую копию, это элементарно — я же привел название. (P. S. Собственно, вот.)
 
> почему Вы используете контрукцию с -v?
Даже затрудняюсь предположить, каким может ответ на такой вопрос. Давайте сначала вы поясните, почему вы используете иную конструкцию, тогда я, может быть, пойму что отвечать. :-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:37 20-11-2012 | Исправлено: ASE_DAG, 23:42 20-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Что мешает поставить пакет gawk-doc и посмотреть что в файле?
И если уже догадались что за файл, то можно и в инете глянуть.
 
Добавлено:
ну раз ни кто не решился ответить, а я хочу спать то скажу с точки зрения сырого man'а: объясвлять переменные с ключом -v в самом начале намного лучшая привычка, т.к. в таком случае переменная будет доступна всегда в теле программы.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:40 20-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Да, но конкретно в данном случае, может быть и более уместно было бы передавать переменные позиционными параметрами, поскольку они тогда относились бы к следующему за ними файлу, что, во-первых, логично — мне нужны строки 3—7 именно этого файла, а не какого-то иного, а во-вторых позволяет выбрать разные строки из нескольких файлов, буде понадобится:
$ awk 'NR==n, NR==k' n=3 k=7 first-file n=10 k=12 second-file n=1 k=5 third-file

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:04 21-11-2012 | Исправлено: ASE_DAG, 00:05 21-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Если указана ссылка, по ней должен быть осуществлен переход.
Но указанная ссылка не сработает(как у меня: во FreeBSD и Debian работаю через консоль), если система как минимум не *никсовая.
Просто можно было указать путь без ссылки.
 
По поводу использования конструкции с передачей параметров - просто было интересно.
И на сколько знаю не все варинты awk "понимают" опцию -v (источник: Unix инструментальные средства Лукидис).

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 01:14 21-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
win32gui (12:40 21-11-2012)
Цитата:
Добрый день господа,  
 
Суть проблемы: Имею огромный текстовый фаил размером 11 гигабайт, информация в нём важная. Фаил получен объединением кучи текстовых файлов с различными кодировками (не досмотрели в своё время), посему на выхлопе имеем крякозяблы.
 
Мне тут подсказали про построчное чтение и перевод в другую кодировку программой enca и пишем в новый фаил, но как написать рабочий скрипт ума не хватает...
 
Или же ещё есть какие варианты по приведению текстового файла в единую кодировку ?

 
> про построчное чтение и перевод в другую кодировку программой enca
Каждую строку гонять на предмет определения исходной кодировки? 11 Гб? Может все-таки найдется разделитель, отсекающий куски в одной кодировке покрупнее? Как минимум двойным переводом строки исходные файлы при слиянии же разделялись?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:51 23-11-2012
win32gui

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну у вас и хочу спросить оптимальный вариант

Всего записей: 4 | Зарегистр. 21-11-2012 | Отправлено: 01:19 23-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
win32gui
Оптимальный вариант чего? Хранения текстовых данных? Ну уж точно не в виде одного одиннадцатигигабайтного файла.  
Только вам-то надо разбираться с тем, что есть, а не искать «оптимальный вариант». А что уж у вас там, я не знаю, это вы рассказывайте.
 
P. S. А запускать эвристическое определение кодировки на каждой строке не только долго, но и чревато ошибками — чем больше материала для обработки, тем, очевидно, точнее определение.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:33 23-11-2012 | Исправлено: ASE_DAG, 01:35 23-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
win32gui
Сколько разновидностей кодировок в файле?
Мне видится один вариант: просмотреть файл вручную, определенным образом отмечая\отделяя блоки текста в разных кодировках.
Затем можно автоматизировать.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:29 23-11-2012 | Исправлено: kpp77, 12:34 23-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи у меня какой-то нах происходит.
Не выполняется команда в скрипте:
# sed -i s/100/137/g /etc/pve/qemu-server/137.conf
sed: preserving permissions for `/etc/pve/qemu-server/sedTZE3dX': Function not implemented

 
Права у меня рутовые, как видно. Если выполнить эту команду на копию файла в домашнем каталоге, то всё работает нормально. Что такого в этом каталоге?
# ls -la /etc/pve/qemu-server/
total 4
drwxr-x--- 2 root www-data   0 Nov 19 17:21 .
drwxr-x--- 2 root www-data   0 Nov 19 17:21 ..
-rw-r----- 1 root www-data 274 Nov 21 15:59 100.conf
. . .
-rw-r----- 1 root www-data 274 Nov 23 15:01 137.conf
-rw-r----- 1 root www-data 388 Nov 23 13:31 201.conf

 
Добавлено:
Нет, у меня не Win32 среда, в которой я видел схожие ошибке на форумах. Всё происходит на почти обычном Debian Squeeze.
 
Добавлено:
Хрень! А ещё тут не отрабатывает команда stat:
# stat --printf='%m\n' /etc/pve/qemu-server/137.conf  
?

 
Ядро тут "особое":
# uname -a
Linux testlab 2.6.32-16-pve #1 SMP Fri Nov 9 11:42:51 CET 2012 x86_64 GNU/Linux


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:05 23-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Навскидку.
Ключ -i указывает на перезапись исходного файла, для выполнения операции sed пытается создать временный файл sedTZE3dX, а создать\записать в него не может в этом каталоге.
Не может установить права доступа к файлу.
а если попробовать :

Код:
sed s/100/137/g /etc/pve/qemu-server/137.conf > /etc/pve/qemu-server/137.conf_

 
Кстати почти на всех BSD системах ключа -i вообще нет (т.е. нет возможности изменять тотже файл). Приходится делать через явный промежуточный файл.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 15:25 23-11-2012 | Исправлено: kpp77, 15:50 23-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Капитан?
 
Вопрос в том, какого хрена?!
 
Добавлено:
Пока обнаружил следующее:
# mount
/dev/fuse on /etc/pve type fuse (rw,nosuid,nodev,default_permissions,allow_other)

Монтируется хз кем и как, но походу это делает скрипт /etc/init.d/pve-cluster вызовом утилиты pmxcfs.
 
Добавлено:
У-у-у... Не в ЭТО я лезть не хочу, поэтому просто обошёл этот косяк в несколько команд:
    cp "${configdir}${src}.conf" "/tmp/${dst}.conf"
    sed -i 's/'${src}'/'${dst}'/g' "/tmp/${dst}.conf"
    cp "/tmp/${dst}.conf" "${configdir}${dst}.conf"
    rm -f "/tmp/${dst}.conf"

 
По факту, я понял что они в своей Proxmox Cluster FS просто не реализовали часть команд, в том числе все команды связанные со сменой владельца.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:29 23-11-2012 | Исправлено: Alukardd, 16:49 23-11-2012
kpp77

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

Код:
sed 's/'${src}'/'${dst}'/g' "${configdir}${src}.conf" > "/tmp/${dst}.conf"
cp "/tmp/${dst}.conf" "${configdir}${dst}.conf"  
rm -f "/tmp/${dst}.conf"

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 16:49 23-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Да это уже не важно Ну да, на строку короче и на несколько команд быстрее с точки зрения системы.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:04 23-11-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток, господа.  
Может кто подскажет, есть набор команд
Код:
 cut -d "|" -f 7 logs.csv | grep -E '503\sService\sUnavailable|protocol\sunknown\sat\score' | read var;  php -r "echo urlencode($var);" > result
Как правильно декодировать полученные строки, совсем запутался.

Код:
http://www.xxx.com&q=%22http%3A%2F%2Fxxx.net%2F - 503 Service Unavailable

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 11:01 24-11-2012 | Исправлено: Krist, 12:29 24-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> Как правильно декодировать полученные строки
Если вы кодировали при помощи PHP, то почему бы и не декодировать с его же помощью? Функция urldecode().
 
> http://www.xxx.com
Хм. Хороший ресурс. :-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:00 24-11-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хехе ххх.com это так пример )
я понимаю чем декодировать и php -r "echo urlencode();" декодирует но только одну строчку, а в поток как встроить, у меня не получается ... не могу строчку переменной передать, читал мануалы по разному пробовал но что-то видно я пропустил

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 15:21 24-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> php -r "echo urlencode();" декодирует но только одну строчку
urlencode() не декодирует, а кодирует.
 
Т. е. вам надо применить percent-encoding к stdin и выдать stdout? Так бы и спрашивали.  
 
Я не знаком с php в роли интерпретатора inline-скриптов, поэтому могу предложить только perl.
 
$ echo 'One. Two.' | perl -nl -MURI::Escape -e 'print uri_escape($_);'
One.%20Two.

 
Ну и в вашем конкретном случае, если вы уж привлекли Перл, то cut c grep’ом уже не нужны.
 
$ perl -nla -F'/\s*\|\s*/' -MURI::Escape -e 'print uri_escape($F[6]) if /503\sService\sUnavailable|protocol\sunknown\sat\score/;' < logs.csv > result
 
> ххх.com это так пример
https://tools.ietf.org/html/rfc2606#section-3

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:44 24-11-2012 | Исправлено: ASE_DAG, 15:51 24-11-2012
Krist



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

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 16:06 24-11-2012 | Исправлено: Krist, 16:07 24-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Давно мучаюсь вопросом:
как в SH стандартными средствами (системы BSD) правильно преобразовывать строку символов в их 16-тиричные коды и наоборот?
На данный момент делаю через цикл, в цикле
Код:
awk '{printf "%c", $1}'


Код:
#awk --version
awk version 20091126 (FreeBSD)

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 13:02 27-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Есть стандартная BSD'овая утилита hexdump.
Так же есть утилита xxd — это уже кажется от vim'а подарок.
% xxd -p <<< "Some text"                    
536f6d6520746578740a
% xxd -r <<< "0x536f6d6520746578740a"
Some text


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:26 27-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
xxd, похоже делает то, что нужно, но его нет как и vim-а.
Как сделать тоже с помощью hexdump пока не уразумел, на первый взгляд эта утилита для несколько других целей...

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 15:03 27-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
А в чём проблема поставить xxd?
Извращаться можно по разному.... Можно и python подключить... Могу предложить такой вариант (издевательства sed'ом в зависимости от того какой вид хотите предать):
% printf "Some text" | od -t x1 | sed 's/[0-9]*//;s/ //g;/^$/d'
536f6d652074657874
% printf "536f6d652074657874" | sed 's/[0-9a-f]\{2\}/\\\\x&/g' | xargs echo -e
Some text

 
Добавлено:
Во фре из-за отсутсвия нормального echo, надо чуть-чуть извратиться:
% printf "Some text" | od -t x1 | sed 's/[0-9]*//;s/ //g;/^$/d'
536f6d652074657874
% printf "536f6d652074657874" | sed 's/[0-9a-f]\{2\}/\\\\\\\\x&/g' | xargs -I {} bash -c 'echo -e {}'
Some text


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:20 27-11-2012 | Исправлено: Alukardd, 16:28 27-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Благодарю за наводку.
Единственное, если длина строки будет более 16 символов, нужно еще удалять признак концов строк, ну и скрипт пишется под SH, а вызывать из SH BASH - не очень хорошо

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 17:21 27-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
>> % xxd -p <<< "Some text"
>> 536f6d6520746578740a
> Как сделать тоже с помощью hexdump пока не уразумел, на первый взгляд эта утилита для несколько других целей.
 
Для каких же?
$ hexdump -e '/1 "%02x"' <<< 'Some text'; echo
536f6d6520746578740a

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:26 27-11-2012 | Исправлено: ASE_DAG, 17:39 27-11-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Да можете хоть все 0x0a удалить...
 
А вот увы для обратного перевода без xxd приходится извращаться...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:55 27-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Благодарю.
Вот этого-то и не уразумел по hexdump.
 
Для обратного перевода лучше чем

Код:
# echo "536f6d652074657874" | sed 's/../ 0x&/g' | awk '{for(i=1; i<=NF; i++) {printf "%c", $i}}'
# Some text
пока не придумал.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 17:56 27-11-2012 | Исправлено: kpp77, 13:20 28-11-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
О! Вы еще что-то дописали спустя полсуток.
 
А вот что интересно — какой у вас АВК? gawk так типы вовсе не приводит.
 
$ echo "536f6d652074657874" | sed 's/../ 0x&/g' | awk '{for(i=1; i<=NF; i++) {printf "%c", $i}}'  
000000000

 
А mawk умудряется не понять цифры a-f (и A-F тоже, как такое вообще можно умудриться сделать?)
$ echo "536f6d652074657874" | sed 's/../ 0x&/g' | mawk '{for(i=1; i<=NF; i++) {printf "%c", $i}}'  
S00e text

 
 
 
Добавлено:
Ага. Нашел. То, что в Дебиане именуется original-awk, и является с небольшими изменениями собственно тем самым АВК’ом, написанным Ахо—Вейнбергером—Керниганом в 1988-м, ведет себя так, как вы продемонстрировали.
 
$ echo "536f6d652074657874" | sed 's/../ 0x&/g' | original-awk '{for(i=1; i<=NF; i++) {printf "%c", $i}}'  
Some text

 
И да, ключ -v он поддерживает, вы как-то упоминали, что это позднее расширение.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:04 29-11-2012
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Так себя ведет стандартный awk во FreeBSD7 - 8.
На Дебиане не проверял.
И такое поведение описано в книге Девида Тейнсли "Linux и Unix: программирование в shell" 2000г.
Если честно, то очень печально, что такая возможность не поддерживается или поддерживается неполностью в других вариантах\версиях awk.
 
 
Добавлено:
По поводу ключа -v я всего лишь ссылался на книгу Д. Пик, Т. О'Райли, М. Лукидис. "UNIX. Инструментальные средства" 2 издание, 2002г., где указано что в определенных реализациях awk ключ -v не поддерживается.
 
Добавлено:
И да, я ничего не упоминал что-либо с фразой "позднее расширение".

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 11:47 30-11-2012 | Исправлено: kpp77, 11:51 30-11-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как заставить aria2c  скачивать файлы по порядку, как по порядку файлов, так и по порядку внутри каждого файла? И может ли он использовать оперативку, то есть писать не сразу на диск.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:12 04-12-2012 | Исправлено: king_stiven, 16:23 04-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
Если под порядком вы подразумеваете поочереди, то видимо вы об этих трёх параметрах из man aria2c-j1 -C1 -s1 идёт речь.
А вопрос про оперативную память и диск мне как-то непонятен... Вы хотите что бы закачка шла полностью в оперативку пока там есть место? Зачем?

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:54 04-12-2012 | Исправлено: Alukardd, 16:56 04-12-2012
king_stiven

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

Цитата:
-j1 -C1 -s1

не то
-j
    Задать максимальное количество параллельных загрузок для каждого статического (HTTP/FTP) URI, torrent и metalink.
-c, --continue[=true|false]¶
 
    Продолжить загрузку частично загруженного файла.
-s, --split=<N>¶
 
    Загружать файл, используя N соединений.
 
 
Добавлено:

Цитата:
Вы хотите что бы закачка шла полностью в оперативку  

Нет, я хочу, чтоб как в utorrent  было, то есть используется оперативка скажем 50 mb. То есть не сразу блоки пишутся на диск. Это делается, чтоб не нагружать диск.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 17:01 04-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
Цитата:
не то  
Тогда переформулируйте мысль... Что значит по порядку?
Цитата:
То есть не сразу блоки пишутся на диск.
сама aria2 вроде как так не может, но ядро и так не пишет на диск постоянно.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:21 04-12-2012
king_stiven

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

Цитата:
Что значит по порядк

как в uttorent  под винду
 
bt.sequential_download
bt.sequential_files.
 
В результате добавления этого ключа наш utorrent начнет загружать блоки в файлах последовательно. Если ваш плеер (например KMPlayer или VLC плеер) поддерживает возможность просмотра недокачанных файлов - сможете просмативать фильм в процессе скачивания.
 Можно аналогично добавить параметр bt.sequential_files. Автоматизирует загрузку «по порядку» (сортировка по пути в .torrent файле) нескольких файлов в раздаче.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 17:31 04-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
Цитата:
у меня винда  
Интересное заявление
Цитата:
Операционные системы » UNIX » UNIX Shell

Ну во первых aria2 не только для закачки torrent'ов написана, так что уточнять обстоятельства стоит сразу.
Есть ключ --bt-prioritize-piece, правда хз что будет если вызвать его с параметром =head=10000M.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:45 04-12-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
--bt-prioritize-piece=head[=<SIZE>],tail[=<SIZE>]¶
 
    Пытаться загрузить сначала первую и последнюю части каждого файла.
 
Даже не знаю, то не то.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 18:29 04-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
Что за манера читать по пол строки от справки, прочтите целиком абзац.
И да, приводя сюда цитату из man'а Вы чего добиться хотите? Или Вы думаете, что  я опции из головы штампую?
 
То, не то. Это узнаешь когда попробуешь в нескольких видах:
--bt-prioritize-piece
--bt-prioritize-piece=head
--bt-prioritize-piece=head,tail
--bt-prioritize-piece=head=10000M


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:31 04-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
всем доброго дня, может кто поскажет как разделить файл по первым буквам строки, делаю сейчас так grep -E '^x.*', но как сделать одной командой? В split по описанию можно с параметром -p, но у меня почему-то не выходит, не могу шаблон подобрать.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 16:38 05-12-2012 | Исправлено: Krist, 16:41 05-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Цитата:
как разделить файл по первым буквам строки
а что на выходе должно получиться? Образце какой что ли... 26 отдельных файлов?

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:41 05-12-2012
Krist



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

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 16:56 05-12-2012 | Исправлено: Krist, 16:58 05-12-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
$ awk -v FS='' '{ print >> tolower($1) }' yourfile
 
Комментарии нужны?
 
И да, я просто теряюсь в догадках, зачем это может спонадобиться.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:37 05-12-2012 | Исправлено: ASE_DAG, 17:56 05-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вот такая ошибка
 
# awk -v FS='' '{r($1) }' test
awk: (FILENAME=test FNR=4) fatal: expression for
n has null string value
 
а скрипт нужен для предварительного разбиения файла БД перед уникализацией, очень большие размеры от 40 Гб.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 18:01 05-12-2012 | Исправлено: Krist, 18:03 05-12-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> # awk -v FS='' '{r($1) }' test
Ну и что это, позвольте узнать, за '{r($1) }'?
 
Добавлено:
Впрочем, если бы дело было только в этой фигне, которую вы невесть откуда взяли, то ошибка была бы другая — awk: cmd. line:1: (FILENAME=../test FNR=1) fatal: function `r' not defined
 
А здесь дело, по-видимому, в том, что я опрометчиво положил, что любая строка обязательно содержит первый символ, когда у вас там есть и пустые. Нужна проверка:
 
$ awk -v FS='' '$1 { print >> tolower($1) }' yourfile

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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
'{r($1) }'?  это так с терминала скопировал некорректно.
 
Большое спасибо! Скрипт работает только счас допилить попробую чтоб он только [a-zA-Z0-9] раскидывал (а все остальное в один файл) и не вылетал когда точку встречает awk: (FILENAME=test FNR=4516) fatal: can't redirect to `.' (Is a directory)

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 22:43 05-12-2012 | Исправлено: Krist, 22:45 05-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Цитата:
счас допилить попробую
awk -v FS='' '/^[a-zA-Z0-9]/{ print >> tolower($1) }' yourfile
Правда, я хз как Вы смотрите на то, что остальные строки будут потеряны, например те что начинаются с точки.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:47 05-12-2012
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый вечер Alukardd
Прошу прощения, а чем плохо решение типа ?
awk -v FS='' '/^[a-zA-Z0-9]/{ print >> tolower($1) } ; !/^[a-zA-Z0-9]/{ print >> "@" }' yourfile

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 23:21 05-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо за помощь
добавил в хвост grep -E "^[^a-zA-Z0-9].*" test > other (не видел предыдущего сообщения когда писал это)
 
Только почему-то я думал что в [a-zA-Z0-9] входит только английские буквы, а он раскидал еще и остальные, которых очень мало. Пробовал awk -v FS='' '/^\p{L}/{ print >> tolower($1) } ; !/^\p{L}/{ print >> "@" }' не получается.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:21 05-12-2012 | Исправлено: Krist, 00:04 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Ну потому что формулируя задачу надо изъясняться чётко, что на выходе, а что на входе.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:25 05-12-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> почему-то я думал что в [a-zA-Z0-9] входит только английские буквы
Да, в [a-zA-Z0-9] должны входить только 26 букв обоих регистров и десять цифр, вне зависимости от локали. У вас не так?
 
Покажите
$ awk -v RS=' ' -v FS='' '$1 ~ /[a-zA-Z0-9]/' <<< 'a z b &#228; ф'
 
Добавлено:
Гребаный Руборд! &#228; — это а-умляут.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 09:22 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Кстати, весьма не ожидал такого вывода, я думал что это цельный символ, а он идёт как символ "a" с дополнением и проходит фильтр. Печально.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 10:17 06-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
awk -v RS=' ' -v
FS='' '$1 ~ /[a-zA-Z0-9]/' <<< 'a z b&#8200;&#228;&#8200;ф'
a
z
b&#8200;&#228;&#8200;ф
 
вот так получилось  
 
Добавляю. Не так получилось а получились те же символы что и на вводе. Локаль US.UTF-8.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 14:21 06-12-2012 | Исправлено: Krist, 14:44 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
А "ф"-то каким макаром пролезла?
И почему у Вас вечно изменяется конструкция откуда эти u2008 символы взялись вместо стандартных пробелов?

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:24 06-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В терминале все отображалось корректно и при копировании в текстовом редакторе перед отправкой сюда тоже и в форме поста корректно, все символы появились здесь.
 
ф это с предложенной Вами команды в посте от 08:22 06-12-2012

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 16:37 06-12-2012 | Исправлено: Krist, 16:54 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Во-первых, пост не мой, а т. ASE_DAG.
Во-вторых, недоумение по поводу "ф" вызывает вывод, а не входная строка.
 
Добавлено:
Кстати, mawk отработал более правильно на мой взгляд. Он не пропустил буквы с "загогулинами".
Причём ключ -W posix на результате не сказывается...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:18 06-12-2012
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое спасибо всем за участие! С mawk все работает.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 19:19 06-12-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, где ошибка. Вот такой скрипт не хочет работать:

Код:
#!/bin/bash
for NAME in * ; do
catdoc "$NAME" > "$NAME.txt"
 if [[ `file -b "$NAME"` == directory ]]; then
 cd "$NAME"
 "$0"
 cd ..
 fi
done

catdoc - конвертор из *doc в *.txt
Особенность - имена файлов русскими буквами и с пробелами.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:53 06-12-2012 | Исправлено: Maximus777, 22:27 06-12-2012
Alex_Piggy

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

Код:
 
#!/bin/bash  
MyScript=`readlink -f $0`
for NAME in * ; do  
 if [[ `file -b "$NAME"` == directory ]]; then  
 cd "$NAME"  
 "$MyScript"
 cd ..  
 else catdoc "$NAME" > "$NAME.txt"  
 fi  
done
 

или  

Код:
 
IFS=$'\n'; for i in `find . -type f -name "*"`; do catdoc "$i" > "$i.txt"; done
 

Объяснить, к сожалению, не могу.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 22:29 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Цитата:
`file -b "$NAME"` == directory
во-первых, вместо ``, лучше использовать $().
Во-вторых, это полный извратif [[ -d "$NAME" ]]; then, за справкой, man bash или man test, почему "или" читать в man bash.
 
А что хоть за ошибку выдаёт?
 
А вообще всё это я не пойму к чему, да ещё и с рекурсией скрипта, что противопоказано!
 
find /your/folder/with/docs -type f -exec sh -c 'catdoc "{}" > "{}.txt"' \;
 
Добавлено:
Alex_Piggy
Ещё один извращенец

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:43 06-12-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_PiggyСпасибо. Воспользовался вторым вариантом. Там всё более менее понятно, кроме:
IFS=$'\n';

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:45 06-12-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Это изменение разделителя записей во входном потоке — утилита find выдает по записи на строку, а по умолчанию for ждёт пробел, а не перевод строки.
НО это как я написал find сам всё может обработать.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:46 06-12-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
find /your/folder/with/docs -type f -exec sh -c 'catdoc "{}" > "{}.txt"' \;

О! Это вообще Дзен! А что значит "sh -c"? В двух словах, если не трудно. В смысле ясно, что запуск команды, но почему -exec недостаточно?
 
За советы спасибо. Постараюсь запомнить. В итоге вот такую оставил команду:

Код:
find . -type f  -exec sh -c 'catdoc "{}" > "{}.txt"' \;

Всё переколбасилось отлично. Но "sh -c" для меня слишком замудрённое. И man sh ситуацию не сильно прояснил.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:51 06-12-2012 | Исправлено: Maximus777, 23:15 06-12-2012
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:08 07-12-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Потому что перенаправление вывода (>) — функционал шелла, а -exec запускает исполняемый файл, указанный аргументом, непосредственно (не в шелле).

Благодарю за разъяснение. Теперь всё понятно.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:06 07-12-2012
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Коллеги, а как можно работать в tcsh с файлами,  имена которых содержат пробел? В bash`е IFS достаточно подправить и можно работать. А что делать с tcsh ума не приложу. Там этой переменной нема.

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 21:31 29-12-2012
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:37 29-12-2012
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Прошу прощения за суточное молчание, но тут выяснилось досадное недоразумение. В сборке где я хотел поставить этот эксперимент нет команды for. А предлагать скрипт написанный под башем мне кажется не совсем корректным.

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 00:21 31-12-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
> предлагать скрипт написанный под башем мне кажется не совсем корректным
Есть мнения [1] [2], что некорректно вообще писать скрипты на Си-шелле.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:24 31-12-2012
urodliv



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

Цитата:
Есть мнения [1] [2], что некорректно вообще писать скрипты на Си-шелле.

Мнение поддерживаю, но не в силу своих выдающихся знаний, а токмо по лености переучивания. Беда в другом. Иногда приходится выбирать (по собственной лености/тупости) уже готовые дистрибутивы. А их авторы не всегда разделяют подобные мнения.

Цитата:
Поясните, что вы такое работаете с файлами, что кавычки не спасают.

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

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 12:29 01-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
> готовые дистрибутивы. А их авторы не всегда разделяют подобные мнения.
Забавно, не встречал таких, что, впрочем, неудивительно — за пределами ГНУ я сталкивался только с FreeBSD, и то очень поверхностно. В общем, покажите, пожалуйста, пальцем в тот дистрибутив, где системообразующие скрипты написаны на Си-шелле — это мне для общего развития.
А вас все-таки никто не обязывает вас писать на нем же, благо борн-совместимый шелл просто обязан быть в любой юникс-подобной системе под именем /bin/sh.
 
> Разрешите вам не отвечать на этот вопрос
Да пожалуйста. Просто в таком случае, я, увы, никак не смогу ответить на ваш вопрос по существу.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:44 01-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть база текстовая:
april
april aleksey
april boris
april boris aleksey
april boris sanya
april victor
april victor sanya aleksey
april victor vanya  
april zhenya
april zina aleksey
april zina boris
december boris zina vasya
may aleksey victor
may boris
may boris aleksey zhenya
may boris zina
may zhenya
may zina victor aleksey boris
may zina victor boris aleksey
october  
october vasya
из этой предварительно отсортированной базы нужно извлечь название месяца и три полностью рандомных строчки с этого месяца. На AWK написал следующий скрипт:

Код:
BEGIN {vari="none";FS=" "; c=0; }
$1!~/[\)\(]/ {if ($1~vari)  
        {arr[c]=$0;
        if (c<500) {c=c+1} else {c=c+0}; #c-number of rezov v pamyat' pri obrabotke
        vari=$1}
 else  
        {
        if (c>1) {print vari};
        k=3; n=c; srand (); #k-number of rezov s mesyaca  
        for (i = 0; n > 0; i++)   if (rand() < k/n--) { print arr[i]; k--;} ;
        delete arr;  
        c=1; vari=$1;arr[0]=$0  
         }    
}  

однако с течением времени задача поменялась и не в лучшую сторону. Необходимо вывести 3 строки с разными количествами столбцов (при их наличии). Много пробовал и думал, так и не осилил может кто поможет?
Где-до понимаю что надо сперва вывести в несколько массивов с разым количеством столбцов, потом сперва из каждого массива по результату, потом рандом из этиз результатов, но как это реализовать

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 21:49 08-01-2013 | Исправлено: Krist, 22:03 08-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что значит "полностью рандомные строчки" ?
Какие именно 3 строки с разными кол-вами столбцов необходимо вывести? Первые попавшиеся?

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 22:46 08-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
"полностью рандомные "в случае старого скрипта можно "полностью' опустить.  
По 3 строкам с разными кол-
вами столбцов я имел ввиду что например собрать массивы с 1, 2, 3-мя  (максимум 3 стобца, больше все в 1 массив). столбцами, затем из этих массивов выбрать по одной случайной строке из каждого и среди них 3случайных строки. Т.е. не первые попавшиеся а случайные.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:57 08-01-2013 | Исправлено: Krist, 00:30 09-01-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Ух, как тяжко мне даются такие скрипты... Всю голову сломал пока просчитал как цикл надо сделать, плюс синтаксические ошибки... Жесть в общем.
Результат выглядит так:
Код:
#!/usr/bin/gawk -f
{
  while ($1 == month)
  {
    switch (NF-1)
    {    
      case 1: w1[++i]=$0; break
      case 2: w2[++j]=$0; break
      case 3: w3[++k]=$0; break
    }    
    if (getline == 0)
      break
    if ($0 == "")  
      next
  }
  print "*"toupper(month)"*"
  month=$1
  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
  i=j=k=0
  switch (NF-1)
  {
    case 1: w1[++i]=$0; break
    case 2: w2[++j]=$0; break
    case 3: w3[++k]=$0; break
  }
}
Код не самый красивый, зато на сколько смог проверить рабочий. Так же, на всякий, добавил защиту от пустых строк.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:21 09-01-2013 | Исправлено: Alukardd, 17:26 09-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ого, попробовал, работает! Спасибо большое. Я таких операторов в примерах не видел, пойду читать мануалы, что да как.  
Сила руборда forever.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 20:08 09-01-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Всегда пожалуйста. Можно навести некую красоту, конечно... Например, вынести дублирующийся switch в функцию.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:38 09-01-2013 | Исправлено: Alukardd, 21:38 09-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну не знаю, как по мне, можно поступить проще (к тому же gawk-а у меня в базе нет ни в Дебиане, ни во ФриБСД...):

Код:
 
mas_i="`grep -v " " vhod`"
echo "${mas_i}"
echo
mas_j="`grep -E "^[a-z]* [a-z]*$" vhod`"
echo "${mas_j}"
echo
mas_k="`grep -E "^[a-z]* [a-z]* [a-z]*$" vhod`"
echo "${mas_k}"
echo
echo "  Random strings:"
get_random_str "${mas_i}"
get_random_str "${mas_j}"
get_random_str "${mas_k}"
 

Функция get_random_str :
под bash и если нет утилиты jot

Код:
get_random_str()
{
  a=`echo "${1}" | wc -l | tr -d " "`
  a=($a+1)
  number=${RANDOM}
  let "number %= ${a}"
  [ ${number} -eq 0 ] && number=1
  echo "${1}" | sed -n "${number}p"
}
 

Если есть утилита jot (по умолчанию есть во ФриБСД, например)

Код:
 
get_random_str()
{
  a=`echo "${1}" | wc -l | tr -d " "`
  number=`jot -r 1 1 ${a}`
  echo "${1}" | sed -n "${number}p"
}
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Во-первых, я вроде ни чего специфичного для gawk не использовал, так что это обычный awk.
Во-вторых, в чём проблема установить gawk? Что в портах фри, что в репах дебиана лежит ждёт пока его накатят.
В-третьих, разбирать строку grep'ом это жесть, к тому же на переключении между утилитами (bash, sed, grep) получается огромный overhead. Если сравнить производительность на исходном файле хотя бы в 10Мб, то ой как разница будет видна...
 
И самое главное, у Вас не законченное, не корректное относительно условия решение. У вас нету разбивки по месяцам. Вы не внимательно читали изначальный пост вопрошающего.
 
Кстати, Вы ещё почему-то ограничили имена только буквами ([a-z]), да ещё и маленькими, тогда уж grep -i?
Дальше, использовать квантификатор * тут не особо умно, т.к. 2-ой пробел даст ложные срабатывания, а тройной так вообще всё испортит, я уже не говорю о trailing space, который далеко не редкость.
 
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:29 10-01-2013 | Исправлено: Alukardd, 00:35 10-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Упаси Боже к чему-то или к кому-то придираться. (Где Вы заметили придирки?)
Это всего-лишь еще один вариант решения.
Ведь в программировании основная мощь - множество вариантов решения одной задачи.  
В моем дистрибутиве ФриБСД Ваш вариант в чистом виде не заработал.
Разбираюсь почему.
Согласен, что правильно понятое условие задачи - 50% решения.
Про разбивку по месяцам в задании не наблюдаю...
Условия, в которых скрипт должен выполнять свою работу, могут быть разные, очень разные.
Насчет "то, что Вы на писали совсем ни куда не годится" - и меня еще кто-то упрекает в придирках?

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 02:15 10-01-2013
Alukardd



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

Цитата:
из этой предварительно отсортированной базы нужно извлечь название месяца и три полностью рандомных строчки с этого месяца


----------
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.

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Новое условие разве не начинается после фразы:
Цитата:
однако с течением времени задача поменялась и не в лучшую сторону.
?
А затем уточнение условия:
Цитата:
"полностью рандомные "в случае старого скрипта можно "полностью' опустить.  
По 3 строкам с разными кол-  
вами столбцов я имел ввиду что например собрать массивы с 1, 2, 3-мя  (максимум 3 стобца, больше все в 1 массив). столбцами, затем из этих массивов выбрать по одной случайной строке из каждого и среди них 3случайных строки. Т.е. не первые попавшиеся а случайные.

Ограничения [a-z] и одним пробелом внесены исходя из предоставленного условия.
При наличии более точной постановки задачи (набор возможных символов, разделитель полей, объем текстовой базы, окружение выполнения и т.д.) всегда можно доработать или переработать скрипт.
 
Версия awk во FreeBSD не понимает конструкцию switch, переделал на if-ы, тестирую.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Цитата:
Ограничения [a-z] и одним пробелом внесены исходя из предоставленного условия.  
вижу только фразу про количество столбцов, на что я тоже завязал свой код. Ни слова про то что там только буквы, причём только в нижнем регистре. И тем более ни слова про то, что разделитель именно одиночный пробел. И как я уже упомянул, пробел в конце строки так же не даст вашему скрипту работать корректно.
 
Действительно во фре даже с gawk'ом он отказался понимать switch, т.к. бинарный пакет, который я поставил через pkg собран без опции --enable-switch, в отличии от аналогичного в Debian. Собственно собрал из портов с нужней опцией, всё завелось. Правда пришлось предварительно ещё массивы инициализировать, хз почему он этого требовал.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:19 10-01-2013 | Исправлено: Alukardd, 13:22 10-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если нужна разбивка по месяцам:

Код:
# разделитель полей
rz=" "
# набор допустимых символов в полях
nabor="a-z"
# кол-во строк
kol_str="1 2 3"
 
sort -u +0 -1 file_name |\
while read month mes
do
  echo "*${month}*"
  for i in ${kol_str}
  do
    mas="`grep -E "^${month}(${rz}[${rz}]*[${nabor}]*){${i}}$" file_name`"
    [ -n "${mas}" ] && get_random_str "${mas}"
  done
done
 

 
Добавлено:

Цитата:
Ни слова про то что там только буквы

В условии приведена текстовая база, из которой явно следует: буквы в нижнем регистре и одиночный пробел.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 13:24 10-01-2013 | Исправлено: kpp77, 13:30 10-01-2013
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.

Всего записей: 6563 | Зарегистр. 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

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

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

Всего записей: 6694 | Зарегистр. 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.

Всего записей: 6563 | Зарегистр. 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
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Лишний ключ g для сортировки.
Скрипт обновлен в предыдущем посте.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 23:38 21-01-2013 | Исправлено: kpp77, 00:30 22-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго всем времени суток, есть задача сравнить два файла по первому столбцу и удалить строки с повторяющимся столбцом, использую скрипт
Код:
awk -F"/" '{printf "%s\n", $1}' minus.txt | egrep -v -f - input.txt > output.txt

 
minus.txt
seconddomain.com
firstdomain.com
 
input.txt
seconddomain.com/cvewvwe/vewsvwe
seconddomain.com/vewv/vewfvew
seconddomain.com/ed32rf2/f42f432
thirddomain.com/f32f/f32f32
thirddomain.com/f23
firstdomain.com/f32f32543/f42
firstdomain.com/f32f32
 
output.txt
thirddomain.com/f32f/f32f32
thirddomain.com/f23
 
 
Может кто подскажет как сделать, чтоб построчно сравнивать? Т.е. чтоб просто брать из minus.txt по строке и проводить ее через grep, затем с полученным файлом вновь провести ту же операцию но уже со второй строкой файла minus.txt? Варианты с массивами не подходят, не хватает памяти, понимаю что тупо строки по 1 тоже не эффективно но решения  в голову не приходит.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:11 22-01-2013 | Исправлено: Krist, 23:20 22-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Так в чем вопрос-то?
 
Добавлено:
Так, хорошо, вопрос вы добавили. Но понятней, чего вы желаете, мне пока не стало. Вы хотите сказать, что на то решение, что вы здесь привели не хватает памяти? Т. е. у файла minus.txt сверхбольшой об’ем?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:16 22-01-2013 | Исправлено: ASE_DAG, 23:30 22-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, получается забивается память и виснет компьютер,  как я понимаю результатом из
Код:
awk -F"/" '{printf "%s\n", $1}' minus.txt
не сверхбольшой, но где-то 1 млн строк по 20 символов с среднем.  
Еще раз повторюсь что я понимаю, что "грепать 1 млн раз" это идиотизм, есть еще решения чисто через awk используя NR == FNR, там тоже массивы и те же проблемы.
 
Может естть какие-то версии comm или diff которые работают не только со строками, но и колонками?

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:40 22-01-2013 | Исправлено: Krist, 23:43 22-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
А чем не устраивает существующее решение?
Если построчно, то в цикле, но непонятно для чего.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 23:43 22-01-2013 | Исправлено: kpp77, 23:44 22-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> где-то 1 млн строк по 20 символов с среднем
Т. е. всего лишь 20 Мб или того меньше? Чем же тут можно «забить память»?
 
Дайте реальные файлы minus.txt и input.txt, я попробую поизучать, что там происходит.
 
Добавлено:
kpp77
> А чем не устраивает существующее решение?

Цитата:
...получается забивается память и виснет компьютер,  как я понимаю результатом из...


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:48 22-01-2013 | Исправлено: ASE_DAG, 23:53 22-01-2013
Krist



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

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 00:03 23-01-2013 | Исправлено: Krist, 00:06 23-01-2013
kpp77

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

Код:
sort minus.txt > minus_sort.txt
sed '/\//!s~.*~&\/~; s~\(^[^\/]*\)\/.*~\1 &~' input.txt | sort +0 -1 > input_sort_txt
join -a1 -o 2.1 1.2 input_sort_txt minus_sort.txt | sed -n '/^ /s~^ \(.*\)~\1~p' > output.txt
 

Самому интересно как поведет себя join в этом случае

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 00:06 23-01-2013 | Исправлено: kpp77, 00:27 23-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Ну вот подумайте, зачем мне «кусочек», когда у нас проблема проявляется только на больших об’емах. А? :-) Давайте целиком, благо мест куда можно залить пару сотен мегабайт в Сети масса.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:15 23-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ради такого дела, можно залить мне на фтп

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 00:19 23-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG поймите меня правильно, но там не только моя работа (, не могу.
join я тоже пробовал сперва, почему-то после сортировки все равно
Цитата:
join: file 1 is not in sorted order
, и конкретно Ваш скрипт ничего не сделал ( я до этого сам отсортировал, но для надежности не убирал из Вашего набора команд) ... вообще какие-то чудеса, только добавил пустых строк в начале %2 по общему количеству строк.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 00:22 23-01-2013 | Исправлено: Krist, 00:25 23-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Если пишет join: file 1 is not in sorted order - значит неправильно отсортировано для join.
На Вашем примере-кусочке все отлично работает.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 00:25 23-01-2013 | Исправлено: kpp77, 00:35 23-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> но там не только моя работа (, не могу
Ну значит сгенерируйте другую пару файлов тех же свойств и об’ема, на которой проблема проявляется. Что еще я вам могу предложить?
 
Добавлено:
Krist
Хотя, вот что я вам могу предложить:
 
$ awk -F '/' '{print $1}' minus.txt | grep -F -v -f - input.txt > output.txt
 
— попробуйте, я думаю, время выполнения существенно сократится.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:36 23-01-2013
Krist



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

Цитата:
I got the same error with Ubuntu 11.04, with sort and join both in version (GNU coreutils) 8.5.
 
They are clearly incompatible. In fact the sort command seems bugged: there is no difference with or without the -f (--ignore-case) option. When sorting, aaB is always before aBa. Non alphanumeric characters seems also always ignored (abc is before ab-x)
 
Join seems to expect the opposite... But I have a solution
 
In fact, this is linked to the collation sequence : unsing LANG=en_EN sort -k 1,1 <myfile> ... then LANG=en_EN join ... worked.
 


Код:
sort minus.txt > minus_sort.txt && sed 's~\(^[^\/]*\)\/.*~\1 &~' input.txt | sort -k 1,1 > input_sort_txt && join -a1 -o 2.1 1.2 input_sort_txt minus_sort.txt | sed -n '/^ /s~^ \(.*\)~\1~p' > output.txt

Только у меня один вопрос, что значило sort +0 -1.
 И маленькая проблемка (думаю сам разберусь, правда мне нравится больше AWK, но с SED разберусь) почему-то оставляет пустую строку в месте где первая строка (у которых только 1 столбец без разделителя) некоторых групп

Цитата:
realnation.co.kr
realnation.co.kr/tt/board/ttboard.cgi?act=popup&db=rose_festival&idx=11395
realnation.co.kr/tt/board/ttboard.cgi?act=popup&db=rose_festival&idx=11633
realnation.co.kr/tt/board/ttboard.cgi?act=popup&db=rose_festival&idx=9515  

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 02:15 23-01-2013 | Исправлено: Krist, 02:21 23-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> весьма благодарен, все заработало
Вы про grep -F? Что ж, всегда пожалуйста. Комментарии по этой части нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:18 23-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
хех да это понятно (если Вы про пробелы), да мне еще и строка нужна была на месте которой пробелы, сделал так:
 

Код:
 
grep -v "^\s*$"
 
vernu_stroku.awk:
BEGIN {vari="none";FS="/"; c=0; }
{
            if ($1~vari)  
            {
            arr[c]=$0
            c=c+1
            vari=$1
            }
            else  
            {
            print vari
            for (i = 0; c > 0; i++)  { print arr[i]; c--;}
            delete arr
            c=1
            vari=$1
            arr[0]=$0
            }    
        }

 
Всем спасибо за помощь, силу Ру-Борда вечна.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 04:27 23-01-2013 | Исправлено: Krist, 04:31 23-01-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Скопируйте еще раз скрипт со join (я внес изменения по этому поводу).
Попробуйте, если есть время.
И еще просьба, оцените время выполнения (time перед именем скрипта) всех вариантов скриптов.
Интересно на ваших объемах.
sort +0 -1 - это эквивалент sort -k1,1

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:30 23-01-2013 | Исправлено: kpp77, 12:31 23-01-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> да это понятно (если Вы про пробелы)
Нет, о пробелах я ничего не говорил. Я говорил о режиме --fixed-strings вместо --extended-regexp.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:03 23-01-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77 извиняюсь что ответил через время, если сравнивать способ через join и awk+grep, то особо нет смысла, т.к. через grep были значительные потери, в минусуемые строки попадались домены 2-го уровня и соответственно откидывались ссылки с доменами третьего уровня

Цитата:
Скопируйте еще раз скрипт со join (я внес изменения по этому поводу).  
пока не получится, занята машина, но обязательно попробую, спасибо!
ASE_DAG

Цитата:
Я говорил о режиме --fixed-strings вместо --extended-regexp.
да честно особо не вдаваюсь обычно, сперва всегда пробую --fixed-strings, если ругается, то правлю на --extended-regexp ... скорость сильно падает, но терпимо.
 
Вообще честно только месяц назад первый раз попробовал что-то обрабатывать на *nix системах (до этого только Win) и понял, что я просто терял время с этими мелкомягкими (. Там вставляеш в какой-нить Textpipe и неделю ждеш, а тут 3 часа подумал, потыкался и через 3 часа результат ... впечатляет.

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:09 24-01-2013
askad

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Нужно телнетится к Cisco и проверять ошибки в ip nat translation и если они есть, то чистить их.
Если ошибки есть, то после ввода команды: show ip nat tran | i err
выдается строка: icmperr ---------- ip address
 
Подскажите, как правильно составить условие для проверки вывода.  
 

Код:
#!/usr/bin/expect
 
log_user 1
set timeout 100
spawn telnet 192.168.2.1
expect "Username: "
send "aleks\r"
expect "Password: "
send "qwerty\r"
expect "*#"
 
send "sh ip nat tran | i err\r"
 
if...expect "*icmperr*"
then  send "clear ip nat tran *"
else...send "exit\r"

 
expect eof

Всего записей: 50 | Зарегистр. 11-04-2003 | Отправлено: 13:53 08-02-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
askad
Ну, для ответа на ваш вопрос надо определиться с тем, что вы держите за else. Если любую строку (т. е. последовательность символов, заканчивающихся переводом строки), то красный участок вашего примера, очевидно, может выглядеть так:
 
expect {
    "*icmperr*"    {send "clear ip nat tran *"}
    "\n"           {send "exit\r"}
}

 
Почему у вас, кстати, команда exit заканчивается возвратом каретки, а clear — нет?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:20 08-02-2013 | Исправлено: ASE_DAG, 20:22 08-02-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
askad
Да вроде гуглится этот вопрос без труда, собственно частый вопрос весьма.
Код:
expect {
    "*icmerr*" {
       send "clear ip nat tran *"
       expect eof
       return 0
    }
    send "exit\r"
    expect eof
    return 0
}
# timed out
return 1
не проверял, но вроде всё так...
 
Добавлено:
ASE_DAG
Я так понял, что при открытии expect {} в нём и надо оставаться, т.е. за его пределами программа не совсем продолжит выполнение, я не прав? Я с expect очень мало работал.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:25 08-02-2013 | Исправлено: Alukardd, 20:26 08-02-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> не проверял
Напрасно. Я вот сейчас попробовал проверить и не обнаружил обстоятельств, при коих send "exit\r" выполнится. Что мне кажется логичным. Где вы прочли, что можно опускать паттерн? Я вижу, что тело — можно, а паттерн — нет:

Цитата:
      expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]
expect(1)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:39 08-02-2013 | Исправлено: ASE_DAG, 22:40 08-02-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
askad
Так каковы ваши успехи?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 10:17 10-02-2013 | Исправлено: ASE_DAG, 10:18 10-02-2013
askad

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

Цитата:
команда exit заканчивается возвратом каретки, а clear — нет?

Да, Вы правы, забыл возврат каретки добавить.
 
 
В данный момент тестится вариант ASE_DAG. Правда ошибка еще не появлялась и сказать о каком-либо результате не могу.
Камрады, буду держать в курсе.

Всего записей: 50 | Зарегистр. 11-04-2003 | Отправлено: 09:26 11-02-2013 | Исправлено: askad, 09:48 11-02-2013
wcas

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
 
Нужна помощь.  
 
Есть каталог YYY. И есть структура на сайте:
 
site1.ru/wp-content/plugins/
site2.ru/wp-content/plugins/
...
site10.ru/wp-content/plugins/
 
Нужно скопировать каталог YYY во все каталоги "plugins", которые имеются на сервере. Подскажите, как реализовать.
 
Заранее благодарю!

Всего записей: 1 | Зарегистр. 13-02-2013 | Отправлено: 13:32 13-02-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wcas
Я всё проводил в  каталоге /tmp, так что поправьте пути на те, чт оу Вас в системе.
find /tmp -type d -path '*site[0-9]*.ru/wp-content/plugins' -exec cp -r /tmp/YYY {} \;
 
маску посика я так же подстроил ровно под то, что вы написали, т.е. site[0-9]*

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:40 13-02-2013
tolyn77



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
здравствуйте
 
подскажите как можно через shell скрипт за-tar-ить каждый каталог в отдельный архив?
у меня есть каталог в котором есть подкаталоги вот их нужно и по-tar-ить
заранее благодарен

Всего записей: 1498 | Зарегистр. 07-09-2004 | Отправлено: 08:25 15-02-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tolyn77
На данный вопрос Вам хоть и ответили в теме, которую я вообще удивлён что нашли, но зачем использовать pipeline?... Корректнее будет так:
find /etc -mindepth 1 -maxdepth 1 -type d -exec sh -c 'tar -cf "/tmp/test/$(basename "{}.tar")" "{}"' \;
Архивируем каталоги внутри /etc/, архивы лягут в папку /tmp/test.
p.s. Так в архиве будут находится каталоги с полным путём до них, если это Вам мешает, можно немного подправить команду:
find /etc -mindepth 1 -maxdepth 1 -type d -exec sh -c 'tar -C "$(dirname "{}")" -cf "/tmp/test/$(basename "{}.tar")" "$(basename "{}")"' \;

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 11:46 15-02-2013 | Исправлено: Alukardd, 12:10 15-02-2013
askad

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

Цитата:
ASE_DAG  
Alukardd  
 
В данный момент тестится вариант ASE_DAG. Правда ошибка еще не появлялась и сказать о каком-либо результате не могу.  
Камрады, буду держать в курсе.

 
Ошибка появилась, скрипт сработал на отлично. Доволен як слон.
Повесил мониторить по кронтабу.

Код:
#!/usr/bin/expect
 
log_user 0
set timeout 100
spawn telnet 192.168.2.1
expect "Username: "
send "aleks\r"
expect "Password: "
send "qwerty1234\r"
 
expect "*#"
send "sh ip nat tran | i err\r"
 
expect {
    "icmperr*"  {send "clear ip nat tran *\r"}
    "*#" {send "exit\r"}
}
send "exit\r"
expect eof

Всего записей: 50 | Зарегистр. 11-04-2003 | Отправлено: 13:28 15-02-2013
tolyn77



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

Всего записей: 1498 | Зарегистр. 07-09-2004 | Отправлено: 14:46 15-02-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
askad
> скрипт сработал на отлично
Славненько. Обращайтесь, если что. :-)
 
Alukardd
> $ find /etc -mindepth 1 -maxdepth 1 -type d -exec sh -c 'tar -C "$(dirname "{}")" -cf "/tmp/test/$(basename "{}.tar")" "$(basename "{}")"' \;
ОМГ.
 
/etc$ for d in */; do tar -cf "${d%/}.tar" "$d"; done

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:02 15-02-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Оч, хотелось find использовать

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:10 15-02-2013
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто знает быстрый шелл-скрипт на проверку соответствия IP-адреса определенной подсети ?

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 20:43 15-02-2013
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:58 15-02-2013 | Исправлено: ASE_DAG, 21:01 15-02-2013
mithridat1



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

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 21:18 15-02-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mithridat1
> Я не знаю быстрых проверок
А их много разных что-ли? Если N и M — адрес и маска сети, а A — адрес хоста, то проверка последнего на принадлежность к первой выполняется, очевидно, как:
A & M == N
 
Для преобразования адресов и маски из любого из двух читаемых форматов в двоичный нескольких способов тоже, вроде бы, не придумать.
 
Однако если вы так заморочены на скорости, то имейте в виду, что тогда Баш вовсе не лучший выбор.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:03 15-02-2013 | Исправлено: ASE_DAG, 22:05 15-02-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mithridat1
Последний раз я это делал в дипломе на C++ с использованием Qt
Shell будет медленно оперировать октетами каждым в отдельности так что это плохой вариант.
IMHO, тут лучше использовать что-то больше похожее на ЯП, хотя бы Python, а можно и C++.
 
Пример на Perl:
Код:
#!/usr/bin/perl
use NetAddr::IP;
 
$ip = NetAddr::IP->new($ARGV[0]);
$subnet = NetAddr::IP->new($ARGV[1]);
 
if ($ip->within($subnet)) {
        exit 0;
} else {
        exit 1;
}
Пример использования: check.pl 192.168.2.4 192.168.0.0/24
Смотреть код возврата. Если проверять по списку, то что бы не было накладных расходов на переключение, надо читать его сразу перлом.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:04 15-02-2013 | Исправлено: Alukardd, 22:19 15-02-2013
mithridat1



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

Цитата:
#!/usr/bin/perl -w
use Net::Patricia;
# IP tools
my $pt = new Net::Patricia;
$pt->add_string("$ARGV[0]");
if(defined($pt->match_string("$ARGV[1]"))){
print "IN\n";
}else{
print "OUT\n";
}

Якобы,Net::Patricia самый быстрый модуль для такой проверки.Но работает все равно не так быстро как хотелось бы.

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 22:32 15-02-2013
Alukardd



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

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:55 15-02-2013
Keymaker81

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем
Беглый поиск не помог... Как поискать grep-ом строки с символом ">"?
Делаю что-то вроде:
# grep -lir "<td>" /var/www/html/site

Всего записей: 2 | Зарегистр. 13-01-2006 | Отправлено: 12:17 18-02-2013
kpp77

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

Код:
grep ">" /var/www/html/site

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:27 18-02-2013
Keymaker81

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
 
Спасибо, но я тупанул. Пример, который я привел, работает ;)

Всего записей: 2 | Зарегистр. 13-01-2006 | Отправлено: 12:45 18-02-2013
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Камрады, чегой-то я туплю - не могу дописать скрипт.
Вообщем есть куча серверов. На каждом сервере лежит файл в который надо с 4 (или по шаблону) строки вставить вот это :
 
P.S. Ах да, простите. Система Solaris 10 со всеми вытекающими.
 

Код:
read TERM AMSTTY WTSUSER <<ENDE
$TERM
ENDE
 
if [ "X${WTSUSER}X" = "XX" ] ; then
   WTSUSER=${AMSTTY}
fi
 
AMSTTY=`echo $AMSTTY | tr '[a-z]' '[A-Z]'`
export TERM AMSTTY WTSUSER

 
Я пытаюсь сделать это вот так (опустим логинство на кучу машин):
 

Код:
for i in file
do
perl -p -e's{\n}{\n
"read TERM AMSTTY WTSUSER <<ENDE
$TERM
ENDE
 
if [ "X{$}{WTSUSER}X" = "XX" ] ; then
   WTSUSER=${AMSTTY}
fi
 
AMSTTY=`echo $AMSTTY | tr '[a-z]' '[A-Z]'`
export TERM AMSTTY WTSUSER
"
} if $. ==3' file

 
Уже и так пробовал тоже:
 

Код:
awk '{s=$0; if( NR==3 ){ s=s "\n
read TERM AMSTTY WTSUSER <<ENDE
$TERM
ENDE
if [ "X${WTSUSER}X" = "XX" ] ; then
WTSUSER=${AMSTTY}
fi
AMSTTY=`echo $AMSTTY | tr '[a-z]' '[A-Z]'`
export TERM AMSTTY WTSUSER" } print s;}' file

 
Выдает окаянная железка вот это:

Код:
"read TERM AMSTTY WTSUSER <<ENDE
 
ENDE
 
if [ "X{X" = "XX" ] ; then
   WTSUSER=
fi
 
AMSTTY=`echo  | tr [a-z] [A-Z]`
export TERM AMSTTY WTSUSER
"
 

 
Обсосала и остатки выплюнула - не выдалось половины текста.
sed -i под Solaris не работает, но что-то мне вещует, что будет тоже самое.
 
Подскажите как проблему побороть, если кто горазд?
 
Спасибо

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 20:57 18-02-2013 | Исправлено: CrownRU, 21:02 18-02-2013
kpp77

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

Код:
sed '4a\
read TERM AMSTTY WTSUSER <<ENDE \
$TERM \
ENDE \
    \
if [ "X${WTSUSER}X" = "XX" ] ; then \
  WTSUSER=${AMSTTY} \
fi \
\
 AMSTTY=`echo $AMSTTY | tr "[a-z]" "[A-Z]"` \
 export TERM AMSTTY WTSUSER\
' file

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 00:33 19-02-2013 | Исправлено: kpp77, 00:33 19-02-2013
CrownRU



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

Цитата:
sed '4a\
read TERM AMSTTY WTSUSER <<ENDE \
$TERM \
ENDE \
    \
if [ "X${WTSUSER}X" = "XX" ] ; then \
  WTSUSER=${AMSTTY} \
fi \
\
 AMSTTY=`echo $AMSTTY | tr "[a-z]" "[A-Z]"` \
 export TERM AMSTTY WTSUSER\
' file  

 
Нет, не подходит - это Solaris. Там такой трюк не срабатывает - просто ничего не выдаст. Под Linux работает.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:05 19-02-2013 | Исправлено: CrownRU, 12:06 19-02-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Работает под FreeBSD и Linux Debian.
Соляра есть только в VW

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:11 19-02-2013
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Все равно спасибо.  
Может кто нибудь еще сюда заглянет из аксакалов

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:03 19-02-2013
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cat insert.txt|perl -i.orig -plne'BEGIN{$a=do{local$/;<STDIN>}}$.==5&&print$a' file.txt

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 01:07 21-02-2013 | Исправлено: arto, 01:08 21-02-2013
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
Спасибо, но не работает
Просто без ошибок или других замечаний выполняется и все.
 
Извиняюсь, ступил. Работает. Просто попробовал на пустом output файле - там строки #5 не было, потому и не сработало.
Спасибо большое!
 
А по шаблону можно так заделать? Типа со строки, содержащей что-то вставить то-то.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:10 22-02-2013 | Исправлено: CrownRU, 13:15 22-02-2013
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
странно
 
# print -l {01..10} | ssh host "cat > /tmp/file.txt"
# print -l "AAA" "BBB" "CCC" | ssh host perl -i.orig -pne'''BEGIN{local$/;$a=<STDIN>}$.==5&&print$a''' /tmp/file.txt
# ssh host cat /tmp/file.txt
01
02
03
04
AAA
BBB
CCC
05
06
07
08
09
10
#

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 14:26 22-02-2013
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
 
Так работает, но если начнешь писать в строку 11 или 12 (если в этом случае 10 строка последняя), то файл останется без изменений.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:54 22-02-2013
arto

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

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 15:05 22-02-2013
CrownRU



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

Цитата:
вместо проверки на моер строки вставить проверку шаблона.
 
если файл короче, то вынести проверку на длину файла еще и в END-блок

 
Спасибо Только в perl я разбираюсь как свинья, сами знаете в чем

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 15:11 22-02-2013
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# print -l "AAA" "BBB" "CCC" | ssh host perl -i.orig -pne'''BEGIN{local$/;$a=<STDIN>}$.==10&&print$a;END{exit($.<10)}''' /tmp/file.txt || print -l "AAA" "BBB" "CCC" | ssh host "cat >> /tmp/file.txt"

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 17:21 22-02-2013
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
Спасибо большое!
Буду вкуривать...

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 17:34 22-02-2013
tiezved

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите пожалуйста заставить работать данный код под freebsd
под ubuntu всё работает на отлично а вот под фряхой ни в какую:
awk -F, '{ print $1 > "output_"$2".txt"}' 1
содержимое 1:
1,9
2,8
3,7
4,6
5,0
заранее благодарен

Всего записей: 2 | Зарегистр. 06-03-2013 | Отправлено: 13:36 06-03-2013 | Исправлено: tiezved, 19:07 06-03-2013
kpp77

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

Код:
awk -F, '{fln="output_"$2".txt"; print $1 > fln}' 1

"ни в какую"

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 15:33 06-03-2013 | Исправлено: kpp77, 15:43 06-03-2013
tiezved

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

Всего записей: 2 | Зарегистр. 06-03-2013 | Отправлено: 19:08 06-03-2013
Sphinx114



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, как заставить корректно работать echo или другую команду (желательно покороче) в следующих случаях:
 
#!/bin/bash
x=5
echo {$x..$(($x**2))..$x}
 
echo 123 | echo

Всего записей: 1201 | Зарегистр. 26-03-2011 | Отправлено: 19:38 06-03-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sphinx114
echo всегда работает корректно. Что вам нужно-то?
 
Использовать подстановку переменных и арифметику в башевской конструкции {x..y[..incr]}, я правильно понял?
 
$ x=5
$ eval echo {$x..$((x**2))..$x}
5 10 15 20 25

 
> echo 123 | echo
А это что такое?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:53 06-03-2013
Sphinx114



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

Цитата:
eval echo {$x..$((x**2))..$x}  

Ага, работает, то что надо.

Цитата:
> echo 123 | echo
А это что такое?

Первое эхо передаёт 123 второму, которое и должно вывести 123 в консоль.
 
О! вот так работает:
echo 123 1>&2 | echo -n
 
ах нет, это не то, оно не передаётся через |. Чето я запутался:
 
$ dig ru-board.com +short 1>&2 | echo 345
345
72.233.112.74
 
$ echo 123 1>&2 | echo 345
123
345

Всего записей: 1201 | Зарегистр. 26-03-2011 | Отправлено: 21:02 06-03-2013 | Исправлено: Sphinx114, 21:21 06-03-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sphinx114
Цитата:
Первое эхо передаёт 123 второму, которое и должно вывести 123 в консоль
щито за бред? оО а что первое какое-то ущербное что оно Вас не устроило?
Нормально опишите ситуацию и мы Вам сможем подсказать, как лучше сделать.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:04 06-03-2013 | Исправлено: Alukardd, 01:02 07-03-2013
Sphinx114



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

Цитата:
что первое какое-то ущербное что оно Вас не устроило?

Дело не в нём, а в том что выхлоп первой команды даже частично не передается через | в echo. Ну видимо я чего-то не понимаю.
 
Я думал, что должно быть так:
$ echo 123 | echo
123
 
cat выводит результат первой команды как и ожидается:
$ echo 123 | cat
123

Цитата:
Нормально опишите ситуацию

Изучаю баш, появляются вопросы.

Всего записей: 1201 | Зарегистр. 26-03-2011 | Отправлено: 00:28 07-03-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sphinx114
Дык echo не умеет stdin читать, оно просто забивает на всё, что ему свалилось из pipe'а.
Цитата:
Изучаю баш
это дело полезное.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:03 07-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Начинаю писать скрипт на gawk, не могу убрать из строки символы после времени, время всегда стоит в начале строки:

Код:
 
#!/usr/bin/gawk -f
BEGIN {
}
 
if ($1 ~ /[[:digit:]]/) {
gsub (что сюда вписать ?)
"11:22 этот текст надо убрать"
}
print $1
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:59 07-03-2013
volodyalipkin



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

Код:
 
{
a="11:22 qwerty";
gsub(/^([[:digit:]]+:[[:digit:]]+)(.+)/,$1,a);
print a;
}
 

Всего записей: 771 | Зарегистр. 12-10-2002 | Отправлено: 22:56 07-03-2013
kpp77

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

Код:
echo "11:22 этот текст надо убрать" | awk '{a=$0; gsub(/^[0-2][0-9]:[0-5][0-9]/,"",a); gsub(a,"",$0); print $0}'

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 23:25 07-03-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422, volodyalipkin, kpp77
 
А вы не перемудрили ли?
 
$ gawk '/^[[:digit:]]/ { print $1 }' <<< '11:22 этот текст надо убрать'
11:22


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 09:26 08-03-2013 | Исправлено: ASE_DAG, 09:28 08-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Забыл написать что текст берется из csv файла, поэтому ни один из 3 примеров не срабатывает.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 10:01 08-03-2013
ASE_DAG



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 10:11 08-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вроде же 6 постами написал задачу, есть csv файл в котором одна из строк содержит время и после времени информацию. Надо убрать эту информацию и оставить только время, используя gawk.

Код:
есть - "11:22 этот текст надо убрать"
должно быть - "11:22"

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 11:16 08-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Если формат текста именно такой "11:22 этот текст надо убрать", т.е. после времени всегда пробел(или иной постоянный разделитель), тогда
да
Код:
gawk '/^[[:digit:]]/ { print $1 }'
, а если после времени произвольный символ?
digital422
А что делать с остальными строками файла, кот. не содержат время?

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 14:02 08-03-2013 | Исправлено: kpp77, 14:12 08-03-2013
digital422

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

Код:
if ($1 ~ /[[:digit:]]/) {
    gsub(/[[:alpha:]]/,"",$1);
    gsub(/\"/,"",$1);
}

первый gsub убирает символы, второй удаляет кавычки.
 
Чувствую долго я буду мучится
Вот входной файл (csv):

Код:
 
"Монтажный лист";;;;;;"02/01/2000  Суббота"
;"источник";"Тайм-код";"ID";"Название";"Хрон.";"№"
"08:13   внутри";;;;;
"Подблок № 1 ";;;;;;"1Р"
"1";;;"A1234001";"Имя1";"10";
"2";;;"A1234002";"Имя2";"20";
"3";"35322/13    ";"00:00:00:00";"A1234003";"Имя3";"15";
;;;;;"Итого 1    01:00";
;;;;;"Итого 2     01:00";
"08:55   внутри";;;;;
"Подблок № 1 ";;;;;;"2Р"
"1";;;"A1234005";"Имя5";"10";
"2";;;"A1234006";"Имя6";"20";
"3";"35322/13    ";"00:00:00:00";"A1234006";"Имя7";"15";
"4";;;"A1234008";"Имя8";"15";
;;;;;"Итого 3     01:00";
;;;;;"Итого 4     01:00";
;;;"Итого за 02/01/2003";"Объем";"0.0166666666666667"
;;;;"Кол-во";"113"
 

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

Код:
 
08:13
A1234001 Имя1
A1234002 Имя2
A1234003 Имя3
08:55
A1234005 Имя5
A1234006 Имя6
A1234007 Имя7
A1234008 Имя8
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:33 08-03-2013 | Исправлено: digital422, 14:48 08-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Т.е. если в строке есть хотя бы одна цифра, удалить все буквенные символы и кавычки?

Код:
if($1~/[[:digit:]]/){
     a=$1;
     gsub(/[[:alpha:]]/,"",a);
     gsub(/\"/,"",a);
  }
  else { print a,$0 }

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 14:49 08-03-2013
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:59 08-03-2013
kpp77

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

Код:
 awk -F";" '{gsub(/\"/,"",$0);
             if($1~/^[0-2][0-9]:[0-5][0-9]/){
                 a=$1;
                 gsub(/^[0-2][0-9]:[0-5][0-9]/,"",a); gsub(a,"",$1);
                 print $1;
             }
             else {
             if($1~/^[0-9]/) { print $4,$5 };
             }
             }' $1
 

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 15:14 08-03-2013 | Исправлено: kpp77, 15:15 08-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77 - я второй день пытаюсь написать, а тут за 15 мин, Спасибо

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 15:19 08-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Всегда рад помочь.
Условие задачи четче нужно было сразу, еще быстрее было бы
 

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 15:23 08-03-2013
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 15:26 08-03-2013
kpp77

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

Код:
sed -n '/^"[0-2][0-9]:[0-5][0-9]/s~^"\(.....\).*~\1~p;  
          /^"[0-9][0-9]*"/s~^\([^;]*;\)\{3\}"\([^;]*\)";"\([^;]*\)".*~\2 \3~p' $1

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 15:33 08-03-2013 | Исправлено: kpp77, 15:47 08-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надо в начале каждого блока после времени вставлять строчку COMMAND (параметры прописываются в BEGIN), но этой строки не должно быть в первой строке. Исходник csv немного выше.
 

Код:
08:13  
A1234001 Имя1  
A1234002 Имя2  
A1234003 Имя3  
08:55
COMMAND
A1234005 Имя5  
A1234006 Имя6  
A1234007 Имя7  
A1234008 Имя8
10:55
COMMAND
A1234005 Имя5  
A1234006 Имя6  
A1234007 Имя7  
A1234008 Имя8

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 16:52 08-03-2013
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
awk 'BEGIN{a=0} /^[[:digit:]]/ { print $1; if (a++) print "COMMAND"; next } { print }'

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 17:51 08-03-2013
kpp77

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

Код:
 awk -F";" '{gsub(/\"/,"",$0);
             if($1~/^[0-2][0-9]:[0-5][0-9]/){
                 a=$1;
                 gsub(/^[0-2][0-9]:[0-5][0-9]/,"",a); gsub(a,"",$1);
                 print $1;
                 if(i>0) print "COMMAND";
                 i++;
             }
             else {
             if($1~/^[0-9]/) { print $4,$5 };
             }
             }' $1
 

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 18:22 08-03-2013
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:13 08-03-2013
kpp77

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

Код:
<TABLE border=0 cellPadding=0 cellSpacing=1 width=100>^M
  <TBODY>^M
  <TR>^M
    <TD></TD>^M
    </TR>^M
  </TBODY>^M
</TABLE><TABLE border=0 cellPadding=0 cellSpacing=1 width=100>^M
  <TBODY>^M
  <TR>^M
    <TD></TD></TR></TBODY></TABLE>^M
<TABLE align=center bgColor=#ffffff border=0 cellPadding=1 cellSpacing=0 ^M
class=border width=400>^M
  <TBODY>^M
  <TR align=middle bgColor=#7ca9a9>^M
    <TD colSpan=2><B>Info</B></TD></TR>^M
  <TR CLASS=bg0>^M
    <TD width=150>login</TD>^M
    <TD width=250>TEST</TD></TR>^M
  <TR>^M
  <TR CLASS=bg0>^M
    <TD width=150><b>ID</TD>^M
    <TD width=250><b>00000</TD></TR>^M
  <TR>^M
  <TR CLASS=bg1>^M
    <TD>Баланс, грн</TD>^M
    <TD width=120><b>20.70</TD></TR>^M
  </TR>^M
  <TR CLASS=bg0>^M
    <TD>Тариф</TD>^M
    <TD>Мега</TD></TR>^M
  <TR CLASS=bg1>^M
    <TD>ФИО</TD>^M
    <TD>Иванов Иван Иванович</TD></TR>^M
  <TR CLASS=bg0>^M
    <TD>Адрес</TD>^M
    <TD>Урюпинск 12, 5 эт, кв. 2</TD></TR><TR CLASS=bg1><TD>Real IP</TD>^M
   <TD><b>19.11.1.1</b></TD></TR>  <TR CLASS=bg1>^M
    <TD>MAC</TD>^M
    <TD>0:0:4:0:2:dd</TD></TR>^M
  <TR CLASS=bg0>^M
    <TD>Телефон</TD>^M
    <TD><B>55-88-88</B></TD>^M
  </TR>^M
  <TR CLASS=bg1>^M
    <TD>Мобильный</TD>^M
    <TD><B>8-093-434-00-00</B></TD>^M
  </TR>^M
<!--  <TR CLASS=bg0>^M
    <TD>Онлайн</TD>^M
    <TD><font color=red>offline</font></TD>^M
  </TR>^M
  <TR CLASS=bg1>^M
    <TD>Последний заход</TD>^M
    <TD></TD>^M
  </TR>^M
-->^M
  <TR CLASS=bg0>^M
    <TD>Статус</TD>^M
    <TD><B><font color=green>включен</font></B></TD>^M
  </TR>^M
  <TR  CLASS=bg1>^M
    <TD>Зарегистрирован  </TD>^M
    <TD>2010-11-02</TD>^M
  </TR>^M
^M
</TBODY></TABLE>^M
<DIV style='HEIGHT: 1px'><SPACER HEIGHT='1' TYPE='block'></SPACER></DIV>^M
 class=border width=150>^M
  <TBODY>^M
  <TR align=middle bgColor=#7ca9a9>^M
    <TD colSpan=2><B>&nbsp;</B></TD></TR>^M
  <TR>^M
</body>^M
 

Нужно получить информацию в более читабельном виде.
Сделал так:

Код:
cat sampl | tr -d "\r\n" |\
sed 's/<\/TR>/<\/TR>\
/g' |\
sed 's/\(<TR[^>]*>\)/\
\1/g' |\
sed -n '/<TBODY/,/<\/TBODY>/{
           /<TR[ >].*<\/TR>/{
              s/<TR[^>]*>\(.*\)<\/TR>/\1/
              s/<TD[^>]*>//g
              s/<\/TD>//g
              s/<b>//g
              s/^[ ]*//
              p
           }
       }' | sed '/^[ ]*$/d'

Результат:

Код:
<B>Info</B>
login    TEST
ID    00000
Баланс, грн    20.70
Тариф    Мега
ФИО    Иванов Иван Иванович
Адрес    Урюпинск 12, 5 эт, кв. 2
Real IP   19.11.1.1</b>
MAC    0:0:4:0:2:dd
Телефон    <B>55-88-88</B>..
Мобильный    <B>8-093-434-00-00</B>..
Онлайн    <font color=red>offline</font>..
Последний заход......
Статус    <B><font color=green>включен</font></B>..
Зарегистрирован      2010-11-02..
 

Есть желание переделать одим седом.
Делаю так:

Код:
sed -n '/<TBODY/,/<\/TBODY>/{
 
           /<TR[ >]/,/<\/TR>/{
 
              /<TR[ >]/{
                 /<\/TR>.*<TR[ >]/!h
              }
 
              /<TR[ >]/!{
                 /<\/TR>/!H
              }
 
              /<\/TR>/{
                 /<TR[ >].*<\/TR>/!H
                 x
                 s/<TR[^>]*>\(.*\)<\/TR>.*/\1/
                 p
              }
 
           }
 
       }' sampl  

Результат:

Код:
  ^M
    <TD></TD>^M
....
  ^M
    <TD></TD>
  ^M
    <TD colSpan=2><B>Info</B></TD>
  ^M
    <TD width=150>login</TD>^M
    <TD width=250>TEST</TD>
  ^M
    <TD width=150><b>ID</TD>^M
    <TD width=250><b>00000</TD>
  ^M
    <TD>Баланс, грн</TD>^M
    <TD width=120><b>20.70</TD>
  ^M
    <TD>Тариф</TD>^M
    <TD>Мега</TD>
  ^M
    <TD>ФИО</TD>^M
    <TD>Иванов Иван Иванович</TD>
  ^M
    <TD>Адрес</TD>^M
    <TD>Урюпинск 12, 5 эт, кв. 2</TD>
    <TD>Урюпинск 12, 5 эт, кв. 2</TD></TR><TD>Real IP</TD>^M
   <TD><b>19.11.1.1</b></TD>
   <TD><b>19.11.1.1</b></TD></TR>  ^M
    <TD>MAC</TD>^M
    <TD>0:0:4:0:2:dd</TD>
  ^M
    <TD>Телефон</TD>^M
    <TD><B>55-88-88</B></TD>^M
..
  ^M
    <TD>Мобильный</TD>^M
    <TD><B>8-093-434-00-00</B></TD>^M
..
<!--  ^M
    <TD>Онлайн</TD>^M
    <TD><font color=red>offline</font></TD>^M
..
  ^M
    <TD>Последний заход</TD>^M
    <TD></TD>^M
..
  ^M
    <TD>Статус</TD>^M
    <TD><B><font color=green>включен</font></B></TD>^M
..
  ^M
    <TD>Зарегистрирован  </TD>^M
    <TD>2010-11-02</TD>^M
..
  ^M
    <TD colSpan=2><B>&nbsp;</B></TD>
 

Не знаю как убрать дубляжи строк - в одной строке могут быть одновременно теги </TR> и <TR>.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 16:36 11-03-2013 | Исправлено: kpp77, 16:37 11-03-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, kpp77
Попробуйте это извращение (прав был ув. Alukardd... )
sed -n -e "s/^[^<]*</</;s/>[^>]*$/>/;H;g;s/<TR[^>]*>/\x01/g;s/\n/ /g;h;tx;:x;s/<.TR>/\x02/g;T;:a;h;s/^[^\x01]*\x01\([^\x02]*\)\x02.*/\1/;T;s/<[^>]*>//g;s/^[\x01\x20]*//;p;g;s/^[^\x01]*\x01\([^\x02]*\)\x02//;ta;h;" sampl
Файл скрипта
Результат

Код:
 
 
 
Info
login TEST
ID 00000
Баланс, грн 20.70
Тариф Мега
ФИО Иванов Иван Иванович
Адрес Урюпинск 12, 5 эт, кв. 2
Real IP 19.11.1.1
MAC 0:0:4:0:2:dd
Телефон 55-88-88  
Мобильный 8-093-434-00-00  
Онлайн offline  
Последний заход  
Статус включен  
Зарегистрирован   2010-11-02  
&nbsp;
 

Проблема с вложенными <TR> (<TR> ... <TR> ... </TR> </TR>). Подумаю.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 21:29 11-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Благодарю за вариант.
Есть вопросы:
Что за команда T?
В имеющейся у меня документации и в моей версии sed такой команды нет.
Система FreeBSD 8.2.
За идею замены тега на один символ (s/<TR[^>]*>/\x01/g s/<.TR>/\x02/g)- отдельное спасибо, хотя нужно быть уверенным что символ замены не встречается в тексте.
 
После очередного мозгового штурма, вырисовался вариант :

Код:
 
sed -n 's/^[^<]*</</
        s/>[^>]*$/>/
        H
        /<.TR>/!b
           x
           s/.*<TR[^>]*>\(.*\)<.TR>.*/\1/
           s/\n//g
           s/<.TD><TD[^>]*>/<-->/
           s/<[^>]*>//g
           /^[ ]*$/d
           p
           x
           s/.*<.TR>//
           h
       ' sampl

Со вложенностью тегов (<TR> <TR> </TR> </TR>) пока непонятно.
По идее нужна рекурсия - для произвольного числа вложений...

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 13:47 12-03-2013 | Исправлено: kpp77, 00:36 13-03-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, kpp77
Странно, что нет. Это условный переход, обратный t (если не было успешной замены.)
Второй вариант - без T и с вложениями. Проблема, что уровни вложенности печатаются в обратном порядке. Подробнее...
Третий вариант - уровни вложенности печатаются в правильном порядке. Но мне что-то не нравится Подробнее...
IMHO, \x01 \x02 в тексте встречаются редко. Это две рожицы. Посмотрите при помощи grep.
 
В Вашем варианте, кстати,  "/<.TR>/b obr;/<.TR>/!b end;: obr" можно заменить просто на "/<.TR>/!b"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 19:06 12-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Некоторые команды (T,R,W,Q...) есть только в GNU-шных версиях sed.
Также в не-ГНУшных реализациях недоступна замена по кодам символов ни в 16-ричной ни в 8-ричной системах...
К сожалению замены вида s/<TR[^>]*>/\x01/g s/<.TR>/\x02/g не подходят.
По поводу замены "/<.TR>/b obr;/<.TR>/!b end;: obr" на "/<.TR>/!b" - согласен, благодарю.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 00:24 13-03-2013 | Исправлено: kpp77, 00:33 13-03-2013
Alex_Piggy

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

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 01:31 13-03-2013 | Исправлено: Alex_Piggy, 01:32 13-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужен скрипт:
1. Проверяем find-ом появление в папках новых файлов за  время последней проверки (10 минут), если есть выполняется п.2, если нет их - exit
2. Пингуем fping-ом удаленный хост, если не отвечает - exit.
3. rsync-ом отправляем новые файлы на удаленный хост.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:22 15-03-2013 | Исправлено: digital422, 09:09 16-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Где-то так. Не проверял.

Код:
#!/bin/sh
 
dir_name="$1"
host="$2"
dir_dist="$3"
user="$4"
 
# Проверяем find-ом появление в папках новых файлов за  время последней проверки (10 минут)
files="`find "${dir_name}" -type f -cmin 10 -print`"
# если нет их - exit
[ -n "${files}" ] || exit 1
 
# Пингуем fping-ом удаленный хост, если не отвечает - exit.
[ -n "`fping -u "${host}"`" ] && exit 2
 
# rsync-ом отправляем новые файлы на удаленный хост.
for file in ${files}
do
   rsync --progress --partial -avz "${file}" ${user}@${host}:"${dir_dist}"
done


Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 18:42 16-03-2013 | Исправлено: kpp77, 18:54 16-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
10 минут - запуск скрипта по cron, если за эти 10 минут появились новые файлы - продолжаем работу скрипта, тут cmin не подходит, файлы могут быть созданы ранее и не обязательно в текущий день.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:29 16-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тогда нужно сохранять список "старых" файлов и при очередном запуске скрипта отбирать "новые" файлы.
 
Добавлено:

Код:
#!/bin/sh
 
dir_name="${1}"
host="$2"
dir_dist="$3"
user="$4"
 
temp_list="./temp_list"
obrab_list="./obrab_list"
 
# сохраняем список всех файлов на момент запуска скрипта
find "${dir_name}" -type f -print | sort > "${temp_list}"
 
if [ -f "${obrab_list}" ]; then
  # отбор новых файлов
  files="`join -a1 -t"<>" "${temp_list}" "${obrab_list}" | grep -v "\t"`"  # здесь "<>" - табуляция
else
  files="`cat "${temp_list}"`"
fi
# если новых файлов нет - exit
[ -n "${files}" ] || exit 1
 
# Пингуем fping-ом удаленный хост, если не отвечает - exit.
[ -n "`fping -u "${host}"`" ] && exit 2
 
# rsync-ом отправляем новые файлы на удаленный хост.
for file in ${files}
do
  rsync --progress --partial -avz \"${file}\" ${user}@${host}:\"${dir_dist}\"
  # добавить новый файл в список обработанных файлов
  echo "${file}>0" >> "${obrab_list}" # здесь ">" - табуляция
done
 
# отсортировать список обработанных файлов для корректной работы join
sort "${obrab_list}" > "${obrab_list}"_
mv "${obrab_list}"_ "${obrab_list}"
 

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 20:15 16-03-2013 | Исправлено: kpp77, 22:37 18-03-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
похоже в строке где команда join есть ошибка, происходит команда на выполнение когда нет новых файлов. после -t поставил один Tab. файл obrab_list заполняется результатами  find, в строках с новым файлам появляется через Tab символ 0, даже когда нет новых файлов. Для отладки временно убрал fping и rsync, оставил только строку: # добавить новый файл в список обработанных файлов, изменив {file} на {files} .

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:58 18-03-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Немного подрихтовал. Попробуйте.

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 22:38 18-03-2013
digital422

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

Код:
 
#!/bin/bash
 
mv "${file_list}-0" "${file_list}-1"
find "$INPUT" -type f -printf "%f\n" | sort > "${file_list}-0"
fgrep -v -f ${file_list}-1 ${file_list}-0 > ${file_list}.new
CC=$(cat ${file_list}.new | wc -c)
 
if [ $CC -ne 0 ]; then
    echo "Run rsync script"
fi
 
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:50 28-03-2013
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Коллеги, хочется странного.
А именно, можно ли как-то при работе awk задействовать команды самого bash`а? Поясню на примере. Сформировали список файлов:

Код:
 
/home/user/test/dir1/1.pdf
/home/user/test/dir1/111.pdf
/home/user/test/dir2/58.jpg
 

И хочется все файлы переименовать по шаблону, где в имени будет bcgjkmpjdfyf команда $(date +%Y%m%d-%N). То есть должно получиться нечто подобное:

Код:
 
/home/user/test/dir1/dir1-20130408-201644893.pdf
/home/user/test/dir1/dir1-20130408-278332343.pdf
/home/user/test/dir2/dir2-20130408-101116548.jpg
 


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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 23:34 08-04-2013 | Исправлено: urodliv, 23:35 08-04-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Ну, во-первых, date — это не комнда Баша.  
 
Во-вторых, можно.
$ gawk 'BEGIN {"date +%Y%m%d-%N" | getline; print}'
20130408-821030935

 
А в-третьих, могу заметить, что у GAWK’а есть функция strftime(). Доли секунды через нее, правда, не вывести, но они же вам нужны как случайное число, а не как время, так что можно использовать rand()
$ gawk 'BEGIN {print strftime("%Y%m%d")}'
20130408

 
P. S. Мысль насчет rand() — неудачная. Для затравки (srand()) генератора тоже используется время с точностью до целой секунды. Можно, конечно, ему /dev/urandom скормить, но это неоправданно сложнее.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:59 08-04-2013 | Исправлено: ASE_DAG, 00:07 09-04-2013
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zsh# touch {1..10}
zsh# zmv "(*)" "aa-\$( date +'%Y%m%d-%N' ).txt"
zsh# ls -1
aa-20130409-119571751.txt
aa-20130409-121800874.txt
aa-20130409-123726700.txt
aa-20130409-125835951.txt
aa-20130409-128066683.txt
aa-20130409-130134027.txt
aa-20130409-132075220.txt
aa-20130409-133586661.txt
aa-20130409-134413058.txt
aa-20130409-135238314.txt
zsh#

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 08:38 09-04-2013
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Спасибо. Уникальность обеспечил простым методом: первоначально сгенерировал на основе наносекунд число, а потом к каждому файлу просто добавлял константу. То же самое можно было бы провернуть и с другими функциями.
arto
Да, этот модуль безусловно мощный, но условие таково: доставлять что-либо в в систему нельзя. Посему приходится башить.

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 18:56 09-04-2013
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то я опять застопорился с башем на мелочи.
Есть файл:

Код:
user@comp:~$ ls -l Лабу\ да/Doc\ -\ 2013\ 04-09.pdf  
-rw-r--r-- 1 user user 0 Апр  9 21:25 Лабу да/Doc - 2013 04-09.pdf

И содержимое файла для его преобразования (в середине стоит табуляция):

Код:
user@comp:~$ cat files  
Лабу\ да/Doc\ -\ 2013\ 04-09.pdf          Лабу\ да/Doc-09.pdf

В командной строке запускаем: IFS='\n'; cp -T $(cat files)
И в ответ получаем:

Цитата:
cp: неверный ключ -- \
Попробуйте `cp --help' для получения более подробного описания.

При этом если в командной сроке введу команду cp -T Лабу\ да/Doc\ -\ 2013\ 04-09.pdf          Лабу\ да/Doc-09.pdf баш не чихает, а всё исполняет.
Чегось он хотит?

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 22:16 09-04-2013 | Исправлено: urodliv, 22:24 09-04-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Ну можно смотреть что реально пытается выполнить команда в скрипте включив показ собственно команд на экран. set -x, вернуть обратно set +x. Писать именно в скрипте, если всё это скрипт, конечно...
 
Во вторых менять разделитель на символ новой строки надо так: IFS=$'\n'

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:52 09-04-2013
Krist



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

Цитата:
Lorem ipsum dolor sit AMET, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim VENIAM, quis nostrud exercitation ULLAMCO  laboris nisi ut aliquip ex ea commodo consequat.


Цитата:
Lorem ipsum dolor sit Amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Veniam, quis nostrud exercitation Ullamco  laboris nisi ut aliquip ex ea commodo consequat.

 

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 11:57 02-05-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, Krist
Попробуйте (тратит примерно 4 с на 30 Mb текста)
sed -e "s/[A-Z]+/\L\u\0\E/g"
 
Lowercase на sed (Тот же файл - 6 с. Интересно, из-за чего).
sed -e "s/[A-Z]/\l\0/g"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 16:14 02-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
> sed
Вопрос т-ща Krist’а был про средства Баша.
 
> Тот же файл - 6 с. Интересно, из-за чего
Почему дольше? Ну, наверное, потому, что в отличие от первой она что-то делает.
 
$ sed -e "s/[A-Z]+/\L\u\0\E/g" file
Lorem ipsum dolor sit AMET, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim VENIAM, quis nostrud exercitation ULLAMCO  laboris nisi ut aliquip ex ea commodo consequat.
 
$ sed --version
GNU sed version 4.2.1
<...>

 
 
 
Krist
> как перевести все в lowercase средствами bash
$ cat file
Lorem ipsum dolor sit AMET, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim VENIAM, quis nostrud exercitation ULLAMCO  laboris nisi ut aliquip ex ea commodo consequat.
 
$ while read; echo "${REPLY,,}"; done < file
lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

 
Не?
 
> если такое возможно, как в тексте в котором встречаются слова только заглавными перевести эти слова в формат чтоб только первая буква была заглавная
Почему может быть невозможно? Баш полноценный язык. Но столь же простого оператора для этого нет.  
 
Добавлено:
Ну вот так, например, может это выглядеть.
 
$
while read; do
    set $REPLY
    for w; do
        W_1="${w:0:1}"
        W_R="${w:1}"
        echo -n "${W_1}${W_R,,} "
    done  
    echo
done < file
Lorem ipsum dolor sit Amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim Veniam, quis nostrud exercitation Ullamco laboris nisi ut aliquip ex ea commodo consequat.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:59 02-05-2013 | Исправлено: ASE_DAG, 18:06 02-05-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый вечер, ASE_DAG
Прошу прощения. Убрал "-r", не заменив "+" на "\+". Да, теперь ожидаемо работает 7 секунд.
sed -e "s/[A-Z]\+/\L\u\0\E/g"
sed -r -e "s/[A-Z]+/\L\u\0\E/g"  
Подробнее...

Цитата:
Вопрос т-ща Krist’а был про средства Баша.

К сожалению, я этого не понял. Думал что речь идет про стандартные средства системы. (Неправильно расшифровал "как перевести все в lowercase средствами bash через awk понятно")

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 18:33 02-05-2013 | Исправлено: Alex_Piggy, 18:37 02-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
> Неправильно расшифровал "как перевести все в lowercase средствами bash через awk понятно"
Да не обязательно, может быть и я неправильно понял, что там пытался спросить т. Крист; пусть он лучше сам повнятнее скажет, что имел в виду.
 
> $ sed -r -e 's/[A-Z]+/\L\u\0\E/g' file
А вообще, меня всегда восхищают решения на Седе и те, кто умеет их писать, а еще более те, кто умеет их читать. :-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:15 02-05-2013
Krist



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

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 21:28 02-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> в принципе оба варианта просто отличные
Так чем вас АВК-то тогда не устроил?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:33 02-05-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да устроил только не мог до конца адаптировать однострочник на awk для "капитализации", сейчас в приниципе уже и его доделал )

Код:
 
Admin@microsof-582458 /home
$ cat input
Lorem ipsum dolor sit AMET, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim VENIAM, quis nostrud exercitation ULLAMCO  laboris nisi ut aliquip ex ea commodo consequat.
 
Admin@microsof-582458 /home
$ awk '{for(i=1;i<=NF;i++) {if (match($i, /[A-Z]+/)) {$i=toupper(substr($i,1,1)) tolower(substr($i,2))}} print $0}' input
Lorem ipsum dolor sit Amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim Veniam, quis nostrud exercitation Ullamco laboris nisi ut aliquip ex ea commodo consequat.
 

 
awk все таки попроще sed(a)

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 11:37 03-05-2013 | Исправлено: Krist, 11:41 03-05-2013
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# print -l test TEST teST TEst | awk '{for(i=1;i<=NF;i++) {if (match($i, /[A-Z]+/)) {$i=toupper(substr($i,1,1)) tolower(substr($i,2))}} print $0}'
test
Test
Test
Test
#

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 13:23 03-05-2013
galleon2005



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста, не могу разобраться.
Нужно преобразовать строку с текстом в число.
Например,  из первоначального выражения - "145.4 TB" мне нужно получить просто "145.4"

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 14:53 05-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
galleon2005
> Нужно преобразовать строку с текстом в число.  
Если речь о типизации переменных, то в Баше нет числовых типов.
 
> из первоначального выражения - "145.4 TB" мне нужно получить просто "145.4"
Если речь просто о разборе строки, то не понимаю проблемы.
$ read VALUE UNIT <<< "145.4 TB"
$ echo $VALUE
145.4



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:57 05-05-2013
galleon2005



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Извиняюсь, мне это нужно для обработки snmp ответа от устройства в Zabbix.
Zabbix запущен на сервере с freebsd.
 
Например, для значения "1.46 TB" я выполняю команду:
snmpwalk -c public -v2c 192.168.67.10 .1.3.6.1.4.1.24681.1.2.17.1.5.1 | sed 's/[^0-9]*//g'
 
но в результате, я не могу получить значение "1.46"

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 15:18 05-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
galleon2005
У меня нет под рукой Zabbix’а, чтоб видеть, что он возвращает.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:23 05-05-2013 | Исправлено: ASE_DAG, 15:27 05-05-2013
galleon2005



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Здесь дело даже не в Zabbix, до него не доходит.
Сначала, с помощью команды snmpwalk, я получаю значение какого-либо параметра  (напр. "1.46 TB" ).
Потом нужно обработать это значение  с помощью sed, для получения только цифр ( 1.46 )  
И только потом скормить это значение Zabbix.

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 15:33 05-05-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, galleon2005
sed -e "s/^\([0-9.,]*\).*/\1/"
Или ?
sed -e "s/^\([0-9.,]*\)[^0-9.,].*/\1/"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 15:52 05-05-2013 | Исправлено: Alex_Piggy, 16:00 05-05-2013
galleon2005



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

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 16:29 05-05-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здавствуйте, может кто подскажет: как заменить в тексте на одно слово множество различных слов из файла с образцами не различая строчные и заглавные
Например в тексте:
июль август сентябрь
декабрь Март апрель июль
июнь сентябрь ноябрь февраль
Апрель ноябрь март
Заменить слова  "(м|М)арт, (а|А)прель" на "месяц".
Я понимаю можно воспользоваться однострочником
 sed -e 's/март\|апрель/месяц/g'
или даже
 awk '{gsub(/март|апрель/,"месяц")}'
Но слов очень много больше тысячи, хотелось бы брать из построчного файла. Ничего не могу придумать лучше чем генерировать скриптом еще один скрипт, который разделит файл с заменямыми словами на части и по очереди обработать текст запихнув в некоторое количество однострочников
Может кто подскажет?

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 19:09 30-05-2013 | Исправлено: Krist, 19:25 30-05-2013
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Я бы сделал так:
1. Создал файл dict.txt вида
Апрель месяц
Март месяц
Январь месяц
итд
думаю это сможете, а потом
2. sed '/./!d;s/\([^ ]*\) *\(.*\)/\\|\1|s||\2|g/' dict.txt | sed -f - файлвкоторомнадоменять.txt

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 19:52 30-05-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый вечер, Krist
Или практически идентичный вариант - если менять все на одно слово (TEXTTOREPLACE). word.lst - список слов для замены, разделенных пробелами или табуляцией. text.txt - текст, который надо исправить.
sed -n -e "s/[^ \t]\+/\ns@\0@TEXTTOREPLACE@gi/gip" word.lst | sed -f - text.txt > result.txt
"i" - наверное таки надо.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 21:22 30-05-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо, первый вариант быстрее, но 2 операции, а второй тратит больше времени, но в 1 строкy

Код:
 
time sed '/./!d;s/\([^ ]*\) *\(.*\)/\\|\1|s||\2|g/' tils | sed -f - titleready > last
 
real    0m0.571s
user    0m0.539s
sys    0m0.005s
 
time sed -n -e "s/[^ \t]\+/\ns@\0@pillka@gi/gip" kils | sed -f - titleready > last2
 
real    0m1.826s
user    0m1.799s
sys    0m0.000s
 

 
Спасибо!!

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:31 30-05-2013 | Исправлено: Krist, 00:20 31-05-2013
impe

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, помогите разобраться в своем же коде на BASH.
Разработать сценарий для переименования файлов из определенного каталога, имена которых удовлетворяют шаблону имя.окончание. После переименования файлы должны иметь имена вида ххх.окончание Здесь ххх - обозначает порядковый номер файла при переименовании. Дополнительно в текущем каталоге (из которого был запушен сценарий) должен быть создан файл с содержанием каталога переименованных фалов. Каждая строка файл - содержания  включает в себя порядковый номер и старое название файла и имеет следующий вид: ххх - имя. У пользователя запрашивается окончание, имя каталога с файлами для переименования, имя файла с содержанием (если оно пустое, то сдать содержание в файле имя каталога.content).


Код:
 
#!/bin/bash
DIR="$1"         
NAMELIST="$2"         
FORMAT="$3"
x=1
find $DIR -name "*.*" -exec basename {} \; | sed = >> $NAMELIST
 
for file in $DIR/*.$FORMAT
do
    mv $file $x.$FORMAT
    let x++
done
 

Всего записей: 2 | Зарегистр. 16-03-2012 | Отправлено: 13:45 04-06-2013
Sphinx114



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
impe, сделал чисто по заданию, вроде правильно работает:

Код:
#!/bin/bash
read -p 'Enter extension: ' ext
read -p 'Enter files directory: ' dir
read -p 'Enter name of contentfile: ' list
 
if [ -z "$list" ]; then list=`basename "$dir"`.content; fi
 
(
cd "$dir"
for file in *.$ext
do
 let x++
 echo $x - `basename "$file" .$ext`
 mv "$file" "$x.$ext"
done
)>"$list"


Цитата:
basename: неверный ключ — «s»
У фряшного basename ключи есть, на линухе нет. Значит надо что-то другое придумать.
Исправил: basename -s .$ext "$file" на basename "$file" .$ext

Цитата:
mv: не удалось выполнить stat для «*.txt»: Нет такого файла или каталога
хз, на фряхе работает.
На дебиане тоже работает:
 
root@localhost:~# /tmp/script.sh
Enter extension: txt
Enter files directory: /home/fred
Enter name of contentfile:
root@localhost:~# cat /tmp/fred.content
1 - asdf
2 - asdf asd
3 - qqq
root@localhost:~#

 
Изменил: >"`dirname "$0"`/$list" на >"$list" (неправильно прочитал задание)

Всего записей: 1201 | Зарегистр. 26-03-2011 | Отправлено: 16:29 04-06-2013 | Исправлено: Sphinx114, 07:58 05-06-2013
dimmer123

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Подскажите, как реализовать: в файле хранится время (часы:минуты), нужно к часам добавить 3 часа. Чтобы из 13:42 получилось 16:42.

Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 19:24 20-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimmer123
$ T='13:42'
$ date -d "3 hours $T" '+%H:%M'
16:42


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:12 20-06-2013
dimmer123

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Большое спасибо!

Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 00:10 21-06-2013
yrkrus



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго всем дня!
Подскажите как можно передать переменную ${date} в скрипт, а дальше в лог
типа такого:
 
#!/bin/sh
dat="date"
echo "сегодня $dat" >> /var/log/log.log
 
 

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 22:10 25-06-2013 | Исправлено: yrkrus, 22:14 25-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yrkrus
Извините, но я не понял, чего вы хотите. То, что привели как «типа такое», вполне работоспособно (хотя и бессмысленно).

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:14 25-06-2013 | Исправлено: ASE_DAG, 22:18 25-06-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yrkrus
Если я правильно понял то простейший вариант будет выглядеть так:
#!/bin/bash
dat="$1"
echo "сегодня $dat" >> /tmp/testscript.log

 
И вызывать его, например, так: /tmp/testscript $(date '+%D')

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 10:22 26-06-2013
AltTab



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго всем дня!
 
Прошу совета у сообшества.
Ubnutu server 12.04.
Есть скрипт, которым архивирую данные на виндовой машине. Перенес с учетом логики скрипта, как мог, в меру своих скудных знаний, на sh. И получаю картину: если запускать скрипт построчно, копируя строки из редактора в консоль, все выходит отлично. Но как только пробую готовый скрипт запустить - не выходит каменный цветок.
 
Если напрямую запускать

Код:
 
# /opt/share/public/_/arc_base.sh
-su: /opt/share/public/_/arc_base.sh: /bin/bash^M: плохой интерпретатор: Нет такого файла или каталога
 

 
Если через sh 'скрипт' - море ошибок и нет толку. Скрыто:
Подробнее...
 
Причем в точке назначения создаются две папки с текущей датой и точкой и двумя точками. То есть, к примеру, сегодня:
2013-06-26.
2013-06-26..
 
и скрипт не выполняет практически никакой работы, только создает пустые архивы.
 
Сам скрипт:
 
Подробнее...
 
Пожалуйста, тыкните носом, что там не так? Спасибо!

----------
Все, я пошел...
Шалабудабуда...

Всего записей: 247 | Зарегистр. 07-06-2004 | Отправлено: 15:24 26-06-2013 | Исправлено: AltTab, 15:25 26-06-2013
Sphinx114



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надо сохранить скрипт в Unix-кодировке, вы видимо в винде писали. Они переносом строк различаются.
Гугл подсказывает:
# apt-get install dos2unix
# dos2unix /opt/share/public/_/arc_base.sh
 
Можно так: gedit ->сохранить как -> конец строки Unix

Всего записей: 1201 | Зарегистр. 26-03-2011 | Отправлено: 15:53 26-06-2013 | Исправлено: Sphinx114, 16:05 26-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AltTab
> /bin/bash^M: плохой интерпретатор
Дык у вас мусор в конце каждой строки. Символ \r (он же ^M, он же carriage return (CR) — возврат каретки).  
 
Последовательность \r\n — это MSDOS’овский способ перевода строки. Вам же надо использовать просто \n.
 
В Виме можно поменять формат строк так:
:set fileformat=unix

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:59 26-06-2013
mithridat1



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

Цитата:
В Виме можно поменять формат строк так:
:set fileformat=unix

Или в командной строке,с помощью tr -d "\r"

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 16:02 26-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
#!/bin/bash
dat="$1"
echo "сегодня $dat" >> /tmp/testscript.log

 
И вызывать его, например, так: /tmp/testscript $(date '+%D')
 
Ну и в чем тут смысл? Чему не просто
 
#!/bin/bash
echo "сегодня $(date '+%F')" >> /tmp/testscript.log

 
или даже
 
#!/bin/bash
date '+сегодня %F' >> /tmp/testscript.log

 
 
Добавлено:
mithridat1
> tr -d "\r"
Не вполне корректно на самом деле. Ни dos, ни unix формат текстовых файлов не запрещает использовать \r равно как и любой другой доступный символ, т. е. он может встречаться не только в конце строки.
 
А вообще, очевидно, есть тысяча и один способ это сделать, в т. ч. не имея под рукой особых средств, например:
$ awk -v RS='\r\n' -v ORS='\n' '1' arc_base.sh  > arc_base.unix.sh
$ sed -i 's/\r$//' arc_base.sh
но ни к чему их все здесь приводить, поскольку т-щу AltTab’у будет куда полезнее узнать, где задается формат в его любимом текстовом редакторе, и им и воспользоваться.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:02 26-06-2013 | Исправлено: ASE_DAG, 16:25 26-06-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
смысл в передаче даты как аргумента

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:10 26-06-2013
yrkrus



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
Немного поясню, есть скрипт который проверяет наличе инета на канале, в случае падения переключает на резервный и через echo должна передаться дата "падения" и восстановления канала

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 22:05 26-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yrkrus
Замечательно. Только есть мнение, что пояснять надо не «немного», а как можно подробнее. По крайней мере мне так и не понятно, чавой вы таки от нас хотите.
 
Как вывести в произвольном контексте текущую дату, я написал выше. Если есть вопросы — задавайте.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:46 27-06-2013 | Исправлено: ASE_DAG, 01:47 27-06-2013
AltTab



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Sphinx114
ASE_DAG
mithridat1
Огромное спасибо! Вот никогда бы о таком исходе не подумал бы - точнее, знал же о разнице в переносе строки и специально сначала пытался сохранить в N++ с переносами UNIX. Затем, подозревая именно эту проблему, построчно копировал в vim строки из скрипта. Видимо, строка копируется с символом переноса, даже если перенос определяешь "энтером" вручную сам.
 
Огромное спасибо еще раз! И за полезную ветку обсуждений по такой теперь уже актуальной теме для меня. Буду штудировать.

----------
Все, я пошел...
Шалабудабуда...

Всего записей: 247 | Зарегистр. 07-06-2004 | Отправлено: 09:03 27-06-2013
yrkrus



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Всем спасибо, проблему передачи даты решил, двумя запросами, сначало передача "date" >> /var/log, а следом передача echo с текстом >> /var/log, скрипт после это корявый по написанию, но теперь хотябы время знаю если имеет место падение канала.

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 09:32 27-06-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос
RedGeek
POSIX стандарт не предусматривает хранение времени создания файла. Знакомимся.
И того команда у Вас будет выглядеть примерно так:
find /data -mindepth 1 -maxdepth 2 -type f -printf '%f, %h, %s, %Tm.%Td.%TY %TT\n' > /tmp/result
 
Добавлено:
Выведет все файлы текущего катлога и его ближайших "потомков". Формат 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:59 01-07-2013
RedGeek



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Сообщением выше Alukardd ответил на вопрос:
-----------------------------------------------------
Добрый день!
 
Никак не получается написать команду, которая будет сохранять файлы из определенных директорий в csv файлы (имя файла, путь, размер, дата создания файла).
 
Название директорий 1 уровня должно состоять из 4-х цифр:
Код:
find . -maxdepth 1 -type d -name '[0-9][0-9][0-9][0-9]'

 
Директории выводятся правильно, но мне-то нужно рекурсивно обойти все файлы и поддиректории таких директорий 1 уровня и вывести в csv файл данные: имя файла, путь, размер, дата создания файла.
 
P.S. Если есть способ быстрее (например, locate), чем find - он был бы предпочтительнее, т.к. будет обрабатываться большое количество файлов и папок.
-----------------------------------------------------

Всего записей: 157 | Зарегистр. 11-12-2006 | Отправлено: 15:11 02-07-2013 | Исправлено: RedGeek, 16:42 02-07-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedGeek
Думаю, вы совершенно правы — лучше привести вопрос даже после ответа, чем не привести вовсе (ссылки все-таки недостаточно); но отмечайте что-ли как-нибудь то, что этот вопрос к уже данному выше ответу, а то странно выглядит же. ;-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:38 02-07-2013 | Исправлено: ASE_DAG, 15:42 02-07-2013
RedGeek



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG действительно, поправил.
 
Alukardd Спасибо, это то, что нужно! А как передать регулярное выражение '[0-9][0-9][0-9][0-9]', т.е. чтобы команда выводила файлы, у которых корневая (папка 1 уровня, подпапок может быть много) состоит из 4-х цифр?

Всего записей: 157 | Зарегистр. 11-12-2006 | Отправлено: 16:40 02-07-2013 | Исправлено: RedGeek, 16:42 02-07-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RedGeek
как-то так:
-path "/data/[0-9][0-9][0-9][0-9]\|/data"
не проверял!

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:28 02-07-2013 | Исправлено: Alukardd, 20:29 02-07-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
А между тем, совершенно напрасно не проверяли. Аргументом к -path (он же -wholename) является не регэксп, а глоб. Со всеми вытекающими.
 
$ find
.
./6532
./6532/dd4e
./6532/dd4e/file
./6532/file
./43a6
 
$ find -path './[0-9][0-9][0-9][0-9]*' -type f
./6532/dd4e/file
./6532/file


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 04:03 03-07-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
я собственно и добавил \|/data, потому что pattern без него теряет файлы в текущем каталоге... Видимо придётся запускать 2 отдельных find...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 10:12 03-07-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
 
> pattern без него теряет файлы в текущем каталоге
Во-первых, тов. Ред-Гик, вроде-бы, ничего не говорил про то, что ему потребны файлы в текущей директории. А во-вторых, регэксп /data/[0-9][0-9][0-9][0-9]\|/data находит файлы во всех каталогах. Нет, ну правда, посмотрите, он же избыточен и сокращается до /data. :-)
 
> 2 отдельных find
Хм. Ну если отвлечься от того, что использовать регэкспы вам никто не мешает (-regex), то, да, задача вывести файндом все файлы в текущей директории плюс рекурсивно все файлы в директориях ./[0-9][0-9][0-9][0-9] становится нетривиальной.
 
Третьим лицам
 
Нет, тов. Алукард прав, -maxdepth 1 применить нельзя, он непозиционный.
 
$ find \( -maxdepth 1 -o -path './[0-9][0-9][0-9][0-9]*' \) -type f
find: warning: you have specified the -maxdepth option after a non-option argument (, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 12:40 03-07-2013 | Исправлено: ASE_DAG, 14:06 03-07-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обнаружил, что ссылки на http://www.funtoo.org в шапке «побились». Исправил.

#: шапка версии ASE_DAG, 19:23 08-10-2012


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:43 03-07-2013
Aroun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, помогите с регуляркой под поиск e-mail
 
grep -Eo '(\w+\.)*\w+@(\w+\.)+[A-Za-z]+' mail.log
 
Не выводит адреса с дефисом, например адрес mana-1@ya.ru он спарсит так:
 
1@ya.ru
 
 
Добавлено:
Сам же и отвечаю:
 
grep -Eo '[0-9A-Za-z.-]+@(\w+\.)+[A-Za-z]+' mail.log

Всего записей: 680 | Зарегистр. 19-07-2005 | Отправлено: 16:58 06-07-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aroun
Замечу, что вы напрасно считаете, что имя пользователя не может содержать (как минимум) знаков + и _. Причем +, если вы не в курсе, для большинства почтовых серверов имеет особый смысл — им отделяют своего рода «комментарий» — часть, которая не влияет на адрес доставки. Т. е. ivanov+foo@example.org, ivanov+bar@example.org — это один и тот же ivanov@example.org.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:28 06-07-2013 | Исправлено: ASE_DAG, 17:32 06-07-2013
Aroun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, все равно не получилось ((
 
Файл:
 
12_mail@mail.ru
manya_20@mail.ru
mana-1@ya.ru
123@mail.ru
123_123@mail.ru
123-123@mail.ru
123.123@mail.ru
 
Скрипт:
 
grep -Eo '\<+[a-zA-Z0-9\-\_\.\+]+@+\S+\>' mail.log
 
Результат:
 
12_mail@mail.ru
manya_20@mail.ru
1@ya.ru
123@mail.ru
123_123@mail.ru
123@mail.ru
123.123@mail.ru
 
 
т.е. не обрабатывает тире почему-то...Хотя она вроде заэкранировано.
 
Добавлено:
ASE_DAG
 
ну точка то есть, подчеркание добавил, плюс тоже добавлю.
 
Подскажите плз про тире

Всего записей: 680 | Зарегистр. 19-07-2005 | Отправлено: 17:41 06-07-2013 | Исправлено: Aroun, 17:48 06-07-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aroun
> grep -Eo '\<+[a-zA-Z0-9\-\_\.]+@+\S+\>' mail.log
> Хотя она вроде заэкранировано.
Во-первых, это не тире, это дефис. А во-вторых, где вы видели такой способ «экранирования» внутри []?
 
> @+
Нет, собака может быть только одна.
 
$ grep -Eo '[[:alnum:]._+-]+@[[:alnum:].-]+' <<< 'j.doe-89+for_spam@exampli-gratia.co.qq'
j.doe-89+for_spam@exampli-gratia.co.qq


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:55 06-07-2013 | Исправлено: ASE_DAG, 17:58 06-07-2013
Aroun



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Снимаю шляпу)
 
С регулярками до сегодняшнего дня не работал.

Всего записей: 680 | Зарегистр. 19-07-2005 | Отправлено: 18:09 06-07-2013
ConnorMegatroll

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток, $USERNAME !
 
Собственно, суть проблемы:  
необходимо скачать первые N изображений по запросу в гугле.  
Разумеется, используя только терминал LINUX.
 
Подкиньте пару идей, пожалуйста.
 
Заранее спасибо за помощь.

Всего записей: 3 | Зарегистр. 07-07-2013 | Отправлено: 18:31 07-07-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, ConnorMegatroll
sed + wget + bash устроят? Только у меня ключ "-T" не отрабатывает... Кодировка - не знаю нужна или нет.

Код:
 
#!/bin/sh
Count="21"
Search="Tattoo"
Encoding="UTF-8"
{
    wget -U Opera -t 3 -T 10 "http://www.google.com.ua/search?tbm=isch&source=hp&q=$Search" --local-encoding=$Encoding -O -
    for ((i=20;i<=$Count;i+=20))  
    {
        wget -U Opera -t 3 -T 10 "http://www.google.com.ua/search?tbm=isch&source=hp&q=$Search&start=$i" --local-encoding=$Encoding -O -
    }
} | sed -e "s/<a href/\n\0/g" | sed -n -e "s/.*imgres?imgurl=\([^&]*\)&.*/\1/p" | for ((i=1; i<=$Count;i++))
{
    read URL
    wget "$URL" -O "$Search$i.jpg"
}
 

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 20:08 07-07-2013 | Исправлено: Alex_Piggy, 20:10 07-07-2013
fhurpe

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

Всего записей: 1 | Зарегистр. 09-05-2013 | Отправлено: 14:53 09-07-2013 | Исправлено: fhurpe, 12:37 14-07-2013
sunsunsun

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
 
Есть строки вида:
 
<a class="song" href="/artist/aaa/song_bbb"><b>XXX YYY</b> ZZZ TTT</a>&nbsp;
 
необходимо получить строку вида XXX YYY - ZZZ TTT.
 
Как это сделать sed/awk/... ?
в cygwin, если это важно.

Всего записей: 105 | Зарегистр. 23-03-2006 | Отправлено: 13:10 16-07-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sunsunsun
 
> Как это сделать sed/awk/... ?  
 
По-хорошему — никак. Только если «в лоб».
 
$ sed 's|.*<b>\(.\+\)</b> \(.\+\)</a>.*|\1 - \2|' <<< '<a class="song" href="/artist/aaa/song_bbb"><b>XXX YYY</b> ZZZ TTT</a>&nbsp;'
XXX YYY - ZZZ TTT

 
> в cygwin, если это важно.
Не важно, под Цигвином поставляются нормальные ГНУ-шные утилиты.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 13:46 16-07-2013
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Можно и через сепараторы awk,но там тоже по сути "в лоб".

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 14:28 16-07-2013
sunsunsun

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

Всего записей: 105 | Зарегистр. 23-03-2006 | Отправлено: 14:29 16-07-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите раскидать из csv в xml.
Первый код это исходник, второй - то что должно получиться.
В xml должны меняться значения start и start_type, условия такие - если одна строка со временем, то ставятся 1, если на следующей строке такое же время то должны быть 0.
Третий столбец csv перемещается в строку duration, эта цифра должна умножаться на 25.
 
Исходник:

Код:
 
09:15;223456789_имя-15;15
09:45;123456789_имя-15;15
09:45;133456789_имя-10;10
10:55;133456789_имя-10;10
12:20;123450789_имя-20;20
14:25;123456789_имя-15;15
15:15;123456799_имя-5;5
16:10;123456789_имя-15;15
16:10;133456789_имя-10;10
 

 
Что должно получиться:

Код:
 
<?xml version="1.0" encoding="UTF-8"?>
    <item url="223456789_имя-15"
        duration="375"
        comment="09:15"
        start=1
        start_type=1 </item>
        <item url="123456789_имя-15"
        comment="09:45"
        start=1
        start_type=1 </item>
    <item url="133456789_имя-10"
        duration="250"
        comment="09:45"
        start=0
        start_type=0 </item>
    <item url="133456789_имя-10"
        duration="250"
        comment="10:55"
        start=1
        start_type=1 </item>
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:43 10-08-2013 | Исправлено: digital422, 19:46 10-08-2013
albel



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

Код:
 
#!/bin/awk -f
BEGIN     {   FS=";"
        printf ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
        }
NR == 1 {   START=$1
        TYP=1
    }
{    printf("\n<item url=\"%s\"\n", $2)
    printf("\tduration=\"%d\"\n", $3*25)
    printf("\tcomment=\"%s\"\n", $1)
    if ( $1==START && NR>1 )  
    {    TYP=0
    }
    else  
    {    TYP=1
    }
    START=$1
    printf("\tstart=%d\n",TYP);  
    printf("\tstart_type=%d\n</item>",TYP);
}  
 
 


----------
Я никогда не спорю. Я никогда не противоречу. Я иногда забываю. / © Б.Дизраэли/

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 21:13 10-08-2013 | Исправлено: albel, 21:14 10-08-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Ужас, Вы не могли циферки в "url" для примера попроще написать или вообще обойтись совсем примером, а то, искать отличия в них очень неприятно.
 
И ещё, не очень понятно про start и start_type, кажется у Вас зависимость не совсем такая — получилось так: только при совпадении и url и duration ставятся нули.
 
Добавлено:
Надеюсь что т. albel осознал вопрос лучше меня

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:14 10-08-2013 | Исправлено: Alukardd, 21:16 10-08-2013
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
вроде всё в соответствии с ТЗ сделал :-D
Я не заморачивался смыслом параметров, только их положением

----------
Я никогда не спорю. Я никогда не противоречу. Я иногда забываю. / © Б.Дизраэли/

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 21:17 10-08-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
albel
А ТЗ — это Точка Зрения?

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:30 10-08-2013
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:39 10-08-2013 | Исправлено: digital422, 19:48 12-08-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Странная штука наблюдается. Есть в xlsx файле ячейка со временем, но после экспорта в csv через xlsx2csv.py вместо времени появляется такое: 80040.0. Как с этим можно бороться или преобразовать в нормальное временное значение?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:48 12-08-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Утилита xlsx2csv.py имеет ключ -f (--dateformat=), увы он предназначен для управления выходным форматом для записи в csv. На вход ему подавай полный формат времени, так что треба открыть Excel или Calc и поменять формат ячейки на MM/DD/YYYY HH:MM:SS.
Или возможно подыскать замену данному скрипту.
 
p.s. за 15минут большая из скрипта и его апробации не вынес, так что мог что-то упустить из его возможностей.
 
Добавлено:
А вот ещё немного вник в код, формат ячейки HH:MM:SS он воспринимает как "time", а после его можно заставить парсить его как дату, см. код в строках 291-340 (функция handleCharData)
 
Что-то башка не варит, так что сделал костыль вот такой:
if (format_type == 'date') or (format_type == 'time'): # date/time
Что заменить в указанном выше диапазоне строк очевидно.
 
Вызывать потом скрипт придётся с параметрами, что бы везде год 1904 не появился
python xlsx2csv.py -f '%Y %H:%M' datetime.xlsx datetime.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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:37 12-08-2013 | Исправлено: Alukardd, 22:21 12-08-2013
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно ли сделать заливку файлов на Яндекс.Диск из шелла? Подсобите, если возможно... Принимаются любые методы - curl, python, perl - любые!

Всего записей: 11595 | Зарегистр. 03-08-2008 | Отправлено: 13:19 13-08-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127
Учимся использовать поисковые системы.
 
Цитата из первой же ссылки:
Цитата:
Yandex.Disk can be accessed by WebDAV. Install vebdavfs2:
 
# apt-get install davfs2
 
Then edit /etc/davfs2/secrets. Just add line with address, login and password:
 
https://webdav.yandex.ru username@yandex.ru "userpass"
 
Now you cat mount yandex.disk as an ordinary drive to folder /mount/yandex:
 
mount -t davfs https://webdav.yandex.ru /media/yandex
 
Now it is possible to store backups in cloud.


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:39 13-08-2013
MERCURY127



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

Всего записей: 11595 | Зарегистр. 03-08-2008 | Отправлено: 14:00 13-08-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - сегодня выяснилось что программа на выходе может выдавать txt файл с табуляцией, так что никакой xlsx уже не нужен. Спасибо за правку xlsx2csv.py, может когда нибудь сгодится. Вообще крайний вариант был загонять xlsx в LibreOffice и сохранять в csv, тогда ячейка даты сохраняется нормально.
 
Как из 2 строки с текстом "на дату 14.08.2013  " выделить саму дату и изменить точки на "-", на 2 вопрос я похоже знаю ответ- gsub(/./-/,);. Все в рамках скрипта с заголовком #!/usr/bin/gawk -f.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:37 13-08-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> Вообще крайний вариант был загонять xlsx в LibreOffice и сохранять в csv
 
Не вижу в этом ничего крайнего. Именно так и надо было делать с самого начала.
 
Для тех, кто будет это читать, напоминаю, как оно делается:
$ soffice -env:UserInstallation=file://$HOME/.libreoffice-headless --headless --convert-to csv test.xlsx
 
-env:UserInstallation — это воркэраунд вокруг бага № 37531.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:57 13-08-2013 | Исправлено: ASE_DAG, 21:58 13-08-2013
FoxBlack09

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день. Вопрос таков:
Есть файл лицензии drweb. В нём есть строчка Expires=2013-09-14 (14:57) UTC с датой истечения лицензии. Как извлеч эту дату и сравнить её с текущей датой? В случае истечения срока лицензии хотелось бы отправлять письмо на почту. Как можно всё это реализовать?
 

Всего записей: 510 | Зарегистр. 01-04-2009 | Отправлено: 15:09 19-08-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FoxBlack09
Код:
#!/bin/bash
if [ $(($(date --date="$(awk -F= '/Expires/{print $2}' /tmp/drweb)" '+%s') - $(date '+%s'))) -lt 0 ]; then
  env MAILRC=/dev/null from=user@mail.ru smtp=smtp.mail.ru smtp-auth-user=user@mail.ru smtp-auth-password=87JQS8wZ smtp-auth=login mailx -n -s "DrWeb License" user@mail.ru <<< "License expired!!!"
fi

Утилита mailx должна быть из пакета heirloom-mailx.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:49 19-08-2013 | Исправлено: Alukardd, 15:59 19-08-2013
FoxBlack09

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Спасибо, я пошёл пробовать.

Всего записей: 510 | Зарегистр. 01-04-2009 | Отправлено: 16:14 19-08-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, FoxBlack09
Или вариант с предупреждением о истечении срока:

Код:
 
#!/bin/sh
drwebkey="drweb32.key"
email="MYMAIL"
keydate=$(sed -r -n -e "/Expires/{s/Expires=(.*)$/\1/p;q}" "$drwebkey")
timeleft=$(($(date --date="$keydate" +"365*%y+%j") - ($(date +"365*%y+%j"))))
if [ $timeleft -le 30 ]; then  
echo "$timeleft days left to expire DrWeb license at $(uname -n)" | mail -s "License expires!" $email
fi
 

PS. Попрошу сапогами не бить за возможные ошибки ;-). Работу mail не проверял.  
Исправлено: не "%d", а "%j". Вроде проверял ?
del Где-то ошибка в арифметике. Прошу прощения. Ищу. Еще и скобки потерял в группировке... Прошу прощения...
Про $((($(date --date="$keydate" +"%s") - $(date +"%s"))/(24*3600))) не сообразил... Может будет и правильнее.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 16:15 19-08-2013 | Исправлено: Alex_Piggy, 16:41 19-08-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
в таком варианте mail будет работать только если данный сервер настроен соответственно как почтовый сервер.
 
p.s. да можно было бы и заранее предупреждать, просто вместо 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:27 19-08-2013
Weinaum



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

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 20:03 12-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
А кто у вас там пишет логи? Не в смысле «какой человек», а какой механизм?
 
P. S. Ну и если вы поясните, зачем это все нужно, то будет вообще замечательно.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:51 12-09-2013 | Исправлено: ASE_DAG, 21:06 12-09-2013
Weinaum



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

Цитата:
А кто у вас там пишет логи? Не в смысле «какой человек», а какой механизм?
 
P. S. Ну и если вы поясните, зачем это все нужно, то будет вообще замечательно.
 

У меня в логах все нормально, а нужно в принципе только в целях эксперимента и вот зачем.
Есть vps халявный, который я себе заточил под конкретные нужды, и в принципе все что мне надо там работает в автономном режиме, и я туда неделями не хожу.
Но тут выясняется, что хозяева просят активность root, не реже раза в сутки. Ну и я тут ничего другого не придумал, как создал простейший скрипт, по которому раз в день захожу по ssh, делаю пару движений, потом после небольшой паузы выхожу.
Но поскольку не знаю, как они там мониторят активность на своих виртуальных машинах, подумал о том, чтобы добавить в скрипт что то такое, чтобы имитировать случайные действия, или что то в этом роде, чтобы при этом не нанести вреда самой системе )))).
Вот как то так, да, ос debian 6.0, виртуализация вроде openvz, нужды мои абсолютно безвредные и нужны только мне.

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 23:26 12-09-2013 | Исправлено: Weinaum, 23:27 12-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
> как они там мониторят активность
Да дело в том, что я вот так навскидку не назову ни одного механизма, которым можно логировать команды, которые отдает пользователь. При условии, разумеется, что он сам не оставляет их в .bash_history и т. п. местах.
 
> просят активность root, не реже раза в сутки
Я бы на вашем месте сделал самоочевидную вещь — раз в сутки все бэкапил. Вполне себе естественная активность и случайности никакой не требуется.
 
> Есть vps халявный
А ежели не секрет: он для всех халавный или это только вам такая радость перепала?


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:33 12-09-2013 | Исправлено: ASE_DAG, 23:35 12-09-2013
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А в принципе да, что то я действительно такую самоочевидную вещь не увидел ))

Цитата:
А ежели не секрет: он для всех халавный или это только вам такая радость перепала?

да какой секрет, в данном случае речь о vps.me - http://www.vps.me/free-vps
машинка конечно не ахти мягко говоря, но я в общем-то чисто в виде опытов, как говорится, что лежит, может в хозяйстве и сгодится.  
А так есть еще http://www.host1free.com/vps-registration/, еще на кодинге можно использовать - но там вм отключается после 15 минут неактивности в системе.
Ну и самый нормальный на мой взгляд вариант всем известный от амазона...вроде еще где-то бывает, но все-таки это для данной темы сильно оф...еще раз снкс за простую подсказку )))

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 01:07 13-09-2013 | Исправлено: Weinaum, 01:09 13-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
> в данном случае речь о vps.me
> хозяева просят активность root, не реже раза в сутки
 
Хм. А на http://www.vps.me/free-vps у них сказано, что раз в месяц. Врут?

Цитата:
Our goal is to provide free VPS for everyone who uses it actively, so you should login to your server or to our control panel at least every 30 days.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:42 13-09-2013 | Исправлено: ASE_DAG, 19:42 13-09-2013
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
да не трогали, в том то и дело, а тут вдруг такие письма от них получаю:

Цитата:
Your Free VPS (site.com) which was activated at Saturday, 20 July 2013 is now SUSPENDED due to reason:
 
Root user has never logged in to VPS during 24 hours!

 

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 01:37 14-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Подскажите, как в gawk обработать 2 строку txt файла, чтобы из всей строки выделить значение с датой ?
2. Конструкция ниже выводит значение времени, как от него отнять 10 минут ?
{ if (NR == 5)
print $3 }

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 08:44 14-09-2013 | Исправлено: digital422, 10:35 14-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
1. Только явно перечислив все возможные форматы даты.
2. Проще всего будет воспользоваться утилитой date(1).

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:28 14-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Формат даты - 14.09.2013 (число, месяц, год, через точку). Сделал через gsub, но наоборот, дата убирается, а текст остается, как сделать наоборот?
2. Исходник csv, можно ли date запускать в gawk скрипте ?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
1. match()
2. command | getline [var]

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Попробую.
2. date не подходит, текст времени фиксированный, например 10:05, из него надо отнять время, например 5 минут, должно получиться 10:00 или см. 3 вопрос.
3. В итоге должно получится 2456551.0000000000. 2456551 - это дата 15/09/2013, 0000000000 - это время 00:00:00:00 (0062500001 - 00:09:00:00). В каком это формате и как через gawk скрипт получать такие значения из нормальных единиц времени и даты ? Из временного значения надо получить время за минусом нескольких минут назад, вопрос 2.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:21 14-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2. Не понял. Не фиксированный, вы хотели сказать? Ну ежу понятно, что нет.
$ gawk -f - <<_EOF
BEGIN {
    time="10:05"
    "date -d '-5min " time "'" | getline newtime
    print newtime
}
_EOF

 
Sat Sep 14 10:00:00 MSK 2013
 
3. date [OPTION]... [+FORMAT]

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2. Вот так сделал, работает, отнимает время от $3.
{if (NR == 5)
{ t=$3
     time=t
     "date '+%H:%M' -d '-5min " time "'" | getline newtime
     print newtime
 }
 }

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:21 14-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> t=$3
> time=t
 
t=$3
ti=t
tim=ti
time=tim

 
:-D
 
Добавлено:
В порядке повышения связности дописал в шапку следующее: «Смотри в других ветках: wget, convert, montage, mogrify и др., git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:25 14-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2. Можно оказывается и так сделать:
system("date +%H:%M -d '-5 min "time"'")
 
3. Не могу понять, что за значения даты - 2456551 (15/09/2013) и времени - 0062500001 (10:00:00:00) , это не миллисекунды ( data +%s).

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 22:47 14-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
2.
> system("date +%H:%M -d '-5 min "time"'")
И что вам это даст?
 
3. Я тоже. Обратитесь к документации.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:54 14-09-2013
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
http://www.funaba.org/en/calendar-conversion.cgi?date=2013-09-15&i=gregorian&o=all
 

Цитата:
2456551 (15/09/2013)

chronological Julian day number (JD)

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 04:25 15-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
albel - Спасибо за информацию, теперь надо думать, как сделать преобразование используя gawk.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:24 18-09-2013 | Исправлено: digital422, 20:24 18-09-2013
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 17:28 20-09-2013 | Исправлено: digital422, 20:33 22-09-2013
RaP1D



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
Помогите написать скрипт на bash, проходящий по всем файлам в каталоге (и подкаталогах) с заданным расширением.
 
Есть следующее:
/target_directory
pngtopvr.sh
converter
 
При запуске pngtopvr.sh скрипт должен проходить по файлам директории target_directory и скармливать их в converter.
 
Ввиду отсутствия опыта написания скриптов, хватило лишь на это:

Код:
 
#!/bin/sh
find 'target_directory' -iname '*.png'
 

 
Скрипт выводит файлы, но вот каким образом их передать в converter не пойму...

Всего записей: 186 | Зарегистр. 29-12-2007 | Отправлено: 12:47 25-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Надо не удалять сообщение, а привести здесь итоговый вариант.
 
RaP1D
> но вот каким образом их передать в converter не пойму
Мне не известна утилита с названием converter (репозиторий Дебиана со мной солидарен), я понятия не имею как она принимает файлы, соответственно и как их передать не подскажу.
 
> Помогите написать скрипт на bash
> #!/bin/sh
N. B. /bin/sh — в общем случае не Баш.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, RaP1D
А я вот рискну предположить, что скармливать надо просто путь к найденному файлу:
find "$target_directory" -iname '*.jpg' -exec converter {} \;
 
RaP1D, изучаем man find

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:29 25-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG - получилось жутко, писал методом тыка, это лучше не показывать.
Вот очередная, надеюсь не сильно сложная задача:
Пингуем хост, если он отвечает монтируем ftp сервер, делаем синхронизацию и отмонтируем папку. Скрипт работает, но есть много адресов $HOST1 и серверов $G1. Можно ли сократить скрипт так, чтобы для каждого адреса не создавать новых строчек  ?
 

Код:
 
$FPING -u $HOST1 >& /dev/null
    if [ $? -ne 0 ]; then
    exit 1
    fi
mountpoint -q $MOUNT/$G1
    if [ $? -ne 0 ]; then
    curlftpfs $HOST1 $MOUNT/$G1 -o user=login:password
    $RSYNC $OPTION $IN/$G1 $OUT/$G1
    fi
 
umount $MOUNT/$G1
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:02 25-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> получилось жутко, писал методом тыка, это лучше не показывать
Это лучше показать.
 
Добавлено:
> но есть много адресов $HOST1 и серверов $G1
Где есть? В каком-то файле?
 
> сократить скрипт так, чтобы для каждого адреса не создавать новых строчек?
В любом случае, очевидно, использовать цикл for.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:35 25-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
>> но есть много адресов $HOST1 и серверов $G1  
> Где есть? В каком-то файле?  
Описываются в начале скрипта
 
>> сократить скрипт так, чтобы для каждого адреса не создавать новых строчек?  
> В любом случае, очевидно, использовать цикл for.
Надо чтобы было $HOST1 $G1 , $HOST2 $G2, $HOST3 $G3 и т.д. А через for получаются все комбинации.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:56 25-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> $HOST1 $G1 , $HOST2 $G2, $HOST3 $G3 и т.д.
$LOGIN и $PASSWORD еще, наверное.
 
> через for получаются все комбинации
Массив, не?
 
Добавлено:
Если не хотите массив, то возможен еще специфический шелловский подход с heredoc’ом:
 
while read HOST G; do
    echo "$G" :: "$HOST"
done <<_EOF
    foo.example.org foo
    bar.example.net bar
_EOF

 
P. S. Вы скрипт-то, который с юлианским днем, приведите.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:08 25-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Преобразование даты в формат chronological Julian day number (JD). В исходном csv файле 2 строка содержит дату, в 5 строке есть время, от которого надо отнять 10 минут.

Код:
 
#!/usr/bin/gawk -f
# ======================= date ===================
NR == 2 {
match ($1, /([.0-9]+)/, s);
split(s[1], a,".");
"date '+%s' -d "a[3]"-"a[2]"-"a[1]"" | getline newdate
dt=newdate/86400+2440588
}
# ================================================
 
# ======================= time ===================
NR == 5 {
split($3, t,":");
"date '+%H:%M' -d '-10 min "t[1]":"t[2]"'" | getline newtime
split(newtime, tt,":");
hour=tt[1]/24
minute=tt[2]/1440
summ=(hour+minute)
split(summ, tm,".");
printf "%.0f",dt
printf "."
printf tm[2]
}
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 06:22 26-09-2013
digital422

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

Код:
 
for h in "$IP1 $HOST1" "$IP2 $HOST2"; do
set $h
$COMMAND1 $1
$COMMAND2 $2
done
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:06 26-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Не, ну если мы занимаемся ненормальным программированием, то я еще могу накидать. Вот, например:
 
set host            dir \
    foo.example.org foo \
    bar.example.net bar \
    baz.example.com baz
 
while shift 2 && (($#>0)); do
    echo "$2 :: $1"
done


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:25 26-09-2013 | Исправлено: ASE_DAG, 21:30 26-09-2013
kpp77

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

Цитата:
Скрипт работает, но есть много адресов $HOST1 и серверов $G1. Можно ли сократить скрипт так, чтобы для каждого адреса не создавать новых строчек  ?

 

Код:
#!/bin/sh
 
hosts="server1 login1 pass1 dir1
...
serverN loginN passN dirN"
 
echo "${hosts}" | while read server login pass dir
do  
  # сделать что нужно
  # в переменных server login pass dir поочередно будут  
  # значения server1 login1 pass1 dir1 ... serverN loginN passN dirN
done

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:47 27-09-2013 | Исправлено: kpp77, 12:53 27-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd (12:13 30-09-2013)
Цитата:
Народ подскажите вылезает вот такая ошибка:
find: pred.c:1932: launch: Assertion `starting_desc >= 0' failed.
Aborted

Выполняю команду:
# su www-data -c 'find /var/www -type d -exec chmod g+s "{}" \;'
 
# ls -la /var/www  
total 108
drwxr-xr-x 27 root     root     4096 Сен 25 10:08 .
drwxr-xr-x 13 root     root     4096 Сен 17 18:10 ..
drwxrwxr-x  5 www-data www-data 4096 Сен 17 12:02 3311.old
drwxrwxr-x  5 www-data www-data 4096 Сен 17 12:02 algot.ru
. . .

Как права розданы сейчас думаю понятно: на сам /var/www доступ только у root'а, а дальше всему владелец www-data.
 
Причём команда find вылетает даже если я буду её выполнять на какой-нить вложенный каталог, на который у www-data уже полные права и на родителя тоже.
 
p.s. был какой-то баг в 2006-2007 году при отсутсвии прав на чтение в родительском каталоге вылетала такая же ошибка, но у меня всё с этим в порядке и если не выполнять -exec, а выполнить, например -print, то всё отработает без ошибок.
От root'а команда бегает без ошибок.

 
Не «какой-то», а вполне конкретный баг № 153884. Там написано, в какой версии он пофикшен — 4.3.12, а также написано что фикс не в один релиз пока (на 2007 год) не попал. Не знаю как это понимать, но:
 
~$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
<skipped>
 
~$ ll -a /tmp/a/www
total 12K
drwxr-xr-x 3 main main 4,0K Sep 30 18:59 .
drwxr-x--x 3 root root 4,0K Sep 30 18:59 ..
drwxrwsr-x 3 main main 4,0K Sep 30 18:41 example.org
 
~$ find /tmp/a/www -type d -exec echo {} \;
/tmp/a/www
/tmp/a/www/example.org
/tmp/a/www/example.org/dir
 
~$ cd /tmp/a
 
/tmp/a$ find /tmp/a/www -type d -exec echo {} \;
find: pred.c:1932: launch: Assertion `starting_desc >= 0' failed.
Aborted

 
Добавлено:
Ну а что делать, если желания докапываться до причины нет, я думаю, понятно:
$ find /tmp/a/www -type d | while read d; do chmod g+s "$d"; done

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:05 30-09-2013 | Исправлено: ASE_DAG, 19:25 30-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Вай!
# su www-data -c 'cd /var/www/ && find /var/www -type d -exec chmod g+s "{}" \;'
Вот так отработала!!!
Т.е. если у меня команда find будет исполняться в cron файле от пользователя www-data, у которого домашним каталогом назначен /var/www, то всё должно работать правильно? В принципе ближайшей ночью увижу... Лень менять время в кроне...
 
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:27 30-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, ну да, вероятно, будет. Но все-равно, отпишитесь, когда проверите, пожалуйста.
 
А что это, если не секрет, за подход — ежесуточно назначать SGID-бит директориям?
 
Добавлено:
А у файнда необходимым и достаточным условием проявления бага является нечиатемая текущая директория. От того, что и где мы ищем это вообще не зависит.
 
/tmp/b$ ls
ls: cannot open directory .: Permission denied
/tmp/b$ find / -exec echo {} \;
find: pred.c:1932: launch: Assertion `starting_desc >= 0' failed.
Aborted



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:47 30-09-2013 | Исправлено: ASE_DAG, 19:54 30-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Да про текущую директорию ужё понял...
Назначение SGID бита это лишь одна из строчек скрипта, который гоняет данные между серверами, а назначение прав идёт т.к. некоторые кривые разработчики(заказчик настроек, он же владелец сервера) любят от root'а сидеть и ни чего я с этим поделать не могу, так вот что бы права всегда были в норме то после синхронизации я их рекурсивно переписываю, ну и SGID бит тоже как защита от того что все сидят с разными юзерами, а потом nginx'у файлы не открыть...
Вот как-то так печально мы с этим и живём.
 
Да, постараюсь не забыть завтра отписать, cron в 5 утра скрипт прогонит как есть, без cd.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:59 30-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Ошибок от find'а в логе cron'а нету, видать отработал нормально, чего не скажешь о скрипте в целом, но это уже мои пролемы.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 09:36 01-10-2013
digital422

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

Код:
Received: from domain.com (mail.domain.com [11.222.333.44]

приводить в вид:

Код:
domail.com             REJECT Spam_domain-com.

Есть варианты?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 11:37 01-10-2013 | Исправлено: digital422, 11:37 01-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
Есть варианты?
? Если речь только о работе со строкой, то:
echo " Received: from domain.com (mail.domain.com [11.222.333.44] " | gawk '{print $3" REJECT Spam_"gensub("\\.","-","g",$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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:00 01-10-2013
digital422

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

Код:
/usr/bin/find $PATH -type f $domain -exec /bin/grep "Received: from" {} \; \
| /bin/grep -v "127.0.0.1" | /bin/grep -v "localhost"

избавится бы еще от кучи grep (для исключения правильных и локальных хостов)

Код:
domail.com             REJECT Spam_com.  

Как выделить имя домена с точкой?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:00 01-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
ну заменить grep'ы не проблема выражением в 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:40 01-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
попробую распутать:
из domain.com сделать .com
в предыдущем скрипте я делал через match и потом split. Наверно можно попроще.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 15:51 01-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Т.е. мою команду можно оставить, только изменить последний кусок, оставив только TLD часть от FQDN?

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:11 01-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
>только изменить последний кусок, оставив только TLD часть от FQDN?
Да.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 17:52 01-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
echo " Received: from sub.domain.com (mail.domain.com [11.222.333.44] " | gawk '!/localhost|127\.0\.0\.1/{print $3" REJECT Spam_"gensub(/.*\.([[:alpha:]]*)$/,"\\1","",$3)"."}'
 
grep -v, я тоже там уже реализовал как Вы могли заметить.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:14 01-10-2013 | Исправлено: Alukardd, 19:21 01-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Уже что-то вырисовывается . Осталось в первом столбце hostname сокращать до 2 уровня и сделать сортировку по TLD и можно запускать в работу.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:19 02-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Ну команду sort думаю через pipe уж сами выполните... А саму команду подправил по Вашим просьбам:
gawk '!/localhost|127\.0\.0\.1/{print gensub(/.*\.([[:graph:]]*\.[[:alpha:]]*)$/,"\\1","",$3)" REJECT Spam_"gensub(/.*\.([[:alpha:]]*)$/,"\\1","",$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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:45 02-10-2013 | Исправлено: Alukardd, 20:49 05-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Alukardd - Последний штрих, как в теле почтового сообщения выловить только 2 строку с содержанием "Received: from" - с последним почтовым сервером, который отправил сообщение, тогда возможно первая конструкция, с localhost и 127.0.0.1 будет не нужна.
 
2. Единый csv файл:
10:00;12345;текст
10:00;12346;текст
11:00;12345;текст
12:00;12345;текст
разбить на несколько файлов, чтобы в каждом файле был свой блок со временем и это время было в части имени файла, например исходный 04-10-2013_name.txt, а стал  04-10-2013_10-00_name.txt

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 13:54 04-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Во первых я щас изменил свою предыдующую команду, там надо было использовать [:graph:], вместо [:alpha:] в том месте где выбирается имя домена. TLD вроде как только буквенные, а вот уже само имя домена, может быть и с цифрами и с тире, мб и ещё что может быть, но я не парясь написал graph, т.к. это не форма для проверки, а анализатор логов, так хери там уже по определению быть не должно.
 
1. В письме обычно одна строка Recieved: from, что значит 2-я?
 
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:55 05-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd -  
1. В теле письма первая строка "Recieved: from" с последующим содержимым это мой почтовик, который принял письмо. Вторая часть "Recieved: from" это почтовик, который отправил сообщение, вот его доменное имя и надо загонять в текстовый файл для блокировки. Также могут идти ниже несколько "Recieved: from", но они интереса уже не представляют. Скрипт пассивно обрабатывает все строки "Recieved: from", в том числе в которых есть просто IP адрес. Проверю с [:graph:].
 
2. Критерий разбиения: входной файл - 04-10-2013_name.txt,  берем из него строки с одинаковым временем и создаем новый файл в котором после даты будет указанно это время и в самом файл строки с этим временем.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 22:00 05-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
1. Ну хз, у меня exim проставляет один from, а остальные идут by... Ну Вам виднее, что там у Вас да как.
А что, есть разница, что делать: проверять наличие localhost или считать строки? Написать не сложно, реализация простая, но оно имеет смысл или нет?
 
2. gawk -F\; '{print $0 >> gensub(/(.*)_(.*)/,"\\1_"gensub(":","-","",$1)"_\\2","",FILENAME)}' 04-10-2013_name.txt
 
p.s. пора бы Вам уже подружиться с 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:34 05-10-2013 | Исправлено: Alukardd, 22:36 05-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. У меня postfix, везде стоит from. В 3 и ниже строках могут быть правильные домены, с которых отправляют почту через relay, который и стоит 2-м from.
 
2. Не получается подружиться, теоретически понятно, а вот на практике результата нет. С григорианской датой 2 суток делал, но написал .

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 22:42 05-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
1. есть ли смысл писать то, о чём вы просили или исключение localhost так же нормально работает?
 
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:24 05-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - не откажусь от простого примера поиска в 3 строке текста "Received".
/bin/cat $i | /usr/bin/gawk '/Received:/'   - что надо дальше?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:04 07-10-2013 | Исправлено: digital422, 20:04 07-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
/bin/cat $i | /usr/bin/gawk -v i=0 '/^Received/{if (i++ == 2) {print gensub(/.*\.([[:graph:]]*\.[[:alpha:]]*)$/,"\\1","",$3)" REJECT Spam_"gensub(/.*\.([[:alpha:]]*)$/,"\\1","",$3)"."}}'
Найдёт 3-ее вхождение строки начинающейся с Received и отформатировав выведет её.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:14 07-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - работает, спасибо! Дошел до сортировки
Как вставить между строками символ "#"  
au.domain
au.domain1
com.domain
net.domain
ru.domain
 
чтобы получилось:
 
au.domain
au.domain1
#
com.domain
#
net.domain
#
ru.domain

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 12:21 15-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Критерий разрыва какой? Смена TLD?

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:39 15-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, по TLD, чтобы удобнее было читать разделение.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 13:51 15-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
gawk -F. '{if (FNR == 1) {tld=$1} else { if (tld != $1) {tld=$1; print "#"}}; print}'
 
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:55 15-10-2013 | Исправлено: Alukardd, 22:46 15-10-2013
mithridat1



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

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 21:06 16-10-2013 | Исправлено: mithridat1, 21:08 16-10-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mithridat1
Цитата:
Подскажите,как в баше сделать выход из цикла,то есть так чтобы прервался только цикл,но не скрипт ? Пробовал break,но эта команда  у меня прерывает выполнение всего скрипта.
 
Стоит следующая задача - перебрать массив данных и в случае выполнения определенного условия прервать цикл,иначе - продолжать перебор для выяснения элемента наиболее подходящего другому условию.

Цикл прерывает именно break.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:12 16-10-2013 | Исправлено: ASE_DAG, 21:15 16-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mithridat1
Цитата:
как в баше сделать выход из цикла

Цитата:
break [n]
       Exit from within a for, while, until, or select loop.  If n is specified, break n levels.  n must be >= 1.  If n is
       greater than the number of enclosing loops, all enclosing loops are exited.  The return value is 0 unless n is not  
       greater than or equal to 1.
 
 
continue [n]  
       Resume the next iteration of the enclosing for, while, until, or select loop.  If n is specified,  resume  at  the  
       nth  enclosing  loop.  n must be >= 1.  If n is greater than the number of enclosing loops, the last enclosing loop
       (the ``top-level'' loop) is resumed.  The return value is 0 unless n is not greater than or equal to 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:16 16-10-2013 | Исправлено: Alukardd, 21:39 16-10-2013
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Alukardd
Да,действительно,ступил у себя в одном месте Спасибо за разъяснения !

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 21:35 16-10-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Забавно.
 
$ ARRAY=( a b c )
$ a='ARRAY'
$ echo ${!a[0]} # косвенная ссылка на массив
a
$ # все правильно
$ echo ${!a[1]}
 
$ # баг?
$ echo ${!a[@]}
0
$ # тоже правильно, поскольку это уже совсем другой синтаксис, но совершенно неочевидно

 

Цитата:
       
       ${!prefix*}
       ${!prefix@}
          Names  matching prefix.  Expands to the names of variables whose
          names begin with prefix, separated by the first character of the
          IFS  special variable.  When @ is used and the expansion appears
          within double quotes, each variable name expands to  a  separate
          word.
 
       ${!name[@]}
       ${!name[*]}
          List  of    array  keys.  If name is an array variable, expands to
          the list of array indices (keys) assigned in name.  If  name  is
          not  an  array,  expands to 0 if name is set and null otherwise.
          When @ is used and the expansion appears within  double  quotes,
          each key expands to a separate word.
— bash(1)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 05:44 24-10-2013 | Исправлено: ASE_DAG, 05:46 24-10-2013
D1D1D1D

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

Всего записей: 1368 | Зарегистр. 05-04-2010 | Отправлено: 00:28 25-10-2013 | Исправлено: D1D1D1D, 00:30 25-10-2013
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите,где найти версию утилиты sort под Linux с поддержкой рандомной сортировки (-R)

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 17:07 28-10-2013
Santal

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mithridat1
 
https://www.gnu.org/software/coreutils/
 
а для какого дистрибутива?

Всего записей: 29 | Зарегистр. 24-07-2006 | Отправлено: 17:42 28-10-2013 | Исправлено: Santal, 17:42 28-10-2013
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Santal
CentOS 5.x
 
Вопрос решен  - сделал обновление coreutils по этой инструкции http://www.question-defense.com/2010/08/07/install-or-upgrade-one-application-from-coreutils-package-on-centos-linux

Всего записей: 4960 | Зарегистр. 05-01-2006 | Отправлено: 17:49 28-10-2013 | Исправлено: mithridat1, 18:17 28-10-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sanchomaster (15:40 01-11-2013)
Цитата:
Здравствуйте, подскажите пожалуйста каким образом можно дописать последнюю строку в файле, >> записывает данные в новую строку, а мне нужно именно дописать последнюю.

 
PlastUn77 (16:14 01-11-2013)
Цитата:
ну например так
#echo -n 'text kototy nuno dopisat' >> test.txt
или так  
#echo -e '\b text kototy nuno dopisat' >> test.txt

 
 
PlastUn77, проверяйте что-ли свои советы прежде чем давать их.
 
$ \cat sanchomaster.txt
First line.      
Second line.
Last line.
$ echo -n 'text kototy nuno dopisat' >> sanchomaster.txt
$ \cat sanchomaster.txt
First line.
Second line.
Last line.
text kototy nuno dopisat$ # ага, \n нет в новой строке

 
$ echo -e '\b text kototy nuno dopisat' >> sanchomaster.txt
А это какая-то адовая ересь, в результате получится именно то, что написано — новая строка с непечатаемым символом в начале. В Виме это будет выглядеть так:
First line.
Second line.
Last line.
^H text kototy nuno dopisat

 
Sanchomaster, если вы ограничены в средствах не строго Башем, а всем окружением ГНУ, то короче всего Седом:
$ sed -i '$s/$/append this/' sanchomaster.txt  
$ \cat sanchomaster.txt  
First line.
Second line.
Last line.append this

 


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:17 01-11-2013 | Исправлено: ASE_DAG, 19:20 01-11-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток.
Сидел битых часа 3 думал, гуглил, так и не чего не придумал, может кто поможет.
Есть два файла:
1) строки с текстом
aabbbcc hhh
bbb cc  
cc hh
btrnr hnyrt yhnry
 
2) номера строк
2
4
 
как удалить из первого файла строки с соответствующими номерами, ничего путного не придумал, как только через awk сделать скрипт большущим множеством  
 

Код:
sed 'номерстрокиd'


Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 00:41 05-11-2013 | Исправлено: Krist, 00:46 05-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
$ cat num
2
4
 
$ cat list
First line.
Second line.
Third line.
Fourth line.
 
$ gawk 'ARGIND == 1 { d[$0]++ }; ARGIND == 2 && !d[FNR]' num list
First line.
Third line.

 
Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:08 05-11-2013 | Исправлено: ASE_DAG, 01:11 05-11-2013
Krist



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

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 01:20 05-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что значит «даже на Цигвине»? Цигвин — вполне себе гнушное окружение. Вот на Фре — не будет, переменная ARGIND, содержащая номер п/п обрабатываемого файла введена только в gawk’е. Но это не беда, можно записать так:
$ original-awk 'FILENAME == ARGV[1] { d[$0]++ }; FILENAME == ARGV[2] && !d[FNR]' num list

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:26 05-11-2013 | Исправлено: ASE_DAG, 01:26 05-11-2013
sanchomaster



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

Цитата:
Sanchomaster, если вы ограничены в средствах не строго Башем, а всем окружением ГНУ, то короче всего Седом:  
$ sed -i '$s/$/append this/' sanchomaster.txt  
$ \cat sanchomaster.txt  
First line.  
Second line.  
Last line.append this  

 
ASE_DAG, спасибо, получилось, но есть еще вопрос, как туда добавить переменную?
 
$ sed -i '$s/$/$append this/' sanchomaster.txt
 
sed не определяет что внутри конструкции она есть.
 
Сам нашел ответ, если кому понадобится, то:
 

Цитата:
$ sed -i "$s/$/$append this/" sanchomaster.txt

либо

Цитата:
$ sed -i '$s/$/'$append this'/' sanchomaster.txt


Всего записей: 21 | Зарегистр. 08-11-2011 | Отправлено: 09:44 05-11-2013 | Исправлено: sanchomaster, 10:03 05-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sanchomaster
> $ sed -i '$s/$/'$append this'/' sanchomaster.txt
Нет, так делать нельзя — оставлять пробелы и переменные, которые их могут содержать, незакавыченными.

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

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

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Запускаю
 curlftpfs $USER:$PASSWD@$SERVER $DEST_DIR  
на телике
получаю
 curlftpfs: error while loading shared libraries: libglib-2.0.so.0: cannot open shared object file: No such file or directory  
как получить нужный файл  
libglib-2.0.so.0
?
 
Добавлено:
всякие переменные к библиотекам вроде прописаны

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:30 05-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
Это вопрос, в общем-то к вашим коллегам по несчастью иметь оный телевизор, а не сюда. В любом случае в вопросе слишком многое оставлено за кадром, чтобы на него можно было ответить.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:17 05-11-2013
king_stiven

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

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 19:32 05-11-2013 | Исправлено: king_stiven, 20:17 05-11-2013
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
comrades, прошу помощи: уточняю подсветку .sh-файлов для AkelPad и возник ряд вопросов, на которые не удалось нагуглить внятные ответы.
 
1. В секции "Words:" список слов для подсветки, так понимаю, там внутренние команды bash, не требующие сторонних утилит и условные операторы/операторы циклов, хотел уточнить список, нашел внутренние команды на вики http://ru.wikipedia.org/wiki/Bash , добавил в ;--Builtin commands-- set, pwd и printf, есть что-то еще, на что стоит обратить внимание? В кандидаты попали read, touch.
 
2. Flags=1 в секции "Words:" указывает, что слово должно подсвечиваться только в написанном регистре (здесь - в нижнем), в связи с чем возник вопрос: возможно ли столкнуться со скриптом, в котором команды в верхнем регистре? Или это грубое нарушение сложившихся традиций? Таких скриптов не нашел, но в голове засел вопрос и хочется ясности
 
3. И по комментариям: символ # может быть параметром команды echo?
Дело в том, что сейчас строка с комментарием на той же строке выглядит так:

Код:
echo условие выполняется #комментарий

хотя по идее должно быть так:

Код:
echo условие выполняется #комментарий

если # не может быть параметром echo, то просто назначу его как конец диапазона без захвата.
 
Заранее спасибо за помощь.

Всего записей: 6495 | Зарегистр. 28-01-2008 | Отправлено: 18:43 21-11-2013 | Исправлено: Skif_off, 18:44 21-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пришло местной личной почтой от т-ща Skif_off:

Цитата:
Приветствую, обращаюсь как к опытному человеку, ибо не могу нагуглить внятные ответы
Уточняю подсветку .sh-файлов для AkelPad, не найдется ли свободного времени взглянуть на список слов в секции "Words:"?
Так понимаю, там внутренние команды bash, не требующие сторонних утилит и условные операторы/операторы циклов, хотел уточнить список, нашел внутренние команды на вики http://ru.wikipedia.org/wiki/Bash , есть что-то еще?
 
И вопрос, который не иначе как вызывает недоумение у поисковых машин, как бы я его не формулирова
Flags=1 в секции "Words:" указывает, что слово должно подсвечиваться только в написанном регистре (здесь - в нижнем), в связи с чем возник вопрос: возможно ли столкнуться со скриптом, в котором команды в верхнем регистре? Или это грубое нарушение сложившихся традиций?
Таких скриптов не нашел, но в голове засел вопрос

 
> там внутренние команды bash, не требующие сторонних утилит и условные операторы/операторы циклов
Там написано, что есть что. Есть и внешние команды («Basic commands»), при этом выборка очень странная, например rmdir есть, а rm нет.
 
Мне разграничение встроенных команд от всех остальных разумным не кажется. От того, что они встроены, они никаких особых свойств не приобретают. Да и потом я не нашел в файле указания, что это синтаксис для Баша. А в разных шеллах встроены разные команды — в busybox’е, например, — вплоть до awk’а, а в dash’е — весьма немного.
 
> хотел уточнить список, нашел внутренние команды на вики
Не смотрел, что вы там нашли на Википедии, но сначала, очевидно, надо обращаться к прилагающийся документации. В данном случае — к ману bash(1) или сразу bash-builtins(1).
 
> возможно ли столкнуться со скриптом, в котором команды в верхнем регистре? Или это грубое нарушение сложившихся традиций?
Достаточно взять и проверить, чтобы убедиться, что не нарушение традиций, а нарушение синтаксиса.
$ CD ~
CD: command not found

 
Добавлено:
О! Вы уже сами сюда написали.
 
> И по комментариям: символ # может быть параметром команды echo?  
Опять же. Вы гуглите и спрашиваете, вместо того, чтобы взять и проверить. В чем дело?
 
$ echo foo # bar
foo

— хорошо же видно, что неэкранированный хэш обработался как начало комментария.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:53 21-11-2013 | Исправлено: ASE_DAG, 19:00 21-11-2013
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
> при этом выборка очень странная, например rmdir есть, а rm нет.  
Поэтому и решил взяться за уточнение.
 
> Мне разграничение встроенных команд от всех остальных разумным не кажется.
Но и собрать команды из всех скриптов с какого-нибудь сервера с апачем/натом/прокси/почтой/бэкапами и проч. или из готовых решений в шапке тоже будет решением из разряда "не очень" - неизвестно, как скажется огромный список на скорости работы редактора, равно как и попытка сократить за счет регулярных выражений (типа rmdir и rm до "rm[a-z]*" или grep/egrep/fgrep/rgrep/pgrep).
Ну и хотя я и не религиозен (за исключением нелюбви к Unity, KDE, тем Xfce в PC-BSD и дистрибутива openSUSE), но не особо дружен с консолью любой ОС (без манов), поэтому просто не представляю, что из утилит есть в любом дистрибутиве безусловно и что часто используется.
 
> Да и потом я не нашел в файле указания, что это синтаксис для Баша.
Отталкивался от расширения: .sh - Bash Shell Script
 
> А в разных шеллах встроены разные команды — в busybox’е, например, — вплоть до awk’а, а в dash’е — весьма немного.
Меня это тоже смущает, но как дилетанта. Так понимаю, команды во многом пересекаются, в т.ч. условия и циклы?
 
> Достаточно взять и проверить, чтобы убедиться, что не нарушение традиций, а нарушение синтаксиса.
"Взять и проверить" может закончиться чем угодно, сформировалась привычка при отсутствии знаний искать->спросить->попробовать
 
> хорошо же видно, что неэкранированный хэш обработался как начало комментария.
"неэкранированный" - ключевое слово. Проверять экранирование с \, как в регулярных выражениях, и всеми вариантами кавычек и скобок? Про экранирование можно много нагуглить, но не про хэш. Или спросить? Ну не пишу я скриптов практически (не считая нескольких скриптов AutoIt и простенких батников)
Один-единственный resolution.sh трудится в виртуалке

Код:
xrandr --newmode "1152x864_60.00"   81.75  1152 1216 1336 1520  864 867 871 897 -hsync +vsync
xrandr --addmode VBOX0 1152x864_60.00
xrandr --output VBOX0 --mode 1152x864_60.00

но это же несерьезно И с ошибкой к тому же:

Цитата:
Любой shell-скрипт всегда начинается со строчки #!/bin/bash (или #!/bin/sh)

или поставило в тупик - не понял, что выбрать, покопался в /bin - используются приблизительно наравне, попробовал без - срабатывает, так и оставил.
 
В целом, наша небольшая дискуссия структурировала мысли в голове, спасибо, маны нашел (на русском и на www.gnu.org на всякий случай), завтра займусь.

Всего записей: 6495 | Зарегистр. 28-01-2008 | Отправлено: 21:05 21-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> Но и собрать команды из всех скриптов ... тоже будет решением из разряда "не очень"
Вот вы и пришли к единственно верному решению — не подсвечивать команды вовсе или подсвечивать все единообразно.
 
> Отталкивался от расширения: .sh - Bash Shell Script
Не, ну где логика? Что в этих двух буквах .sh (очевидно, от слова shell) указывает на то, что это скрипт для Баша, а не для какого-нибудь иного шелла (который, кстати, весьма вероятно называется именно /bin/sh). Правильно, ничто.
 
> "Взять и проверить" может закончиться чем угодно
Но в данных случаях заканчивается прояснением вопроса.
 
> "неэкранированный" - ключевое слово. Проверять экранирование с \, как в регулярных выражениях, и всеми вариантами кавычек и скобок?  
Конечно. А вы чего хотели? Сам Баш же это как-то различает. И в хороших редакторах (Вим, Емакс) подсветка синтаксиса это различает.
 
Я, кстати, вообще не понимаю, что вы делаете. Зачем изобретаете велосипед, вместо того, чтобы портировать на этот ваш Акелпад существующие хорошие правила подсветки синтаксиса (вимовские или иные).
 
> Цитата: «Любой shell-скрипт всегда начинается со строчки #!/bin/bash (или #!/bin/sh)»
Я не помню, чтоб я вам такое писал. Где вы это прочитали?
 
> не понял, что выбрать
Что значит «что»? Смотря, что вам надо. В вашей системе это, скорее всего, разные интерпретаторы.
 
> маны нашел (на русском и на www.gnu.org на всякий случай
А куда вы дели маны, которые установлены на вашей системе? Если вам не нравится less, как просмотрщик (да, именно less по-умолчанию открывается по $ man bash), то можете смотреть и в браузере:
$ BROWSER=iceweasel man --html bash
BROWSER — это переменная, можете, разумеется, установить ее глобально.

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

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

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Не смущает употребление мною слов "не знаю", "не писал", "дилетант"? Процитирую себя же:

Цитата:
не особо дружен с консолью любой ОС

И с шеллами не было нужды разбираться, не надо судить строго, пожалуйста
 
>Вот вы и пришли к единственно верному решению — не подсвечивать команды вовсе или подсвечивать все единообразно.
Нет, не пришел: как минимум комментарии, условные операторы/циклы, переменные будут подсвечены все равно, что облегчит восприятие текста.
 
>Я не помню, чтоб я вам такое писал. Где вы это прочитали?  
Скопировал с первой попавшейся в гугле статьи по скриптам.
 
>> не понял, что выбрать
>Что значит «что»? Смотря, что вам надо. В вашей системе это, скорее всего, разные интерпретаторы.
А я не понимаю разницу (но знаю, что она есть) и вижу, что в /bin есть скрипты и с #!/bin/bash, и с #!/bin/sh. К слову, дописал #!/bin/sh, т.к. ничего кроме последовательного запуска команд там нет.
 
>Я, кстати, вообще не понимаю, что вы делаете. Зачем изобретаете велосипед, вместо того, чтобы портировать на этот ваш Акелпад существующие хорошие правила подсветки синтаксиса (вимовские или иные).
Так понимаю, в Vim для подсветки используются регулярные выражения, coder-файлы AkelPad не используют их так широко (хотя и есть возможность). Это раз. Во-вторых, мои знания регулярных выражений скромны, делал несколько вялых (неудачных, т.к. изучение просто так не эффективно) попыток освоить и только в этом месяце разродился двумя маленькими работающими выражениями
 
> А куда вы дели маны, которые установлены на вашей системе?
Сейчас в Win и не знаю сколько это продлится.
 
С хэшем придется повозиться, в крайнем случае - оставить как есть. Такой вопрос: допустимо ли писать так

Код:
echo "Далее следует комментарий."# Это комментарий

или перед хэшем обязательно должен быть пробел/табуляция? Появилась мысль, что это только вопрос красоты/удобочитаемости, но подтверждения не нашел.
 
З.Ы. Поэтому и хотел обсудить приватно - несколько выходим за рамки темы (и я уже заслужил предупреждение от модератора ), а отдельную тему создавать смысла нет - с десяток сообщений и она загнется.

Всего записей: 6495 | Зарегистр. 28-01-2008 | Отправлено: 01:40 22-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off
> Не смущает употребление мною слов "не знаю", "не писал", "дилетант"?
Смущает. Совершенно не понимаю, на кой вам писать правила подсветки синтаксиса для языка, которым вы не владеете.
 
>> Вот вы и пришли к единственно верному решению — не подсвечивать команды вовсе или подсвечивать все единообразно.  
> Нет, не пришел: как минимум комментарии, условные операторы/циклы, переменные будут подсвечены все равно...
Кто-то из нас невнимательно читал, что ему написали. Мне кажется, что вы. Вот это: «не подсвечивать команды вовсе». Хотя Вим таки зачем-то подсвечивает встроенные команды и несколько внешних.
 
> А я не понимаю разницу и вижу, что в /bin есть скрипты и с #!/bin/bash, и с #!/bin/sh
/bin/sh — это некогда вполне материальный Борн-шелл, но сейчас, как правило, симлинк (реже — хардлинк) на dash, bash, busybox. Если вы не понимаете разницы, то в вашей системе это симлинк на bash, но это не везде так.
 
> Сейчас в Win и не знаю сколько это продлится.
И что с того? В Цигвине маны тоже есть. Хотя, конечно, с Гуглем часто проще.
 
> перед хэшем обязательно должен быть пробел/табуляция? Появилась мысль, что это только вопрос красоты/удобочитаемости, но подтверждения не нашел.  
:wall: Какое вам еще нужно подтверждение, кроме реакции самого Баша?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:17 22-11-2013 | Исправлено: ASE_DAG, 14:19 22-11-2013
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
>Совершенно не понимаю, на кой вам писать правила подсветки синтаксиса для языка, которым вы не владеете.
Потому что у меня есть быстрый редактор с приличным функционалом (более быстрого со сравнимым функционалом и полной поддержкой юникода я еще не видел) и файлом подсветки, который надо поправить Попросить кого-нибудь взяться довести до ума?
 
>Кто-то из нас невнимательно читал, что ему написали. Мне кажется, что вы. Вот это: «не подсвечивать команды вовсе».
Не уловил акцент, прошу прощения.
 
>/bin/sh — это некогда вполне материальный Борн-шелл, но сейчас, как правило, симлинк (реже — хардлинк) на dash, bash, busybox. Если вы не понимаете разницы, то в вашей системе это симлинк на bash, но это не везде так.
Так понял, симлинк на bash (Xubuntu), просто успел прочитать про ошибку, когда по привычке на системе без симлинка пытаются запустить скрипт с #!/bin/sh и специфическими для bash конструкциями. Тот скрипт примитивен.
 
>:wall: Какое вам еще нужно подтверждение, кроме реакции самого Баша?
Ну вот, опять Т.е., нужно написать скрипт (или найти), который ничего не натворит, но при этом должно быть не менее 5 строк, начинающихся с команды echo. Или спросить и получить Да, Нет или Попробуй так (если у кого-нибудь найдется свободное лишнее время на нуба)?
Ну или воспользоваться третьим вариантом: посмотреть, как подсвечивается комментарий в других редакторах (ковыряюсь в m4.lang gedit'а).

Всего записей: 6495 | Зарегистр. 28-01-2008 | Отправлено: 15:43 22-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off
> симлинк на bash (Xubuntu)
Нет. В Убунте — на dash.
 
> нужно написать скрипт (или найти), который ничего не натворит, но при этом должно быть не менее 5 строк...
ЛОЛШТО?
$ echo foo#bar
 
>> «не подсвечивать команды вовсе».
> Не уловил акцент, прошу прощения.  
Не надо подсвечивать имена команд. Вообще. Ну кроме [.
 
> воспользоваться третьим вариантом: посмотреть, как подсвечивается комментарий в других редакторах
О! Доперли.
Цитата:
Я, кстати, вообще не понимаю, что вы делаете. Зачем изобретаете велосипед, вместо того, чтобы портировать на этот ваш Акелпад существующие хорошие правила подсветки синтаксиса (вимовские или иные).


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:53 22-11-2013
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
>ЛОЛШТО?
Документацию читаю, беру слова про 5 взад, достаточно было одной echo.
 
>$ echo foo#bar
Мне это строка ничего не говорит Сделал как в gedit:
echo foo #bar - комментарий подсвечивается
echo foo#bar - комментарий не подсвечивается
 
>О! Доперли.
В gedit есть списки команд built-in-command и common-command, переменные и комментарии - регулярными выражениями, но я не могу просто взять и портировать, хотя бы потому, что не смотря на наличие rm в секции common-command, там нет iptables, которая уже появилась в моем списке. Не считая того, что регулярные выражения нужно допиливать.
 
В общем, можно сказать, остался почти с чем был - маны, другие редакторы и дружба с регулярными выражениями. За сим - спасибо за помощь и откланиваюсь, публичная порка дает мало конструктива, я и так в курсе своих недостатков и пробелов в знаниях/умениях

Всего записей: 6495 | Зарегистр. 28-01-2008 | Отправлено: 18:52 22-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
>> $ echo foo#bar
> Мне это строка ничего не говорит :-)

Цитата:
Q: Я задал вопрос и получил в ответ что-то такое:
# aptitude purge flashplugin-nonfree
$ wget http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p3_64bit_linux_111710.tar.gz
$ tar xzvf flashplayer10_2_p3_64bit_linux_111710.tar.gz
# mv libflashplayer.so /usr/lib/firefox-addons/plugins/

Что это, и что мне с этим делать?
 
A: Это команды, их надо выполнить в вашем любимом эмуляторе терминала и вдумчиво прочитать то, что машина вам ответила.
Эмулятор терминала в Гноме по-умолчанию можно найти в меню Приложения › Стандартные › Терминал; в КДЕ по-умолчанию — меню типа „Пуск” › Приложения › Система › Терминал.
 
Обратите внимание на знак доллара ($) или решетки (#) в начале строки. Это не часть команды (их водить не надо), это — приглашение командной оболочки.  
Знак доллара или процента означает, что команда отдается от имени простого, непривилегированного, пользователя. Просто скопируйте команду, чтобы увидеть что-то вроде:  
vasya@computer:~$ cat /etc/fstab
и нажмите Enter на клавиатуре.
Новичок в GNU/Linux
 
Добавлено:
> несмотря на наличие rm в секции common-command, там нет iptables, которая уже появилась в моем списке
А каковы все-таки критерии составления этого вашего списка? Это список чего?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:58 22-11-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос
Цитата:
Помогите пожалуйста написать скрипт на Shell для анализа трафика, который подсчитывает количество символов входящих-выходящих, а также количество конкретных букв

belsan91
Эм, вы собрались в каждом проходящём пакете выделять ASCII символы и считать нужные из них? WTF?

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:27 24-11-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Забавно. В Баше нельзя использовать альясы в том же цикле, где они об’явлены.
 

Код:
#!/bin/bash
shopt -s expand_aliases
alias myalias='echo Foo'
for i in 1; do
    alias myalias='echo Bar'
    alias myalias
    myalias
done
alias myalias
myalias

 
Вывод:
alias myalias='echo Bar'
Foo
alias myalias='echo Bar'
Bar

 
Само по себе, это, вроде бы, не баг. И даже описано в ABSG. Но вот разночтение между выводом alias myalias и тем, что будет на самом деле выполнено по myalias, выносит мозг при поиске ошибки.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:00 02-12-2013
yrkrus



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго всем дня помогите советом, есть скриптик:

Код:
 
#!/bin/sh
 
mount_smbfs -N //PETROV@BACKUP/backup0 /mnt
source_dir=/links/backup_zabbix
date=`date '+%d.%m.%Y'`
backup=backup_monitoring_$date.tar.gz
base_name=zabbix.sql
mount_backup=/mnt/mysql_freebsd/vlg-monitoring
base=zabbix
#
#
#
mysqldump -u zabbix -pzabbix $base > $source_dir/$base_name
cd $source_dir
tar czf $backup $source_dir
cp $backup $mount_backup/$backup
#cp $base_name $mount_backup/$base_name
rm -fv $backup
rm -fv $base_name
 

 
Все отлично отрабатывает если вручную запускать, если ставить в cron:
58 22 * * * /etc/backup_zabbix.sh  (58 22 как для примера)
 
то не отрабатывает, т..е дамп не создается... в логах все прекрасно скрипт запускается под root, права так же даны root
 
помогите кто чем может...
 
 
Добавлено:
Всем спасибо, отвечу сам =)
в скрипте, запускаемом из-под крон команды должны идти с полным путем
к mysqldump добавляем путь до него: в моем случае это /usr/local/bin/mysqldump

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 23:00 19-12-2013 | Исправлено: yrkrus, 23:15 19-12-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще из серии «Этот забавный Баш».
 
$ declare -A A
$ A["["]=1
$ echo $((A["["]))
1
$ ((A["["] > 0)) && echo Y
bash: ((: A[[] > 0: bad array subscript (error token is "A[[] > 0")

 
Какая, интересно, внутренняя логика к такому приводит.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:01 22-12-2013
FoxBlack09

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Вопрос уважаемым специалистам. Наверняка Вам уже попадались два скрипта, реализующие голосовые функции 3G модема Huawei. С одним я уже разобрался и смог применить его на другой модели модема: для Huawei E160 в audacity используем параметры 8 bit, signed pcm, 8000 hz при создании голосового сообщения.
А вот со вторым пока ничего не получилось. Звонки идут, но "трубка" не поднимается. Хотелось бы довести этот скрипт до рабочего состояния.  
Я пробовал с автором скрипта связаться, пока безуспешно.
Если кто-то может помочь в решении проблемы с этим скриптом, могу предоставить виртуальную машину с модемом.

Всего записей: 510 | Зарегистр. 01-04-2009 | Отправлено: 12:53 13-01-2014 | Исправлено: FoxBlack09, 15:24 13-01-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FoxBlack09, нет, увы, лично мне нет попадались. И полагаю, что вы вовсе не по адресу — здесь определяющим условием является не познания в шелл-скриптинге (тем более, что скрипты, о коих речь, на Перле), а наличие этого самого модема.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:32 13-01-2014
FoxBlack09

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
модем есть, виртуальный ubuntu 13.x linux тоже есть
В скрипте всё отлично до строчки
   # принимаем входящий вызов
    my $l_rec = at_send("ATA",qr/^(OK|ERROR)/);
    return 0 if $l_rec eq "ERROR";
и если эти строчки поднять выше всех остальных команд в функции accept_call, то вызов будет принят, "трубка поднята".
Ну раз я не по адресу, извините. Подумаю над созданием отдельной темы как нибудь.

Всего записей: 510 | Зарегистр. 01-04-2009 | Отправлено: 15:37 13-01-2014 | Исправлено: FoxBlack09, 16:59 13-01-2014
bredis

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Гуру помогите. Никак не получается заставить скрипт работать до конца.

Код:
#!/bin/sh
 
MOUNTPNT="/media/DISK_A1"
MOUNT="$MOUNTPNT/system"
 
export PATH=$MOUNT/bin:$MOUNT/sbin:$MOUNT/usr/bin:$MOUNT/usr/sbin:/sbin:/usr/sbin:/bin:/usr/bin
export LD_LIBRARY_PATH=$MOUNT/lib:$MOUNT/usr/lib:/lib:/usr/lib
 
 
IFACE="ppp0"
 TTL=3600
 SERVERRU=ns1.host.ru
 SERVERNET=ns1.host.net
 HOSTNAMERU=host.host.ru
 HOSTNAMENET=host.host.net
 ZONERU=host.ru
 ZONENET=host.net
 KEYFILERU=/media/DISK_A1/system/etc/namedb/keys/key.ru.private
 KEYFILENET=/media/DISK_A1/system/etc/namedb/keys/key.net.private
 
 new_ip_address=`ifconfig $IFACE | grep "inet addr:" | awk '{print $2}' | awk -F ":" '{print $2}'`
 new_ip_address=${new_ip_address}
 
 
 nsupdate -v -k $KEYFILERU << EOF
 server $SERVERRU
 zone $ZONERU
 update delete $HOSTNAMERU A
 update add $HOSTNAMERU $TTL A $new_ip_address
 show
 send
 quit
  EOF
 
 nsupdate -v -k $KEYFILENET << EOF
  server $SERVERNET
  zone $ZONENET
  update delete $HOSTNAMENET A
  update add $HOSTNAMENET $TTL A $new_ip_address
  show
  send
  quit
  EOF

 
Так вот nsupdate зоны .ru отрабатывает, а зоны .net не отрабатывает.
Подскажите, что добавить в код, что б оба nsupdate отработали?

Всего записей: 9 | Зарегистр. 22-12-2012 | Отправлено: 16:43 12-02-2014 | Исправлено: bredis, 17:35 12-02-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
убрать пробелы перед первым EOF
 
Добавлено:
btw, точка у вас играет какую либо роль?

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 17:28 12-02-2014
bredis

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto, не понял где убрать пробел?  

Код:
nsupdate -v -k $KEYFILERU << EOF  
  server $SERVERRU  
  zone $ZONERU  
  update delete $HOSTNAMERU A  
  update add $HOSTNAMERU $TTL A $new_ip_address  
  show  
  send  
  quit  
   EOF

 
Это он отрабатывает и останавливается.
 
Точку я уже убрал. не обращаем внимания, да она и не мешала.

Всего записей: 9 | Зарегистр. 22-12-2012 | Отправлено: 17:30 12-02-2014 | Исправлено: bredis, 17:31 12-02-2014
arto

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

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 17:34 12-02-2014
bredis

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto, огромное спасибо. Все заработало.

Код:
nsupdate -v -k $KEYFILERU<<EOF
server $SERVERRU
zone $ZONERU
update delete $HOSTNAMERU A
update add $HOSTNAMERU $TTL A $new_ip_address
show
send
quit
EOF
 
nsupdate -v -k $KEYFILENET<<EOF
server $SERVERNET
zone $ZONENET
update delete $HOSTNAMENET A
update add $HOSTNAMENET $TTL A $new_ip_address
show
send
quit
EOF
 

Всего записей: 9 | Зарегистр. 22-12-2012 | Отправлено: 17:40 12-02-2014 | Исправлено: bredis, 17:42 12-02-2014
triangel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос по SED/Regexp
 
Доброго времени суток, дорогие форумчане!
 
Не получается решить следующую небольшую проблемку. Есть текстовый файл с табличкой ip разделенных табуляторами (по 4-е ip в строчке). Мне нужно последовательно вырезать все айпишники из файла. Собственно у меня не получается вырезать кусок текста между табуляторами.
 
С надежной на советы и помощь, triangel.

Всего записей: 25 | Зарегистр. 06-12-2006 | Отправлено: 16:59 26-02-2014
arto

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

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 17:15 26-02-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
triangel, сrossposting detected. Если вам дают бесполезные ответы, это наиболее вероятно говорит о непонятности вопроса. Тов. arto верно вам указал, что сделать.
 

Внес в шапку ссылку на http://mywiki.wooledge.org — наверное самый самодостаточную на сегодняшний день коллекцию материалов, которая до этого присутствовала там только частично в лице Bash Pitfalls.
 

#: шапка версии ASE_DAG, 23:40 14-09-2013

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:27 27-02-2014 | Исправлено: ASE_DAG, 22:10 27-02-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть 2 csv файла, один оригинальный, второй отчетный. Для удобство последующего анализа свожу эти 2 файла в один через paste -d ";" file1.csv file2.csv. Все хорошо, но если во 2 файла будет пропуск строк(и) то весь смысл сведения теряется. Во 2 столбце каждого файла есть уникальный ID номер, как можно свести 2 csv используя эти номера. Вот примеры для понимания:
 
Так делается когда все строки совпадают:

Код:
1 123 имя 1 123 имя
2 234 имя 2 234 имя
3 456 имя 3 456 имя
4 567 имя 4 567 имя  

 
А вот так, когда строк не хватает:

Код:
 
1 123 имя 1 123 имя
2 234 имя 3 456 имя
3 456 имя  4 567 имя
4 567 имя  

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 13:07 10-03-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
$ sdiff file{1,2}.csv
1 123 имя                                                       1 123 имя
2 234 имя                                                       2 234 имя
3 456 имя                                                     <
4 567 имя                                                       4 567 имя


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:01 10-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Увы, хотя решение интересное.  Пример писал абстрактный, в реальности есть различие по первым ячейкам, в первом файле вместо цифр время HH:MM, а во втором HH:MM:SS и оно может отличаться по минутам и иногда по часам, поэтому sdiff не срабатывает.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:24 10-03-2014
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:26 10-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Файл 1
01:00 123 текст
03:10 234 текст
03:42 456 текст
10:11 567 текст
 
Файл 2 (отчет)
01:05:01 123 текст  
03:30:05 234 текст
03:40:10 456 текст
11:25:11 567 текст

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:38 10-03-2014 | Исправлено: digital422, 15:07 10-03-2014
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:53 10-03-2014
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 15:09 10-03-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Свести файлы вдумчиво не проблема, например, на 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:55 10-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На выходе после сведения csv файлов должны быть пустые строки в местах несовпадения, сводить строки надо по цифровым значениям во 2 колонке, они не меняются.
 
Исходники:
  Файл 1  
01:00 123 текст  
03:10 234 текст  
03:42 456 текст  
10:11 567 текст  
11:11 678 текст  
   
  Файл 2 (отчет)  
01:05:01 123 текст    
03:30:05 234 текст  
11:25:11 567 текст
11:59:22 001 текст
12:22:22 678 текст
 
Должно получиться: (в 3 строке совпадений нет, поэтому идет смещение вниз, где номера 2 колонки совпадают)
 
01:00 123 текст 01:05:01 123 текст    
03:10 234 текст 03:30:05 234 текст  
03:42 456 текст  
10:11 567 текст 11:25:11 567 текст
                         11:59:22 001 текст
11:11 678 текст 12:22:22 678 текст

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 06:46 11-03-2014 | Исправлено: digital422, 07:32 11-03-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# perl -le '@a=do{open F,shift and <F>};chomp@a;@b=do{open F,shift and <F>};chomp@b;($a,$b)=(shift(@a),shift(@b));while(1){($a||$b)||last;my($aa,$bb)=((split" ",$a)[1],(split" ",$b)[1]);if($aa==$bb){print"$a $b";($a,$b)=(shift(@a),shift(@b))}elsif($aa<$bb){print"$a";$a=shift@a}else{print"\t$b";$b=shift@b}}' A.txt B.txt  
01:00 123 текст   01:05:01 123 текст    
03:10 234 текст   03:30:05 234 текст  
03:42 456 текст  
10:11 567 текст   11:25:11 567 текст
        11:59:22 001 текст
11:11 678 текст   12:22:22 678 текст  
#

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 10:11 11-03-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
ох уж этот perl...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 07:37 12-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не дружу с prel, arto-спасибо конечно. Не работает скрипт, уходит в цикл, как поменять разделитель с пробела на ;, зачем табуляция в  print"\t$b" ?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:41 14-03-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а где не работает? у меня на ваших данных работает.
 
с какого пробела надо поменять на ';' ?
 
для выделения отсутствия строки в первом файле.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 14:52 14-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Разделитель - ; и после сведения строк разделитель тоже ;
01:00;123;текст;01:05:01;123;текст.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 15:38 14-03-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
perl -le '@a=do{open F,shift and <F>};chomp@a;@b=do{open F,shift and <F>};chomp@b;($a,$b)=(shift(@a),shift(@b));while(1){($a||$b)||last;my($aa,$bb)=((split";",$a)[1],(split";",$b)[1]);if($aa==$bb){print"$a;$b";($a,$b)=(shift(@a),shift(@b))}elsif($aa<$bb){print"$a;";$a=shift@a}else{print";$b";$b=shift@b}}'

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 15:57 14-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если первая строка в первом или 2 файле отличается скрипт уходит в цикл, отображается ;.
a.txt
00:59;123;текст
01:00;123;текст
 
b.txt
01:05:01;123;текст

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 22:07 14-03-2014
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте.
Подскажите, пожалуйста, почему команда:
sed 's!11/Feb/2014!12/Mar/2014!g' access/file > new/file
Создает в директории new файл с названием file, но с точно таким же содержимым что исходный.
Мне надо было заменить строку: 11/Feb/2014  
строкой: 12/Mar/2014
Подскажите, пожалуйста, почему этого не происходит?

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 23:02 14-03-2014
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cat file | sed 's!11/Feb/2014!12/Mar/2014!g' > new

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 11:45 15-03-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ForposT_ForeveR
> sed 's!11/Feb/2014!12/Mar/2014!g' access/file > new/file
УМВР.  
 
$ sed --version
sed (GNU sed) 4.2.2
<...>

 
digital422
Кроме UUCA отличий от исходного не вижу.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:29 15-03-2014
Alukardd



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

Код:
#!/usr/bin/gawk -f
 
BEGIN {
    FILE1="/tmp/file1"
    while (getline < FILE1)
        file1_raw[$2]=$0
 
    FILE2="/tmp/file2"
    while (getline < FILE2)
        file2_raw[$2]=$0
 
    for (i in file1_raw)
    {
        printf "%-20s %s\n", file1_raw[i], i in file2_raw ? file2_raw[i] : ""
        delete file2_raw[i]
    }
    for (i in file2_raw)
        printf "%-20s %s\n", "", file2_raw[i]
}
Тут всё просто, читаются 2 файла из каждого из них строится ассоциативный массив с втором столбцом в качестве индекса. Дальше выводятся все элементы файла1 и соответствующие им элементы файла2. После чего выводится остатки файла2.
Я хз в каком порядке вы хотите их видеть, посему оставлю это Вам.
Так же, для красоты дал ширину первому столбцу в 20 символов.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:28 16-03-2014
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
 
Действительно, всё работает. Спасибо.
Это я ошибся.
Мне надо заменить массив search на массив replace в одном файле. Подскажите, пожалуйста, как это можно сделать в sed'e.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 12:18 17-03-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, ForposT_ForeveR
Можно, пожалуйста, пример? Исходного файла и результата.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 13:02 17-03-2014
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alex_Piggy
 
Мне нужно заменить в одном файле одни даты на другие.
Например:
"11/Feb/2014" -> "12/Mar/2014"
"09/Feb/2014" -> "15/Mar/2014"
Вот в таком ключе.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 13:13 17-03-2014
Alex_Piggy

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

Код:
 
#!/usr/bin/sed -f
s@11/Feb/2014@12/Mar/2014@g
s@09/Feb/2014@15/Mar/2014@g
 

Или, если у Вас файл-массив уже подготовлен (и имеет указанный формат)
sed -e "s/\x22\([^\x22]*\)\x22[^\x22]*\x22\([^\x22]*\)\x22/s@\1@\2@g/g" ARRAYFILE | sed -f - INPUTFILE > OUTPUTFILE
Первый sed переводит файл массив в скрипт sed и передает как скрипт второму.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 14:28 17-03-2014
digital422

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

Код:
00:10;40001;оригинал
01:00;234;оригинал   01:00:11;234;отчет
01:10;456;оригинал   01:01:11;456;отчет
00:59;12345;оригинал 00:59:21;12345;отчет
00:59;12345;оригинал 00:59:21;12345;отчет
                     01:00:11;234;отчет
                     01:01:11;456;отчет
 

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

Код:
00:59;12345;оригинал;00:59:21;12345;отчет
00:59;12345;оригинал;00:59:21;12345;отчет
00:10;40001;оригинал;
01:00;234;оригинал;01:00:11;234;отчет
01:10;456;оригинал;01:01:11;456;отчет
;;01:00:11;234;отчет
;;01:01:11;456;отчет
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:51 23-03-2014 | Исправлено: digital422, 18:52 23-03-2014
k3NGuru



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Товарищи, подскажите, как сделать такую няшку
 
proxy# cd /tmp/
proxy#
 
Вместо
 
root@exa:/usr/home/zabbix # cd /tmp/
root@exa:/tmp #  
 

Всего записей: 166 | Зарегистр. 07-02-2008 | Отправлено: 12:23 24-03-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Позвольте, файл внутри себя перемешиваться не должен был!
Да есть косяк с тем , что сначала полностью проходит скрипт по file1, а только потом добивает остатки по file2, не обращая внимания на метки времени.
Я собственно и отдал Вам скрипт, что бы Вы подправили его по себя.
 
k3NGuru
Всё просто, если это bash, то открываем файл ~/.bashrc и изменяем переменную PS1 так как Вам угодно, например так:
PS1='\u\$ '

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:08 24-03-2014
yrkrus



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго всем дня, подскажите, а умеет ли sed добавлять пробелы к искомой строке?
например есть строка вида:   Ввод мастер-пароля20140327T11:05:10 необходимо разделить Ввод мастер-пароля и 20140327 и T11:05:10

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 12:02 28-03-2014 | Исправлено: yrkrus, 12:03 28-03-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, yrkrus
Вариант 1
sed -r -e "s/([^0-9\x20\t:])([0-9])/\1 \2/gi;s/([0-9])([^0-9\x20\t:])/\1 \2/gi"
Вариант 2
sed -r -e "s/^([^0-9]*)([0-9]*)(.*)$/\1 \2 \3/g"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 14:54 28-03-2014
xqqq

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dig ru-board.com @ru-board.com axfr
 
ответ
 
но!
 
dig ria.ru @ria.ru axfr
 
; <<>> DiG 9.8.1-P1 <<>> ria.ru @ria.ru axfr
;; global options: +cmd
;; connection timed out; no servers could be reached

 
С какими дополнительными ключами запустить, чтобы правильно эксплуатировать багу? На ria.ru она присутствует.

Всего записей: 30 | Зарегистр. 30-05-2012 | Отправлено: 13:07 07-04-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xqqq
 
> dig ria.ru @ria.ru axfr
> @ria.ru
 
В зоне ria.ru нет нэймсерверов, сравните:
$ dig ru-board.com ns +short
ns1.ru-board.com.
ns2.ru-board.com.

$ dig ria.ru ns +short
ns3.rian.ru.
ns8-cloud.nic.ru.
ns2.rian.ru.
ns8-l2.nic.ru.
ns4-cloud.nic.ru.
ns4-l2.nic.ru.

 
Запрашивать NS из nic.ru бесполезно, они информацию стерегут:
$ dig ria.ru @ns8-cloud.nic.ru axfr +short
; Transfer failed.

 
А вот из rian.ru можно:
$ dig ria.ru @ns3.rian.ru axfr
тыц

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:15 08-04-2014 | Исправлено: ASE_DAG, 01:15 08-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
м-м-м axfr голой ж*пой наружу. Занимательно...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:33 08-04-2014
Maximus777

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

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 15:32 09-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Во-первых в строке Hostname я  вижу только каую-то хню (я что-то не так смотрю?), а не нужные сайты
Во-вторых на этом сайте порт на котором слушает прокся не содержится в теле страницы, а генерится javascript'ом, что серьёзно усложняет дело.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:01 09-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А Hostname и не нужен. Нужны данные только с первого столбца.
С портами да, засада. Ни wget, ни httrack не дали мне полной инфы.
Тогда можно реализовать полуавтоматический вариант. Т.е. открываем сайт браузером, копируем данные таблицы, сохраняем в файл. И этот файл уже обрабатываем. Получается, что надо отловить данные в каждой строке, между первым и вторым пробелом.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 10:11 10-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Я вчера скачивал и парсил страницу через ruby nokogiri, но так же с ним упёрся в JS.
 
Для браузера есть плагины, которые сохраняют таблицу в csv формате. Когда найдёте удобный Вам, покажите выходной формат, и дальше на том же 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 11:09 10-04-2014
yrkrus



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alex_Piggy
благодарю за ответ, но вот еще одна проблемка:
так же через sed сделать подстановку слова в конец строки, имея регулярное выражение
 
например тело:
 4:55:49 НЕКОРРЕКТНОЕ - время события 05:01:26
в нужно что бы было так
4:55:49 НЕКОРРЕКТНОЕ - время события 05:01:26 ТУТ ПОДСТАВЛЕННОЕ СЛОВО
 
т.е. ищем регулярное выражение НЕКОРРЕКТНОЕ, в случае если его находим, подставляем в конец данной найденой строки "ТУТ ПОДСТАВЛЕННОЕ СЛОВО".
 

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 14:58 10-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yrkrus
Код:
sed '/НЕКОТОРОЕ/ s/$/ ТУТ ПОДСТАВНОЕ СЛОВО/' /tmp/file1
или так
Код:
sed 's/НЕКОТОРОЕ/& ТУТ ПОДСТАВНОЕ СЛОВО/' /tmp/file1
хз как по фэншую лучше...

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:30 10-04-2014 | Исправлено: Alukardd, 20:32 10-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
Для браузера есть плагины, которые сохраняют таблицу в csv формате. Когда найдёте удобный Вам, покажите выходной формат, и дальше на том же awk легко получить нужный выходной файл.

 
Плагин для Оперы не нашёл. Зато в ней есть возможность изменения меню, в котором, в свою очередь, можно прописать стороннюю программу. Делаю так, в меню прописываю свой пункт:

Код:
Item, "Сохранить в файл" = Execute program, "grabtext", "%t"

 
Скрипт grabtext:

Код:
#!/bin/bash
echo $1 > /home/user/proxies

 
В итоге в файле proxies вот такой фарш:

Код:
1 77.50.220.92:8080 HTTPS NOA 0.716 RU ! logoprom26.starlink.ru 11:04:14-09:20 2 195.14.41.84:8080 HTTPS NOA 0.781 RU Moscow 195.14.41.84 11:04:14-09:19 3 213.170.127.32:3128 HTTPS NOA 2.165 RU subnet32x8.127.quantum.ru 11:04:14-09:09 4 89.251.103.130:8080 HTTPS NOA 2.472 RU 130-103-251-89.citynsk.ru 11:04:14-09:07 5 217.76.43.186:80 HTTPS NOA 6.521 RU Moscow 217.76.43.186 11:04:14-08:39 6 80.64.29.189:8080 HTTPS NOA 0.899 RU 80.64.29.189 11:04:14-07:50 7 81.20.200.182:8080 HTTPS NOA 0.768 RU 81.20.200.182 11:04:14-07:41

 
Либо как-то надо добиться того, чтобы в файл складывалось построчно, либо разбирать эту мешанину, на предмет ip:port.
 
upd
О! Переводы строк победил. Просто в скрипте делаем "$1" и всё в ёлочку!
Вот теперь ваш выход, господа умудрённые опытом. Вот из этого массива данных:
Подробнее...
Надобно сделать рас-файл, пример которого есть в сообщении выше.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 10:22 11-04-2014 | Исправлено: Maximus777, 10:56 11-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777Сам скрипт
Код:
#!/usr/bin/gawk -f
BEGIN {
    j=-1
    i=-1
    SITES="/tmp/proxy/sites"
    while (getline < SITES) {
        sites[++i] = $0
    }
}
{
   proxies[++j] = $2  
}
END {
    printf "function FindProxyForURL(url, host)\n{\n  if ("
    for (x=0;x<i;x++)
       printf "shExpMatch(url, \"*"sites[x]"*\") || "  
    print "shExpMatch(url, \"*"sites[i]"*\"))"  
    printf "  {\n    return \""
    for (x=0;x<j;x++)
       printf "PROXY "proxies[x]"; "
    printf "PROXY "proxies[j]";\";"
    print "\n  }\n  return(\"DIRECT\");\n}"
}
На вход получает путь до файла, который вы сохранили из браузера.
Так же читает файл /tmp/proxy/sites
Цитата:
livejournal
ariom


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:54 11-04-2014 | Исправлено: Alukardd, 12:55 11-04-2014
Maximus777

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

Код:
genpacfile /home/user/temp/proxies > /home/user/temp/1.рaс

то файл 1.рас создаётся. Скрипт положил в файл genpacfile. Надо, чтобы команды:

Код:
genpacfile /home/user/temp/proxies

хватало и в результате создавался файл с обработанными скриптом данными. Про print почитал, не внял, можно ли делать вывод в файл.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:20 11-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Придётся перенаправлять отдельно каждую команду print — зачем оно Вам?
Чем не устраивает общее перенаправление вывода?
 
Я, кстати, вроде не использовал ни чего специфичного для Gnu AWK, так что можно использовать просто 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:44 11-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всё, разобрался. Доволен, как удав! Спасибо!
 
Сделал в одном файле

Код:
#!/bin/bash
echo "$1" > /home/user/temp/proxies
genpacfile /home/user/temp/proxies > /home/user/temp/1.pac

И этот скрипт прописал в меню Оперы.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:52 11-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Для примера изменил Вам скрипт, теперь в конце можете сами решить куда выводить:
Код:
#!/usr/bin/gawk -f
BEGIN {
    j=-1
    i=-1
    SITES="/tmp/proxy/sites"
    while (getline < SITES) {
        sites[++i] = $0
    }
}
{
   proxies[++j] = $2  
}
END {
    res="function FindProxyForURL(url, host)\n{\n  if ("
    for (x=0;x<i;x++)
       res=res"shExpMatch(url, \"*"sites[x]"*\") || "  
    res=res"shExpMatch(url, \"*"sites[i]"*\"))\n"
    res=res"  {\n    return \""
    for (x=0;x<j;x++)
       res=res"PROXY "proxies[x]"; "
    res=res"PROXY "proxies[j]";\";"
    res=res"\n  }\n  return(\"DIRECT\");\n}"
     
    print res > "result.pac"
}  
В таком виде запишет в файл result.pac, можно просто написать print res, тогда выведет на экран.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:53 11-04-2014
Maximus777

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

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:13 11-04-2014
Rasmys

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток увожаемые товарищи!!!
Как и многим на этом форуме не нужна помошь!
Суть следующая:
Имеется приложение запущеное на Weblogic'e которое пишет логи о своей работе каждую минуту.  
Мне необходимо созадать скрипт, который бы читал данные из данного файла, находя определенную фразу или слово (Например ERROR) он отправлял уведомление на почту или по смс, возможно и то и другое.  
Скрипт предпологается запускать cron'ом каждые 5 минут.
Прошу вашей помощи...
 

Всего записей: 5 | Зарегистр. 14-04-2014 | Отправлено: 08:57 14-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Rasmys
Цитата:
не нужна
обычно людям всё же нужна помощь
 
/bin/grep 'ERROR' /path/to/file | /usr/bin/mailx -s "АУХТУНГ" you@mail.com
Если данная машина не является почтовым сервером, а отправлять письмо надо наружу, то mailx нужно рассказать с какого ящика отправлять и как там пройти аутентификацию.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 10:42 14-04-2014
Rasmys

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опечатался, сорри....
 
Все так просто?)
Я в этом деле вообще новичек очень далекий...(  
Может быть есть человечек готовый за пазырек отличного Казахстанского коньячка, потратить свое время и нервы на более глубокий анализ данного вопроса? )
В данном скрипте он ищет слово и отправляет на почту, все согласно моего запроса, Но тут же возникают вопросы:
1. Как сделать так что бы скрипт каждый раз не перечитывал файл с начала, а отлавливал только новые ошибки?  
2. Можно ли в одном скрипте написать сразу просмотр нескольких файлов из разных директорий?
3. Сама машина на котрой все крутиться SUN с SUN OS, всю свою сознательную жизнь открывал форточки(Windows) и вот такая засада...
Для нагладности могу приложить интересующие файлики логов, и думаю лучше перевести данный вопрос в ЛС.

Всего записей: 5 | Зарегистр. 14-04-2014 | Отправлено: 11:44 14-04-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tail -f log_file1 log_file2 | grep --line-buffered word | while read line ; do echo "$line" | mail -s warning user@domain; done

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 12:17 14-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
Да, с tail лучше, а то моя команда будет паниковать каждые 5 минут)
 
А вообще я думал что красивее будет использовать fifo.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:16 14-04-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нет, tail вместо cron, иначе может быть пропущено событие.
с cron будет сложнее отыскать место последнего собыия в логфайле, тут либо кеш sha1, либо wc -l + перемотка до позиции.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 13:28 14-04-2014
Rasmys

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите есть ли замечания вот к такой команде:
tail -f /opt/lanit/RPP/log/RA-1.log | grep --line-buffered "[ERROR]" | while read line ; do echo "$line" | print "ERROR"; done
По сути копия команды arto только хочу что бы в конце он написал мне что есть ошибка.
[ERROR] так записвается в лог, возможно ли так и поиск осуществлять?

Всего записей: 5 | Зарегистр. 14-04-2014 | Отправлено: 15:07 14-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Rasmys
echo "$line" | print "ERROR"; выведет Вам только слово ERROR, а $line просто уйдёт в никуда.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:07 14-04-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
tail -f /opt/lanit/RPP/log/RA-1.log | grep --line-buffered -F "[ERROR]" | while read line ; do echo -n "$line"; print "ERROR"; done  
 
print "ERROR" -- у вас какой шелл?

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 16:24 14-04-2014
Rasmys

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GNU bash, version 3.00.16(1)-release (sparc-sun-solaris2.10)
Copyright (C) 2004 Free Software Foundation, Inc.

Всего записей: 5 | Зарегистр. 14-04-2014 | Отправлено: 07:03 15-04-2014
arto

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

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 08:26 15-04-2014
Rasmys

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не знаю( man есть, при запуске команды говорит не найдена...(  
А grep --line-buffered не опознана...(

Всего записей: 5 | Зарегистр. 14-04-2014 | Отправлено: 09:15 15-04-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
неа, а вот я сижу в zsh, поэтому даже и не впалил тему
 
Rasmys
просто используйте в shell'е всегда echo

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 10:47 15-04-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
скорее всего --line-buffered -- это gnu-расширение. если у вас стоит gnu-bash, то может стоять и gnu-grep (да и другие утилиты тоже). попробуйте их найти, они, если я верно помню, устанавливаются отдельным пакетом куда-то в /opt.
без --line-buffered grep может буферизировать вывод, и вы получите результат не вовремя.
либо посмотрите какие похожие опции есть у родного grep.
либо городить вызовы grep на каждую принятную строку из логов.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 13:21 15-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Объясните, плиз, что происходит в этой строке:
 
grep text | sed -e &quot;s/&lt;[^&gt;]*&gt;//g&quot;

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 10:57 30-04-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Maximus777
Конкретно это - не знаю. Оно работает? выглядит как html-escaped версия  
grep txt | sed -e "s/<[^>]*>//g"
Убирает все html-теги (все что между угловыми скобками, включая сами скобки). PCRE вариант -  
grep txt | ssed -R -e "s/<.*?>//g"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 11:15 30-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, Alex_Piggy.
Я догадываюсь (очень издалека), что вторая часть выражения просто удаляет лишний текст. В исходной строке это выглядит так:
 
<h3 class="typeM">Нужный_текст</h3>
 
После обработки остаётся только Нужный_текст. Хотелось бы осознать весь процесс этого колдунства. Для общего развития, так сказать
 
Хотя, моя конечная цель немного отличается, т.к. исходная строка более объёмная. Мне надо выхватить текст между bla-bla-bla"> и следующей <

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 11:26 30-04-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maximus777
"вторая часть выражения просто удаляет лишний текст." - неправильно. Удаляет найденный текст.
Объяснить, наверное, у меня не получится. Если в строке может быть только одно совпадение, то  "Строку целиком заменить на содержимое первых скобок."
grep txt | sed -r -e "s/^.*bla-bla-bla\x22>([^<]*)<.*$/\1/i"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 22:36 30-04-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Благодарю за помощь. Начинаю понимать sed

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:27 30-04-2014
Maximus777

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

Код:
awk 'BEGIN {f=0}; /day date=\"2014-05-03\"/ {f=0}; f {print}; /day date=\"2014-05-02\"/ {f=1}'

То есть, выхватываем текст между двумя датами. Возможно ли заменить даты на команды:
date +%F и date --date="${date} 1 days" +"%F"

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 13:53 02-05-2014 | Исправлено: Maximus777, 13:54 02-05-2014
Maximus777

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

Код:
date +%F' ' | tr -d "\n"; date -d "1 day" +"%F"

выдаёт:
2014-05-02 2014-05-03
 

Код:
date +%F' ' | tr -d "\n"; date -d "1 day" +"%F" | awk '{ print $2 }'

2014-05-02
Пуркуа?!
 
Upd:
Здесь понял. Блин! Как вывести две даты в строку, чтоб вторая была на день позже?
 
Upd2:
Победил.

Код:
echo `date +%F` `date -d "1 day" +"%F"` | awk '{print $2}'

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 19:14 02-05-2014 | Исправлено: Maximus777, 19:50 02-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Позвольте, а на кой хер выводить две даты и тут же одну отфильтровывать через 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:54 02-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Вопрос скорее должен звучать "почему", а не "зачем". Таковы мои познания, пока.
 
Мне надо в эту строку:

Код:
awk 'BEGIN {f=0}; /day date=\"2014-05-03\"/ {f=0}; f {print}; /day date=\"2014-05-02\"/ {f=1}'

подставить дату, которая будет вычисляться. Вот я и стал изобретать велосипед ... Т.е. отфильтровывание одной даты, это просто тренировка, чтобы понять, как оно работает.
 
А полностью, задача такая. Есть xml файл, в нём 10 разделов, типа:
<day date="2014-05-02">
...
<day date="2014-05-03">
...
и т.д. Нужен однострочник, который вытащит из раздела некоторую инфу. Даты, само собой, будут меняться.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:35 02-05-2014 | Исправлено: Maximus777, 23:37 02-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Maximus777
1. Если это xml, зачем Вам вторая дата? Должен быть закрывающий тег </date>.
2. Использовать переменные awk -v "MyDate1=$(date +%F)"  -v "MyDate2=$(date -d '1 day' +%F)"  '{print MyDate1 FS FS MyDate2}'

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 14:23 03-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Забавно, что-то мне ни когда в голову не приходило прямо в print передавать переменную FS
А с другой стороны зачем? Когда можно просто написать print MyDate1,MyDate2

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:11 03-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравия желаю!
Alex_Piggy
 

Цитата:
1. Если это xml, зачем Вам вторая дата? Должен быть закрывающий тег </date>.

Есть некий файл-скрипт, состоящий из нескольких строк, примерно такого формата:
var1 = "sed ... awk ... и прочая"
var2 = "grep ... sed ..."
Таких строк 10. Файл xml, который парсится, тоже имеет 10 разделов, с 10-ю датами, от сегодняшней, до +9 дней. На основе этого xml и заполняется первый файл с переменными var1 - var10.
 
Alex_Piggy

Цитата:
2. Использовать переменные awk -v "MyDate1=$(date +%F)"  -v "MyDate2=$(date -d '1 day' +%F)"

Похоже то, что надо. Даже print не нужен. Т.к. задача awk'а только выхватить кусок из файла, находящийся между этими двумя датами. А далее | sed ... , срезать лишнее которым я уже научился
 
Спасибо за ответы, на возможно глупые вопросы.
 
Вот, что у меня в итоге получилось:

Код:
awk "BEGIN {f=0}; /day date=\"$(date +%F)\"/ {f=0}; f {print}; /day date=\"$(date -d '1 days' +%F)\"/ {f=1}"

Блин! Как просто оказалось в итоге!

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:51 03-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Цитата:
А далее | 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:17 03-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maximus777
1. Я имел в виду, что в xml каждый тег должен закрываться. То есть у Вас данные за день начинаются с <day date="2014-05-02"> и должны заканчиватся просто </day>. print был просто для для демонстрации дат.  '$0 ~ MyDate1 {...}; $0 ~ MyDate2 {....}'
2. И у sed и у awk есть выбор обрабатываемого диапазона (когда указываются два регекспа через запятую). Попробуйте
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/p"
Убираете -n и вместо p в фигурных скобках - набор команд для обработки...

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 23:46 03-05-2014
Maximus777

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

Цитата:
Уважаемый, awk и сам прекрасно может отрезать всё лишнее, зачем вызывать после одного мощнейшего парсера ещё и второй?

Делаю по подобию оригинального файла. Возможно, что его создавал такой же начинающий парсерщик, как и я. Можете сами посмотреть, если используете KDE. Это погодный виджет, пакет plasma-widget-cwp.
 

Цитата:
А смысл Вашего конечного выражения вообще туманен, получается Вы выводите все строки после того как нашли строку содержащую "завтра" и до того как наткнётесь на "сегодня".

Опять же, я просто нашёл пример, который вырезает кусок текста и приспособил его под свои нужды. Когда я пытался делать это sed'ом, то в вырезанном куске было много лишнего. С awk вырезание проходит без таких фокусов, но его синтаксис для меня более сложен.
 
Alex_Piggy

Цитата:
1. Я имел в виду, что в xml каждый тег должен закрываться.

В принципе, да. Можно и так.
 

Цитата:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/p"

Так работает. Но дальше опять грабли. Из полученного куска надо выхватить другой текст, между тегами <temperature_to> и </temperature_to>. Так не получилось:

Код:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/p" filesrc | sed -n -e "/<temperature\_to>/,/<\/temperature\_to>/p"

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 19:03 04-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Maximus777
Прошу прощения, а зачем Вы подстрочное тире экранируете? Я не знаю такого... Может в этом причина? Посмотрите так:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/{/<temperature_to>/,/<\/temperature_to>/p}"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 19:27 04-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Цитата:
Прошу прощения, а зачем Вы подстрочное тире экранируете?

Это я извиняюсь. Просто уже начал перебирать варианты и один из последних запостил. Сначала без экранирования пробовал.
 

Цитата:
sed -n -e "/<day date=\x22$(date +%F)\x22>/,/<\/day>/{/<temperature_to>/,/<\/temperature_to>/p}"

Нет, не получается. Может проблема в том, что в этом куске текста несколько тегов по температуре?

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:04 04-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maximus777
Нет. Должно вывести все. Можно образец?

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 21:07 04-05-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
 
О господи!
 

 
Дайте пример файла, и что и из него надо извлечь.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:15 04-05-2014
Maximus777

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

Код:
<day_part typeid="2" type="day">
<temperature_from>
12
</temperature_from>
<temperature_to>
14
</temperature_to>
<temperature-data>

Моя цель - "14" в чистом виде.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 21:38 04-05-2014 | Исправлено: Maximus777, 21:39 04-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Доступ к файлу запрещён — 403 ошибка.
 
Добавлено:
Maximus777
Вообще т. ASE_DAG прав насчёт попытки парсить XML регулярками...
По тому примеру что Вы дали в тексте сообщения это делается так:
Код:
#!/usr/bin/env ruby
 
require 'nokogiri'
to_parse = Nokogiri::XML(File.open("/tmp/src"))
res = to_parse.at_xpath('//day_part//temperature_to').content
print res


----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:03 04-05-2014 | Исправлено: Alukardd, 22:18 04-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Другой пример.
Почему-то Челябу закрыли, хотя я открывал ссылку ...
 
Или можно вот тут любой взять город.
 
А вот кусок файла, ответственного за наполнение данными (но это парсинг gismeteo):

Код:
<data_day1 url="url1"
        name="grep -A 8 weekday | head -n 9 | tail -n 9 | grep weekday | sed -e &quot;s/.*weekday[^&gt;]*&gt;\([^&lt;]*\).*/\1/&quot;"
        temperature_low="grep -A 8 weekday | head -n 9 | tail -n 9 | grep temp | head -n 1 | sed -e &quot;s/&amp;minus;/-/&quot; | sed -e &quot;s/.*temp c[^&gt;]*&gt;+*\([-0-9]\+\).*/\1/&quot;"
        temperature_high="grep -A 8 weekday | head -n 9 | tail -n 9 | grep temp | tail -n 1 | sed -e &quot;s/&amp;minus;/-/&quot; | sed -e &quot;s/.*temp c[^&gt;]*&gt;+*\([-0-9]\+\).*/\1/&quot;"
        icon="grep -A 8 weekday | head -n 9 | tail -n 9 | grep png | tail -n 1 | sed -e &quot;s/.*\(http[^\&quot;]*\).*/\1/&quot;"
        icon_code="grep -A 8 weekday | head -n 9 | tail -n 9 | grep png | tail -n 1 | sed -e &quot;s/.*\(http[^\&quot;]*\).*/\1/&quot; | sed &apos;s/.*new\/\(.*\)\.png.*/\1/&apos;"
        icon_text="grep -A 8 weekday | head -n 9 | tail -n 9 | grep cltext | tail -n 1 | sed -e &quot;s/.*cltext[^&gt;]*&gt;\([^&lt;]*\).*/\1/&quot;"

Видите, сам xml вполне безобидный? Или предлагаете всё же руби использовать?

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:30 04-05-2014 | Исправлено: Maximus777, 22:32 04-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
По прямой ссылке всё та же 403 ошибка. А Что значит взять любой город и как этим пользоваться я понятия не имею.
 
Просто покажите из каких данных и какие вы хотите получить и не схематично, а дословно.
 
Если выборка действительно идёт из XML дерева с атрибутами, а не просто по ключевому слову, то да, я рекомендую любой приятный Вам ЯП с библиотекой для парсинга XML. Будет это ruby, python, C или Java абсолютно не имеет значения, ну разве что скриптовые языки более удобны в данной ситуации.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:21 04-05-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777> Или предлагаете всё же руби использовать?
 
Если вас напрягает необходимость набрасывать отдельный ruby-скрипт, то ничего не мешает вызвать ту же nokogiri из шелла:
 
$ cat 777.xml
<day_part typeid="2" type="day">
<temperature_from>
12
</temperature_from>
<temperature_to>
14
</temperature_to>
<temperature-data>  
 
$ nokogiri -e 'p $_.at_xpath("//day_part//temperature_to").content.delete!("\n")' 777.xml
"14"

 
Добавлено:
Другой вариант с использованием средств, доступных в Дебиане:
 
$ tidy -quiet -xml 777.xml | xmllint --xpath '//day_part//temperature_to/node()' -
14



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:06 05-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
По прямой ссылке всё та же 403 ошибка. А Что значит взять любой город и как этим пользоваться я понятия не имею.

Перезалил файл сюда. Там просто id города в ссылку подставляется и всё. С чем связана 403 ошибка не знаю. Вчера Челяба не открывалась, сегодня с первого раза.
 

Цитата:
Просто покажите из каких данных и какие вы хотите получить и не схематично, а дословно.

Из этого xml-файла мне нужна температура каждого из 10-ти дней, ночная и дневная. Т.е. день, это тег <day date="2014-05-05">. Температура дня в нём:
<day_part typeid="2" type="day">
      <temperature_from>12</temperature_from>
      <temperature_to>19</temperature_to>
19
 
Температура ночью:
<day_part typeid="4" type="night">
      <temperature_from>16</temperature_from>
      <temperature_to>18</temperature_to>
18.
 
ASE_DAG
Цитата:
nokogiri -e 'p $_.at_xpath("//day_part//temperature_to").content.delete!("\n")' 777.xml


Код:
nokogiri -e 'p $_.at_xpath("//day_part//temperature_to").content.delete!("\n")' 28642.xml  
<main>:1:in `<main>': undefined method `content' for nil:NilClass (NoMethodError)
        from /usr/bin/nokogiri:71:in `eval'
        from /usr/bin/nokogiri:71:in `<main>'

 

Цитата:
tidy -quiet -xml 777.xml | xmllint --xpath '//day_part//temperature_to/node()' -

Куча ошибок такого вида:

Код:
line 2271 column 64 - Warning: replacing invalid character code 140
line 2272 column 35 - Warning: replacing invalid character code 128

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 18:39 05-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Maximus777
Однострочный монстрик -  
0<28642.xml sed -r -n -e "/<day date/,/<\/day>/{/<day date/{s/.*\x22(.*)\x22.*/\1/g;H};/<day_part typeid=\x22[24]\x22/,/<\/day_part/{/<temperature_to/{s/.*>(.*).*<.*/\1/g;H;}};/<\/day>/{s/.*/@/;H}};${x;s/\n+/\t/g;s/@/\n/g;p}"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 19:45 05-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А вот Nokogiri зараза что-то не даётся... Он документ этот распарсил, но обращаться по xpath'у не даёт... Хз что ему надо!

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:12 05-05-2014
Maximus777

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

Код:
bash: /<day date/,/<\/day>/{/<day date/{s/.*\x22(.*)\x22.*/\1/g;H};/<day_part typeid=\x22[24]\x22/,/<\/day_part/{/<temperature_to/{s/.*>(.*).*<.*/\1/g;H;}};/<\/day>/{s/.*/@/;H}};${x;s/\n+/\t/g;s/@/\n/g;p}: неправильная подстановка

Сейчас уже глаза слипаются. Завтра попробую разобраться. Спасибо за монстрика.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:10 05-05-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777> nokogiri -e 'p $_.at_xpath("//day_part//temperature_to").content.delete!("\n")' 28642.xml
 
Какого лешего вы применяете XPath, корректный для одного файла, к совершенно другому?
 
$ nokogiri -e 'p $_.xpath("//forecast/day[@date=\"2014-05-05\"]/day_part[@type=\"day\"]/temperature_to").text' < 28642.xml
$ nokogiri -e 'p $_.xpath("//day[@date=\"2014-05-05\"]/day_part[@type=\"day\"]/temperature_to").text' < 28642.xml
"10"

 
Вы так, собственно, и не удосужились написать, какой вам нужен результат. Допустим, что CSV-файл. Тогда проще было написать все это в виде XSLT-запроса, но если вы все-таки желаете командной строкой, то есть xmlstarlet sel, позволяющий все то же самое, что XSLT, но еще дающий столь почитаемую вами возможность сделать все в кашу при помощи однострочного синтаксиса:
 
$ xmlstarlet sel -t -m '/_:forecast/_:day' -v '@date' -o ',' -v '_:day_part[@type="day"]/_:temperature_to' -o ',' -v '_:day_part[@type="night"]/_:temperature_to' -n 28642.xml
$ xmlstarlet sel -t -m '//_:day' -v '@date' -o ',' -v '_:day_part[@type="day"]/_:temperature_to' -o ',' -v '_:day_part[@type="night"]/_:temperature_to' -n 28642.xml
2014-05-05,10,10
2014-05-06,19,18
2014-05-07,21,12
2014-05-08,11,12
2014-05-09,13,17
2014-05-10,17,19
2014-05-11,16,17
2014-05-12,16,19
2014-05-13,20,24
2014-05-14,21,23

 
Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:16 05-05-2014 | Исправлено: ASE_DAG, 00:38 06-05-2014
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maximus777
Прошу прощения. Замените двойные кавычки на одинарные.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 23:52 05-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А вот //forecast можно кстати опустить, в этом вся суть удвоения слэша (//).
 
Но я так и не понял почему внутри .rb скрипта оно у меня с этой xml'кой не работает. Я даже пытался это понять сидя в irb, но так и не понял.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:07 06-05-2014
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, действительно! ОК, опустил.
 
Ну можно попытаться разобраться со скриптом, ежели желаете.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:40 06-05-2014
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Комментарии нужны?

Нет. Спасибо. Мне нужны только значения температур, но тут я уже сам.
 
Alex_Piggy
Цитата:
Прошу прощения. Замените двойные кавычки на одинарные.

Класс! Работает!
xmlstarlet тоже весело отработал, но мне монстрики нравятся Впрочем, буду оба способа использовать.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 18:52 06-05-2014
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите по curl, выполняю:
# curl -vv -3 -i -k -c "cookies.txt" -A "$UA" "https://my.kyivstar.ua/tbmb/login/perform.do"
получаю:

Код:
* Hostname was NOT found in DNS cache
*   Trying 193.41.60.38...
* Connected to my.kyivstar.ua (193.41.60.38) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /usr/local/share/certs/ca-root-nss.crt
  CApath: none
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS alert, Server hello (2):
* error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

 
где
UA="Mozilla/5.0 (X11; Linux x86_64; rv:10.0.6) Gecko/20100101 Firefox/10.0.6 Iceweasel/10.0.6"

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 17:43 12-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Сертификаты корневые в системе имеются? В debian пакет называется ca-certificates.

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:01 12-05-2014
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Корневые сертификаты присутствуют, обновлены сегодня:

Код:
* successfully set certificate verify locations:  
*   CAfile: /usr/local/share/certs/ca-root-nss.crt

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 23:21 12-05-2014 | Исправлено: kpp77, 23:28 12-05-2014
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kpp77
Пробуем добавить опцию --cipher RC4-MD5
Если не сработает тогда...
Не нравится мне всё же что curl скомпилен для использования .crt файла, попробуйте указать ему опцию -capath "/etc/ssl/certs" (путь может отличаться в Вашей системе)

----------
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 08:27 13-05-2014
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может быть вы забанены?
У меня и curl качает, и wget.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 08:33 13-05-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7

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