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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все в порядке, СПАСИБО еше раз !!!

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:46 24-10-2011
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Допустим у нас есть файл со следующим содержимым:

Код:
 
IP address of server1.office.local: 192.168.0.1
IP address of server2.office.local: 192.168.0.2
IP address of server3.office.local: 192.168.0.3
..........
IP address of serverN.office.local: 192.168.0.N
 

 
Возможно ли только средствами awk привести его к виду:

Код:
 
server1 192.168.0.1
server2 192.168.0.2
server3 192.168.0.3
..........
serverN 192.168.0.N
 


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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 15:37 26-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
ВотЪ
awk '{gsub("\\..*","",$4); print $4" "$5}' /path/to/your/file

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:10 26-10-2011
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
За gsub спасибо. Но не удалось полностью понять регулярное выражение, а именно как понимать первую косую черту?

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 17:49 26-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Она видимо для shell'а... Экранирует экран - её bash(sh,zsh) съедает.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:17 26-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
>>> awk '{gsub("\\..*","",$4); print $4" "$5}' /path/to/your/file
>> как понимать первую косую черту?
> Она видимо для shell'а... Экранирует экран - её bash(sh,zsh) съедает.
Нет. В строгих (одиночных) кавычках бэкслэш для шелла особого значения не имеет.
$ echo \\ '\'
\ \

 
А его удвоение — это авковская специфика.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
хм... внутри 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 11:41 27-10-2011
ASE_DAG



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

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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:54 27-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как в этом скрипте последние 2-е ячейки заключить в кавычки? Исходник-csv с 6 ячейками, ячейки в кавычках, разделенные точкой с запятой. Скрипт дописывает 7 ячейку, но убирает кавычки с 6 ячейки и не дописывает их в 7-ю.

Код:
 
#!/usr/bin/gawk -f  
 BEGIN {  
     FILELIST="/home/alukardd/script/9175/base.txt"  
     RS=",\n";  
     while (getline < FILELIST) {  
         var=$0;  
         gsub(/.*\\/,"");  
         gsub(/_.*/,"");
         files[$0]=var;  
     }  
     RS="\n";  
     FS=";";  
     OFS=";";  
 }  
 /[[:digit:]]{6,9}/{  
         gsub(/"/,"",$NF);  
         print ("",$2,$3,$4,$5,$6, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");  
       }  
 


Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:48 02-11-2011 | Исправлено: digital422, 19:49 02-11-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Видимо изменить $6, на "\""$6"\""

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:37 02-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
6-й столбец стал в кавычках, а как быть с 7-м, если экранировать $NF, то он не подставляет значения из base.txt?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
OMG
видимо, заменить files[$NF] на "\""files[$NF]"\""

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:26 02-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно ли в gawk скрипте сделать переменную для внешнего ввода, например:
gawk "внешний ввод" --re-interval -f скрипт.awk входной файл.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Не совсем понял суть? Вы хотите весь вывод записать в переменную?
Если так то для bash(в других не гарантирую) это выглядит так:
Код:
x="`gawk --re-interval -f скрипт.awk входной файл`"
echo "$x"
В zsh надо прописывать echo -E "$x".

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:37 03-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Благодаря Вашим примерам у меня получилось сделать свой вариант awk скрипта, причем самое удивительно, что он работает ).  Мой скрипт обрабатывает csv и выдает результат в выходной файл, мне надо делать из 5-ти входных, 5 выходных файлов, причем в самом awk скрипте есть уникальная строчка, которая относится к конкретному выходному файлу, например 1-ый файл: "#канал1", 2 файл "#канал2" и т.д. Самое простое сделать 5 awk скриптов со своими значениями и 1 исполняемый bash файл, но хочется файлов поменьше, 1 awk и 1 bash. В bash в строке gawk --re-interval прописывается "#канал1" и это передается в awk, тем самым на выходной получаем конечный файл со строчкой "#канал1" и т.д. для остальных 4-х.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Растёшь на глазах!!!
 
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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:45 03-11-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня проблемка и хз как её решить
gsub(/.*\(([ОП]К)/,"\1",$0);
print $0;
Вместо того, что бы вывести ОК или ПК выводит квадрат (типа неизвестный unicode символ)... И хз что с ним делать. Входной файл в utf-8.
 
Добавлено:
Усё, нашёл ответ - \\1-9 не работают в sub и gsub, надо так:
q=gensub(/.*\(([ОП]К)/,"\\1","g");
print q;

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:04 05-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача:
Каждый день создаются папки в формате 20111101 до 20111131 (или 20111130), в них с интервалом 10 мин. пишутся файлы (00_00_01, 00_10_01 и до 23_50_01). Надо проверять, все ли файлы на месте, если нет, выдавать отчет об отсутствующих файлах.
Вот знаю что решение простое, но я немного запутался с seq, не получается сделать символ _ между переменными.

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



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:58 09-11-2011
digital422

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

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



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

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:20 09-11-2011 | Исправлено: Alukardd, 22:20 09-11-2011
digital422

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

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

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

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



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

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

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

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

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

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

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

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



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

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:19 10-11-2011
digital422

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

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



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

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

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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Он скорее всего считает что это продолжение имени переменной...
В таком случае записывать надо так: echo ${hour}_${minute} - тем самым жёстко ограничивая имя переменной.
 
p.s. пожалуйста даже в таком примере табулируйте тело цикла.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 19:07 10-11-2011
ASE_DAG



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


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

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

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

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



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

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



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

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

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

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

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

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



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

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:45 13-11-2011 | Исправлено: Alukardd, 16:00 13-11-2011
digital422

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

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



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

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:40 13-11-2011 | Исправлено: Alukardd, 17:40 13-11-2011
digital422

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

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

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

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


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

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

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

в конце:

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Для начала, вот:
Код:
sed -i '/^[[:space:]]*$/d' source
Выполните перед тем как запускать awk, он уберёт все пустые строки, в том числе те которые содержат только пробелы и табуляции.
 
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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:37 14-11-2011 | Исправлено: Alukardd, 16:38 14-11-2011
digital422

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

Код:
 
 } else {  
   print s"^",COMMAND2,"rem "$1,COMMAND$NF"\\name-"NM" ^",COMMAND2"^",LN"^";  
   s="0";  
 

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



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

}
Однако скрипт по прежнему не любит пустые строки, поэтому не забываем выполнять очистку с помощью sed.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:59 14-11-2011 | Исправлено: Alukardd, 19:51 14-11-2011
Totorang

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите плиз написать на Bash программу
Программа должна брать почтовые адреса (либо адреса самому указывать) и рассылать им файлы\письма из базы данных.

Всего записей: 3 | Зарегистр. 20-11-2011 | Отправлено: 22:49 20-11-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Totorang
Что-то похожее на это
Код:
#!/bin/bash
 
 usersmails=$(mysql --user=dbuser --password=dbpwd dbname <<< 'SELECT email FROM users;')
 msgs=$(mysql --user=dbuser --password=dbpwd dbname <<< 'SELECT msg FROM messages;')
 MAILPROG=$(which mail)
 
 for usermail in ${usersmails}; do
  for msg in ${msgs}; do
      SUBJECT="ОТ МЕГА КОРПОРАЦИИ"
      # Email To ?
      EMAIL="$usermail"
      # Email text/message
      EMAILMESSAGE="/tmp/emailmessage.txt"
      echo "$msgs" > $EMAILMESSAGE
      echo "С уважением, Ваш Вася!" >>$EMAILMESSAGE
      # send an email using /bin/mail
      $MAILPROG -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
  done
done
Как он будет работать с многострочным текстом который попадет в переменную msgs я хз - поэтому прежде чем использовать $MAILPROG просто поглядите на echo... Так же пользовательские мыла я тоже из БД выбирал.
 
Добавлено:
Вообще не стоит так извращаться - напишите всё это на PHP!

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:44 20-11-2011 | Исправлено: Alukardd, 23:46 20-11-2011
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Totorang
Цитата:
Вообще не стоит так извращаться - напишите всё это на PHP!
Насчет извращения согласен, насчет PHP - нет. ИМХО лучше писать такие вещи на Perl. Но если плохо знаешь Perl, а PHP хорошо, можно и на нем.  
 


----------
Заслуженный SCOтовод, почетный SUNтехник и любитель Кошек

Всего записей: 17280 | Зарегистр. 13-06-2007 | Отправлено: 11:13 21-11-2011
Totorang

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

Всего записей: 3 | Зарегистр. 20-11-2011 | Отправлено: 14:25 21-11-2011 | Исправлено: Totorang, 18:20 21-11-2011
digital422

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

Код:
 
;;"28 октября пятница";"канал"
;;;"name";"5";
"09:31";"1";"";"";"";""
"09:31";"";"";"";"";""
"09:31";"";"";"";"";""
;;;"name";"5";
;;;"ИТОГО";"110";
;;;"name";"5";
"10:10";"1";"";"";"";""
"10:10";" ";"";"";"";""
;;;"name";"5";
;;;"ИТОГО";"50";
"11:10";"1";"";"";"";""
;;;"ИТОГО";"30";
 

 

Код:
 
#!/usr/bin/gawk -f
 
BEGIN {
    RS="\n";
    FS=";";
    OFS=";";
    ORS="\n";
     }
{
if ($1 ~ /[[:digit:]]/) {
    if ($1 == time)
        time = $1;
    else {
        time = $1;
    }
}
if (NR == 1)
        print $3;
if ($4 == "\"ИТОГО\"")
        print time $1 FS $5;
}
 

результат вывода:

Код:
 
"28 октября пятница"
"09:31";"110"
"10:10";"50"
"11:10";"30"
 

надо сделать:
1) переместить дату из 1 строки в 3 ячейку. Небольшой нюанс, дата не всегда может быть в первой строке, в одном файле может быть 2 и более дня.
2) убрать название месяца, строка разделена пробелами.

Код:
 
"09:31";"110";"28 октября"
"10:10";"50"
"11:10";"30"
 

Можно ли в awk описывать результаты if как переменную и уже дальше ее подставлять в print для получения нужного расположения ячеек?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 07:20 26-11-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Red Planet
> Не могу понять логику работы с именем файла
> почему явное указание расширения *.txt сводит на нет рекурсию
Во-первых, вы забываете о том, что не просто вызываете Греп с какими-то параметрами, а пишите команду шеллу, который имеет свой синтаксис, в соответствии с которым интерпретирует написанное первым.  
 
$ ls  
foo  mytext.txt  no.txt
 
$ echo *.txt
mytext.txt no.txt
 
$ echo '*.txt'
*.txt

 
Понятно?
 
Если путаетесь, проверяйте свои команды в xtrace-режиме:
$ set -x
$ echo *.txt
+ echo mytext.txt no.txt
mytext.txt no.txt

 
А во-вторых, просто задаете Грепу не адекватные задаче параметры.
 
Маска имени файлов, которые надо обходить рекурсивно задается ключом --include, который краткой формы не имеет (-i — это игнорировать регистр).
 
Т.о. команда, адекватная вашей задаче, имеет вид
$ grep -ni -R --include='*.txt' 'Lorem' .
 
 
> Или в таком случае используют следующее?
> $ grep -nri Lorem `find -name '*.txt'`
Нет. И вывод файнда лучше вообще так не подставлять.
 

Red Planet (22:10 26-11-2011)
Цитата:
Не могу понять логику работы с именем файла команде grep (fgrep). Нужно, например, рекурсивно найти все файлы txt, содержащие подстроку "Lorem". Для этого выполняю  
 
[redplanet@localhost Temp]$ ls  
foo  mytext.txt  no.txt
[redplanet@localhost Temp]$ fgrep -nri Lorem *
foo/bar.txt:1:Lorem
mytext.txt:1:Lorem
[redplanet@localhost Temp]$ fgrep -nri Lorem *.txt
mytext.txt:1:Lorem
[redplanet@localhost Temp]$ fgrep -nri Lorem foo/*.txt
foo/bar.txt:1:Lorem
[redplanet@localhost Temp]$ fgrep -nri Lorem foo/*.txt *.txt
foo/bar.txt:1:Lorem
mytext.txt:1:Lorem
[redplanet@localhost Temp]$ fgrep -nri Lorem foo/*.txt

 
 
Не могу понять, почему явное указание расширения *.txt сводит на нет рекурсию. Задача в нахождении среди большого количества файлов тех, у которых есть определенная строка.
 
Или в таком случае используют следующее?
 
[redplanet@localhost Temp]$ grep -nri Lorem `find -name '*.txt'`
./foo/bar.txt:1:Lorem
./mytext.txt:1:Lorem
 



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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Вопрос про if вообще не понял...
Если более конкретно опишите где можно искать дату, то можно будет подумать как её распознать среди кучи строк(например, в конце строки с датой всегда есть слово "канал" и т.п.) и вставлять надо сразу в следующую строку???
 
Добавлено:

Цитата:
print time $1 FS $5;  
, а это что за ужас??? поля в записи при выводе отделяются запятыми!!! - print time $1,$5;

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:45 27-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Про if была мысль сделать типа такого:
AA=if ($4 == "канал")
BB=if ($4 == "\"ИТОГО\"")
print BB,AA
 
Строка с датой действительно содержит слово "канал", можно делать распознавание по этому слову. Вставлять значение с датой (убрав слово с днем недели) надо в следущую строку:
"09:31";"110";"28 октября"  
 "19:00";"50"  
 "23:00";"30"
"10:10";"110";"29 октября"  
 "11:00";"50"  
 "12:30";"30"

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 09:18 27-11-2011
Red Planet



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, спасибо. Про --include не знал. Заодно узнал про --exclude в man'е.  
 

Цитата:
set -x

 
Тоже возьму на заметку, может понадобиться.
 

Цитата:
--file

 
Насколько я понял, предназначен для указания файла с паттернами для поиска. Например, записываем в своем домашнем каталоге в файл patterns.txt строку  
 

Цитата:
^Prot
$from K-Pax

 
После этого делаем  
 

Код:
grep -nri --file=$HOME/patterns.txt --include=*.txt .

 
В результате получаем вывод grep, который содержит имена файлов и строк, начинающихся с "Prot" или заканчивающихся на "from K-Pax". Только если сам файл с паттернами размещать в каталоге, в котором ищем, он найдет в том числе самого себя, если его не поставить в --exclude.
 
patterns.txt
 

Цитата:
Planet
Lorem

 
В действии
 

Код:
[redplanet@localhost Temp]$ grep -nri --file=patterns.txt .
./mytext.txt~:1:Lorem
./mytext.txt~:3:Red Planet is here
./foo/untyped:1:Planet
./foo/hero.txt:1:RED PlaneT
./foo/bar.txt:1:Lorem
./mytext.txt:1:Lorem
./mytext.txt:2:Planet
./mytext.txt:3:Red Planet is here
./patterns.txt:1:Planet
./patterns.txt:2:Lorem
./no.txt:1:Red Planet
[redplanet@localhost Temp]$ grep -nri --file=patterns.txt --exclude=patterns.txt .
./mytext.txt~:1:Lorem
./mytext.txt~:3:Red Planet is here
./foo/untyped:1:Planet
./foo/hero.txt:1:RED PlaneT
./foo/bar.txt:1:Lorem
./mytext.txt:1:Lorem
./mytext.txt:2:Planet
./mytext.txt:3:Red Planet is here
./no.txt:1:Red Planet
[redplanet@localhost Temp]$

Всего записей: 215 | Зарегистр. 18-06-2009 | Отправлено: 15:32 27-11-2011 | Исправлено: Red Planet, 15:34 27-11-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Red Planet
> $from K-Pax
Что это? «$» — это конец строки. Что вы хотите найти в строке после ее конца?
 
> или заканчивающихся на "from K-Pax"
А... from K-Pax$ же!
 
> grep -nri --file=$HOME/patterns.txt --include=*.txt .
Опять не заэкранировали джокеры? Нет, я понимаю, что обнаружить в текущей директории файл соответствующий шаблону --include=*.txt сложно, но все-таки делайте все корректно всегда и сразу, а то потом долго будете искать причину какой-нибудь ошибки.
 
> только если сам файл с паттернами размещать в каталоге, в котором ищем, он найдет в том числе самого себя
Ну, конкретно в данном случае не найдет. Литерал ^Prot регэкспу ^Prot не удовлетворяет; аналогично и from K-Pax$.
 
Замечу, что если паттернов всего два и есть, то смысла читать из файла, а не указывать каждый после ключа -e, не вижу.
 
$ grep -ni -R --include='*.txt' -e '^Prot' -e 'from K-Pax$' .

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:46 27-11-2011
Red Planet



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

Цитата:
джокеры

 
Не понял.  
 

Цитата:
Замечу, что если паттернов всего два и есть, то смысла читать из файла, а не указывать каждый после ключа -e, не вижу.

 
Просто изучал --file
 
Регулярными выражениями позанимаюсь.

Всего записей: 215 | Зарегистр. 18-06-2009 | Отправлено: 20:06 27-11-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Red Planet
>> джокеры
> Не понял.
У нас разный Гугль?
 

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Я не понял нужны ли вам строки какие-то кроме содержащие ИТОГО для вывода?..
 
В общем вот как я понял ваши нужды... Думаю дальше сами сможете поправить под себя
Код:
#!/usr/bin/gawk -f
 
BEGIN {
    RS="\n";
    FS=";";
    OFS=";";
    ORS="\n";
     }
{
    if ($4 ~ "канал")
    {
        day = gensub(/^(.*)[\t ]+.*$/,"\\1\"", "g", $3);
        isDay = 1;
    }
 
    if ($1 ~ /[[:digit:]]/) {
        if ($1 == time)
            time = $1;
        else {
            time = $1;
        }
    }
    if ($4 == "\"ИТОГО\"")
            if (isDay)
            {
          print time $1, $5, day;
                isDay = 0;
            } else {
                print time $1, $5;
            }
}
А вообще вот что я вам хочу сказать: Я часто пищу странный код, но ваш мне совсем не понятен
Как это понимать?)
if ($1 == time)
            time = $1;
        else {
            time = $1;
        }

Я уже не говорю о том, что в основной секции вы не использовали операторные скобки, а в else использовали...

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:13 27-11-2011 | Исправлено: Alukardd, 23:13 27-11-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
if ($1 == time)  
             time = $1;  
         else {  
             time = $1;  
         }
Это я взял с предыдущего скрипта, эта секция выводит первую ячейку со временем. Если честно, делал почти методом тыка, пока знаний мало в этой области.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 07:20 28-11-2011
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите плиз, как в Yakuake вывести цветной текст? Например такая строка в скрипте:

Код:
echo "bla-bla-bla <-------"

 
ls выводит всё очень красочно. Значит это возможно. Пытался разобраться с bashrc, нифига не понял.
 
---
Upd:
Всё, разобрался. Вот так получилось:

Код:
echo -e '\E[37;44m'"\033[1mbla-bla-bla <-------\033[0m"

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 17:55 27-12-2011 | Исправлено: Maximus777, 20:45 27-12-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Цитата:
echo -e '\E[37;44m'"\033[1mbla-bla-bla <-------\033[0m"  
Проще вместо \033 писать \e, и вместо \E тоже следует писать \e ну или \033.
Кстати, в zsh, например, с \E и вовсе не будет работать в отличии от менее привередливого bash'а.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:56 27-12-2011 | Исправлено: Alukardd, 22:57 27-12-2011
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
Проще вместо \033 писать \e, и вместо \E тоже следует писать \e ну или \033.

Точно. Проверил, работает. Спасибо за совет.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 18:53 28-12-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я еще, вчера пока копался с escape-последовательностями, переизобрёл read -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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:02 29-12-2011 | Исправлено: Alukardd, 00:03 29-12-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> наконец-то нашёл способ делать обратный отсчёт меняя цифру в той же строке
Ну и привели бы его тут.
$ for i in {100..0}; do echo -ne "\e[0K$i\r"; sleep .1s; done; echo
— это вы имели в виду?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:26 29-12-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Я все скинул себе в пост сразу... Просто оно в тюрьме (#)
И я же сказал, что извращенец - вместо \r я тоже использовал некоторую escape-последовательность

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:34 29-12-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А кто бы подсказал простой cкрипт под такую задачу:
 
1) постоянно в цикле пингуем server.com
2) если потеряно больше 2х пакетов переименовываем:
\etc\hosts => \etc\hosts-tmp
\etc\hosts-bak => \etc\hosts
\etc\hosts-tmp => \etc\hosts-bak
3) идем в пункт 1 (но с учетом того, что ip адрес для server.com изменился)
 
Т.е. идея в том, чтобы назначать хосту server.com 2 разных IP адреса, когда один недоступен назначаем другой, и наоборот.

Всего записей: 1037 | Зарегистр. 30-05-2006 | Отправлено: 20:58 11-01-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
> А кто бы подсказал простой cкрипт
Что значит «подсказал скрипт»? В смысле дать ссылку на готовое решение? Никто такого не написал, скорее всего, а если и написал, то в жизни бы не опубликовал, поскольку сам подход кошмарен.
 
P.S. В вашей раскладке клавиатуры нет слэша (только обратный)?

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

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подсказал, в смысле нашел время написать его А почему код должен быть кошмарным?
 
P.S. Клавиатуру поменяю.

Всего записей: 1037 | Зарегистр. 30-05-2006 | Отправлено: 22:20 11-01-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
Ахаха, а не пробовали в hosts несколько записей прописать?
Код:
78.78.78.78 server.com
78.78.78.79 server.com
78.78.78.80 server.com
...
А если это ваша зона, то аналогичные настройки следует выполнить на DNS сервере.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:41 11-01-2012
gap5



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

Всего записей: 1037 | Зарегистр. 30-05-2006 | Отправлено: 01:03 12-01-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
оО
Сочувствую... Хотя не понятно как это он так... Покажите строку hosts: в файле /etc/nsswitch.conf.
 
Скрипт будет примерно такой:
Код:
#!/bin/bash
 
while true; do
  if [ $(ping -c 5 server.com | awk -F, '/received/{gsub(/received/,"",$2); gsub(/[\t ]*/,"",$2); print $2}') -le 2 ]; then
    mv /etc/hosts /tmp/hosts
    mv /etc/hosts-bak /etc/hosts
    mv /tmp/hosts /etc/hosts-bak
  fi  
  sleep 5s
done
 
Посылает 5 пакетов, если пришло 2 или меньше, то меняет файл hosts. Между проверками 5сек поспать...

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 02:05 12-01-2012
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
 
passwd:         compat
group:          compat
shadow:         compat
 
hosts:          files dns
networks:       files
 
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
 
netgroup:       nis

Всего записей: 1037 | Зарегистр. 30-05-2006 | Отправлено: 11:09 12-01-2012
Hatiko

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

Всего записей: 1 | Зарегистр. 12-01-2012 | Отправлено: 11:52 12-01-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
Я же только одну строку попросил...
 
Скрипт вас устроил?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:16 13-01-2012
gap5



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

Всего записей: 1037 | Зарегистр. 30-05-2006 | Отправлено: 11:13 13-01-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите как можно красиво (ASCII art) вывести данные в виде таблицы в терминал?
Как вариант рассматривается занести данные в OpenOffice. Хотелось бы увидеть таблицы calc в эмуляторе терминала так же выглядящие.
Можно и без OOo, если есть удобные способы. В "ячейке" может быть несколько строк. Таблица только с 5 строками и кучей столбцов.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:09 13-01-2012
sCloudo

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

Всего записей: 206 | Зарегистр. 06-01-2012 | Отправлено: 20:18 13-01-2012
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:47 14-01-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> как можно красиво (ASCII art) вывести данные в виде таблицы в терминал?
> В "ячейке" может быть несколько строк.
> такое я и сам могу навоять
> Я надеялся, что есть готовые решения, проверенные годами...
Может быть и есть, но мне на глаза как-то не попадались.
А наваять попробовать можно. Если число столбцов и строк в пределах постоянно, то принципиальных сложностей я не вижу.
 
Вот, как вам, например, такой вариант:

Код:
#!/usr/bin/perl
 
use Text::CSV;
use Switch;
 
binmode (STDOUT, ":encoding(utf8)");
 
%BOX = (
    'L,T' => "\x{250C}",
    'L,M' => "\x{251C}",
    'L,B' => "\x{2514}",
    'M,T' => "\x{252C}",
    'M,M' => "\x{253C}",
    'M,B' => "\x{2534}",
    'R,T' => "\x{2510}",
    'R,M' => "\x{2524}",
    'R,B' => "\x{2518}",
    'H'   => "\x{2500}",
    'V'   => "\x{2502}"
);;
 
open (my $csvfile, '<:encoding(utf8)', $ARGV[0]);
my $csv = Text::CSV -> new ({ binary => 1, eol => $/ });
while (my $row = $csv -> getline ($csvfile)) {
    my @ROW;
    for my $f (0 .. @$row-1) {
        push @ROW, [ split ("\n", @$row[$f]) ];
        for my $l (0 .. $#ROW) {
            $WIDTH[$f] = length ($ROW[$f][$l]) if $WIDTH[$f] < length ($ROW[$f][$l]);
        }
    }
    push @T, [@ROW];
}
close ($csvfile);
for my $i ( 0 .. 2*($#T+1) ) {
    switch ($i) {
        case 0 { $TMB = 'T' }
        case (2*($#T+1)) { $TMB = 'B' }
        else { $TMB = 'M' }
    }
    if ($i % 2 == 0) {
        for my $j ( 0 .. 2*($#WIDTH+1) ) {
            switch ($j) {
               case 0 { $LMR = 'L' }
               case (2*($#WIDTH+1)) { $LMR = 'R' }
               else { $LMR = 'M' }
            }
            if ($j % 2 == 0) {
               print $BOX{"$LMR,$TMB"};
            } else {
               $f = ($j-1)/2;
               print $BOX{'H'} x $WIDTH[$f];
            }
        }
        print "\n";
    } else {
        my $r = ($i-1)/2;
        my $l = 0;
        my $continue = 1;
        while ($continue) {
            $continue = 0;
            for my $j ( 0 .. 2*($#WIDTH+1) ) {
               if ($j % 2 == 0) {
                   print $BOX{'V'};
               } else {
                   my $f = ($j-1)/2;
                   printf ("%-$WIDTH[$f]s", $T[$r][$f][$l]);
                   $continue = 1 if $T[$r][$f][$l+1];
               }
            }
            $l++;
            print "\n";
        }
    }
}

 
Выводит таблицу, сохраненную Либрофисом в CSV с дефолтными настройками вот в таком виде:
   
 
Новая строка между именем и фамилией здесь задана жестко.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:22 19-01-2012 | Исправлено: ASE_DAG, 03:27 19-01-2012
vitalik36

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

Всего записей: 3 | Зарегистр. 18-01-2012 | Отправлено: 03:47 19-01-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vitalik36
> ычфчы
Будьте здоровы!

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:51 19-01-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые Гуру! Подскажите плиз, в bash-скрипте используется функция printf, в выводе есть дробные числа. Выводятся они с разделителем - запятой. Надо, чтоб была точка вместо запятой. Как это можно организовать?
 

Код:
printf "%02d:%02d:%06.3f\n" 30 30 300

 
Вывод = 30:30:300,000
Требуется 30:30:300.000
 
Желательно глобально, а не с помощью sed'а в каждой строке.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 20:44 19-01-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Десятичный разделитель — свойство локали, т.е. определяется переменной LC_NUMERIC (или более широко — LC_ALL; причем LC_ALL приоритетней). Точка — дес. разделитель, в частности, в позиксной локали (C). Т.о.
$ LC_NUMERIC=C
$ printf "%02d:%02d:%06.3f\n" 30 30 300  
30:30:300.000

 
P. S. Вам это, если не секрет, зачем?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:21 19-01-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ух ты! Работает! Вообще-то это не мне, на kubuntu.ru задали вопрос, а мне интересно стало найти решение. Спасибо огромное. Я догадывался, что как-то так, глобально должно решаться, но с наскока решение не нашёл.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:25 19-01-2012 | Исправлено: Maximus777, 23:30 19-01-2012
o_l_i_ve_r_89

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В програме написаной на С# использую подключение по SSH к серверу, при выполнении функции: RunCommand(tcpdump -s 0 host IPadress -w file.cap &), программа дальше не выполняется, а зависает та как ждет пока нажмется Enter. Подскажите пожалуйста кто что знает по этому поводу.........

Всего записей: 2 | Зарегистр. 20-01-2012 | Отправлено: 16:58 20-01-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
o_l_i_ve_r_89
А причем тут вопрос в этой теме? Это вопрос по шарпам, по функции RunCommand...
tcpdump кроме параметров ни чего не требует. Кстати я не припомню, что бы хоть где-то он у меня запустился без указанного интерфейса (-i eth0, например).

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:56 21-01-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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:23 25-01-2012
CrownRU



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

Цитата:
Ports aktiv      :  16           (ifAdmin: up    ifOper: up)   ==> 33 percent used
-----------------------------------------------------------------------------------------
Device           :  rzsw2k157-l.rz.dom.dd.com
Ports admin down :  0            (ifAdmin: down)
Ports inaktiv    :  36           (ifAdmin: up    ifOper: down) ==> 75 percent unused
 
Ports aktiv      :  12           (ifAdmin: up    ifOper: up)   ==> 25 percent used
 
Host                                 Index  Bezeichnung/Kommentar                                    Admin Oper
===============================================================================================================
 
Begin device :   6.216.138.132 rzsw140.rz.finanzit.sko.de
rzsw140.rz.dom.dd.com.........  10129  GigabitEthernet1/0/1 ### to sw177 gig 0/44 OE42x Him_Te  up..  up..
rzsw140.rz.dom.dd.com.........  10130  GigabitEthernet1/0/2...................................  down  down
rzsw140.rz.dom.dd.com.........  10131  GigabitEthernet1/0/3...................................  down  down
rzsw140.rz.dom.dd.com.........  10132  GigabitEthernet1/0/4...................................  down  down
rzsw140.rz.dom.dd.com.........  10133  GigabitEthernet1/0/5 ### to rzswh1320 gig 1/0/24 - 6.21  up..  up..
rzsw140.rz.dom.dd.com.........  10134  GigabitEthernet1/0/6...................................  up..  up..
Begin device :   6.218.119.240 v-encl11-swb.mgmt.finanzit.sko.de
v-encl11-swb.mgm.dom.dd.com..  1....  port1..................................................  up..  up..
v-encl11-swb.mgm.dom.dd.com..  2....  port2..................................................  up..  up..
v-encl11-swb.mgm.dom.dd.com..  3....  port3..................................................  up..  up..
v-encl11-swb.mgm.dom.dd.com..  4....  port4..................................................  up..  up..
v-encl11-swb.mgm.dom.dd.com..  5....  port5..................................................  up..  down
rzsw140.rz.dom.dd.com.........  10149  GigabitEthernet1/0/21 ### RZ2-RZ1 Port-Channel 1 ###...  down  down
rzsw140.rz.dom.dd.com.........  10150  GigabitEthernet1/0/22 ### RZ2-RZ1 Port-Channel 1 ###...  down  down
rzsw140.rz.dom.dd.com.........  10151  GigabitEthernet1/0/23 ### to rzsw2k157-f gig 1/0/4 ###.  down  down
rzsw140.rz.dom.dd.com.........  10152  GigabitEthernet1/0/24 to rzsw2k157-a gig 0/46..........  down  down
 
 

 
Нужно привести это хозяйство к excel-угодному стилю для импорта. Такого вида (Servername Port(s) Status):

Цитата:
rzsw140.rz.dom.dd.com 1/0/24 down  down
v-encl11-swb.dom.dd.com 5 up down

 
Я написал вот такую змею:
Сперва удаляю точки, одиночные не трогаем, а потом идет сортировка и раздел по столбцам.
 
Код:
awk '/^rzsw/{feld1=$1; gsub("[.][.]+","",feld1); feld3=$3; gsub("[A-Za-z]+","",feld3); gsub("[.][.]+","",feld3); feld4=$(NF-1);gsub("[.][.]+","",feld4); feld5=$NF;gsub("[.][.]+","",feld5); printf("%28s\t%4s\t%4s %4s\n",feld1,feld3,feld4,feld5)}' inputfile

 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 15:55 03-02-2012 | Исправлено: CrownRU, 15:58 03-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Если хотите в Excel удобоваримый то лучше в csv с разделителем ";". Так что вот как это выглядит:
Код:
#!/usr/bin/gawk -f
/^rzsw/{
    gsub(/\.*[\t ]|\.*$/," ");
    gsub(/[[:alpha:]]/,"",$3);
    print $1";"$3";"$(NF-1)";"$NF;
}
/^v-enc/{
    gsub(/\.*[\t ]|\.*$/," ");
    print $1";"$2";"$(NF-1)";"$NF;
}


----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:23 03-02-2012
CrownRU



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

Код:
gsub(/\.*[\t ]|\.*$/," ");  
-вот тут только не совсем понял - удаляем точки вместе с табами и точки? Почему тогда одиночные остаются? С sed я так написал
Код:
sed "s/\.\{2,\}//g"
, а тут чегой-то недопер...

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 17:00 03-02-2012 | Исправлено: CrownRU, 17:45 03-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRUКстати лучше так написать
Цитата:
gsub(/\.+[\t ]+|\.+$/," ");

да и тут не красиво вышло( я не смог в [] поместить $
А читается это просто: во всей строке находим последовательность точек от одной и более после которой есть хотя бы один таб или пробел и заменяем всё это добро на один единственный пробел (нужен для дальнейшей работы скрипта)
 
Добавлено:
А пиво завози
Я в Питере живу
 
p.s. а по элегантности у нас тут есть специалист - т. 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:52 03-02-2012 | Исправлено: Alukardd, 17:56 03-02-2012
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Т.е. по идее можно заменить на
Код:
gsub(/\.*[:blank:]/," ")
?

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 18:04 03-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
да, только используйте второй вариант (gsub(/\.+[[:blank:]]+|\.+$/," "); ), он более точный.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:32 03-02-2012
Weinaum



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

Код:
BACKUPFILE=/home/путь_к_дампу_бд/dumps/db_`date "+%y%m%d_%H%M"`.sql.gz
mysqldump -u user1 -ppassword1 dbase1 -h host1 | gzip > ${BACKUPFILE}
/bin/gunzip < ${BACKUPFILE} | /usr/bin/mysql -u user2 -ppassword2 dbase2 -h host2
a=$(ls -ltr /home/путь_к_дампу_бд/dumps|wc -l);cd /home/путь_к_дампу_бд/dumps; rm $(ls -rt1 .|head -$(($a-4)))
 

Последняя строка тут не так важна, просто удаляю лишние дампы, оставляя только 3 последние.
 
Для определенных целей в большинстве случаев меня все устраивает.
Вот только понадобилось в одном конкретном случае перед восстановлением базы внести в нее некоторые изменения, а именно найти все вхождения одной строки и всё заменить на другую.
Все таки тут не очень силен, смог дотумкать только с вариантом без сжатия, и то возможно что несколько коряво....

Код:
BACKUPFILE=/home/путь_к_дампу_бд/dumps/db_`date "+%y%m%d_%H%M"`.sql
mysqldump -u user1 -ppassword1 dbase1 -h host1 > ${BACKUPFILE}
find /home/путь_к_дампу_бд/dumps -name "*.sql" -print0 | xargs -0 sed -i -e "s/archive\/index.html/http:\/\/mydomain.com\/archive\/index.html/g"
/usr/bin/mysql -u user2 -ppassword2 dbase2 -h host2 < ${BACKUPFILE}
a=$(ls -ltr /home/путь_к_дампу_бд/dumps|wc -l);cd /home/путь_к_дампу_бд/dumps; rm $(ls -rt1 .|head -$(($a-4)))
 

т.е. заменяю все строки archive/index.html на http://mydomain.com/archive/index.html
 
В общем, тут не очень нравится, во-первых, что дампы сохраняются без сжатия, а как осуществить поиск "на лету", что то не пойму, т.е. сначала осуществить поиск с заменой, после замены упаковать и далее по плану.
И во-вторых, после осуществления замены, несмотря на внешнюю видимость того, что сайт и бд в полном порядке, при попытке просмотреть изменения с phpmyadmin, начинает  из этого  phpmyadmin выбрасывать, с надписью, что время сессии истекло, хотя конечно же это не так..И эти выбросы только при попытке редактирования той таблицы и того конкретного поля, где были эти изменения...Т.е. ощущения, что все таки что то нарушается при такой замене, либо это почему то глючит phpmyadmin....

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 21:54 08-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
Я плохо с mysql знаком - дамп внутри архива будет одним sql файлом? Если да, то такой файл можно обработать не распаковывая вручную. Вот команда
Код:
vim -c '%s/archiev\/index\.html/http:\/\/mydomain.com\/archiev\/index.html\//g' -c 'wq!' ${BACKUPFILE}
слава великому ViM'у.
 
Если внутри архива много файлов, то ViM его не съест. В таком случае проводите все действия с несжатой копией - какая вам-то разница? И после импорта дампа уже сжимайте - результат тотже - работать даже будет быстрее чем ваш первый вариант - вы там впустую пережимаете 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:09 09-02-2012
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
спасибо, да, внутри архива один файл, попробую, отпишусь.

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 02:59 09-02-2012
Weinaum



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

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 14:37 09-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
в первой секции (там где описываете ЧТО заменять) всегда лучше экранировать точки, т.к. в противном случае точка будет рассмотрена как "любой символ".
про слэш - да эт я случайно)
 
p.s. так я не понял - а где "Слава великому ViM!!!"??? Отдельное сообщение для этого писать не надо

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:05 09-02-2012
Weinaum



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

Цитата:
в первой секции (там где описываете ЧТО заменять) всегда лучше экранировать точки, т.к. в противном случае точка будет рассмотрена как "любой символ".  

понял, буду знать, спасибо

Цитата:
p.s. так я не понял - а где "Слава великому ViM!!!"??? Отдельное сообщение для этого писать не надо

я с величайшим только начал знакомство, пару недель назад не знал, как файл сохранить-закрыть ))))
за это время столько нового узнал, что не только отдельное сообщение, отдельную тему себе в закладки положил )))))

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 23:34 09-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
Цитата:
только начал знакомств
Для начинающего есть на мой взгляд очень хорошая книга.
Ну и темой на нашем любимом форуме ViM не обделён.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:56 09-02-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
for /f "delims=" %%e in ('wget -q ^"http://rutracker.org/forum/viewtopic.php^?t^=3908777^" -O -^| awk -v RS^="\r\n" -v ORS^=" " "{print( $0 );}"') do echo %%e
 
Это винда, направляю выход wget

Код:
wget -q "http://rutracker.org/forum/viewtopic.php?t=3908777"

на awk, чтоб он склеил в одну строку всю страницу,

Код:
awk -v RS="\r\n" -v ORS=" " "{print( $0 );}"

 но он не клеит, выдаёт по строчкам, что не так?

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 12:55 10-02-2012
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, king_stiven
По строчкам разбивает уже echo.
Т.е при Вашей конструкции правильнее будет не (echo %%e), а (set "text=!text!%%e"). Разумеется с setlocal enabledelayedexpansion
П.С А из-за чего Вы не можете обработать после закачки? Нужно именно по строкам? (проверить не могу)
wget  "http://rutracker.org/forum/viewtopic.php?t=3908777" | awk -v RS="\r\n" -v ORS=" " "{print( $0 );}"

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 13:42 10-02-2012 | Исправлено: Alex_Piggy, 13:43 10-02-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, Alex_Piggy
Нет, некоторые страницы интернета правильно выводятся, склеиваются  awk в одну строку. А вот эта никак не выводится.

Цитата:
из-за чего Вы не можете обработать после закачки?  

Там идут строки типа:
                                      ...
11111111111111111111111111111111111111111111111111
11111111111111111начало нужного текста2222222222222
22222222222222222222222222222222222222222222222222
22222222222222222конец нужного текста
11111111111111
11111111111111111111111111111111111111111111111111
                                      ...
 
или может быть:
                                      ...
11111111111111111111111111111111111111111111111111
1начало нужного текста22222222222222конец нужного текста1111
11111111111111111111111111111111111111111111111111
                                      ...
 
Мне нужно вывести в одну строку:
начало нужного текста222222222222222222222222222222222222222222222конец нужного текста
Причём построчный разбор sed ом очень долгий, желательно awk ом склеить все строки в одну строку,  
11111111111111111начало нужного текста222222222222222222222222222222конец нужного текста1111111111
а затем sed ом выцеплять.
 
Добавлено:

Код:
sed -n "/начало нужного текста/,/конец нужного текста/p"

пока так сделал, направил wget не на awk а на sed, но будет ли всегда корректно овыходить, не знаю.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 14:45 10-02-2012 | Исправлено: king_stiven, 15:34 10-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
> склеил в одну строку всю страницу
А зачем вам это сдалось, если не секрет?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:53 10-02-2012
king_stiven

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

Цитата:
А зачем вам это сдалось, если не секрет?

Элементарно, выцеплять нужную инфу со страниц в базу.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:00 10-02-2012
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
king_stiven
Многострочный поиск/замена в sed - это беда.
Сейчас проблема в -v RS="\r\n". На стороне сайта, похоже, только \n. Попробуйте -v RS="\r\n|\n"
И мне кажется, что for совсем-совсем лишний...:
wget  "http://rutracker.org/forum/viewtopic.php?t=3908777"  -O- |awk -v RS="\r\n|\n" -v ORS=" " "{print( $0 );}" | sed -e "s|Начало нужного текста|\r\n\0|g" -e"s|Конец нужного текста|\0\r\n|g" 1.txt | sed -n -e"\|Начало нужного текста|p" > data.txt

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 16:13 10-02-2012 | Исправлено: Alex_Piggy, 16:29 10-02-2012
king_stiven

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

Цитата:
> data.txt

Не годится.
 
Добавлено:

Код:
wget  "http://rutracker.org/forum/viewtopic.php?t=3908777"  -O- |awk -v RS="\r\n|\n" -v ORS=" " "{print( $0 );}"

Кажется то, что надо, пример сработал, спасибо.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 17:05 10-02-2012 | Исправлено: king_stiven, 17:05 10-02-2012
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а вот и sed заработал на склейку строк
sed -e :a -e "/$/N; s/\n/ /; ta"

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 20:51 10-02-2012 | Исправлено: king_stiven, 20:52 10-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос
Weinaum
А решение всё также просто и красиво
Код:
awk '/index\.html/ && /main\.html/ && uniq[$0]==0{print;uniq[$0]=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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:19 10-02-2012
Weinaum



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

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 03:34 11-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
> одно из заданных слов
Ну вот И на ИЛИ никак, да, не заменить? ;-)
 
$ awk '(/index\.html/ || /main\.html/) && uniq[$0]==0{print;uniq[$0]=1}' /исходный/файл > /выходной/файл
 
> тогда может получиться, что появится достаточное количество строк, в которых есть и первое и второе слово, такие то строки и будут дублироваться
С какого перепугу? Дубли будут найдены, если они есть изначально. Если дублей в исходном файле нет, то и задаче по их устранению не стоит
 
$ awk '/index\.html/ || /main\.html/' /исходный/файл > /выходной/файл
— и все.
 
Еще более разумно, по идее, использовать только один регэксп:
 
$ awk '/(main|index)\.html/' /исходный/файл > /выходной/файл

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Еще более разумно
я-то уж точно не сомневался, что Ваши выражения красивее моих...
А вот что можно {print} не писать (так же как в 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.

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



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

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 14:03 11-02-2012
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:28 11-02-2012
Weinaum



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

Цитата:
Надеюсь вы наложили последний пример т.ASE_DAG на код с uniq?.. И теперь все не просто работает, а еще и красиво выглядит

безусловно

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 15:00 11-02-2012
Weinaum



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

Цитата:
vim -c '%s/archiv\/index\.html/http:\/\/mydomain.com\/archiv\/index.html\//g' -c 'wq!' ${BACKUPFILE}  

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

Код:
src=\"archiv\

 
надо после замены получить

Код:
src=\"http:\/\/mysite.net\/archiv\

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

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 15:51 16-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
В таких случаях пользуйтесь тем, что в большинстве реализаций синтаксис s и подобных ему операторов позволяет использовать любой символ в роли разделителя, а не только /.
 
$ perl -i -np -e 's|(?<=src=\\")archiv|http:\\/\\/mysite.net\\/archiv|' ${BACKUPFILE}
 
Если не понятно, то поясняю, что в том случае, когда экранирующих черт в исходном потоке нет это выглядело бы так:
$ perl -i -np -e 's|(?<=src=")archiv|http://mysite.net/archiv|' ${BACKUPFILE}
 
P.S. g добавьте обратно, если она здесь таки нужна.

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
Есть вопросик про демоны и ключики некторых приложений -D
Вот есть Snort, который принимет трафик из stdin

Код:
 
trafr -s | snort -r -
 

И snort начинает принимать трафик.
 
Теперь я пробую запустить snort как daemon

Код:
 
trafr -s | snort -D -r -
 

И моя связка перестаёт работать.
 
Есть ли возможность приложение, в моём случае trafr запустить как daemon что бы он продолжал отдавать трафик snort ?
 
Спасибо.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 20:43 16-02-2012 | Исправлено: slech, 20:44 16-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
> Snort, который принимет трафик из stdin
> пробую запустить snort как daemon
> связка перестаёт работать
Предельно логично. Демон от обычного процесса отличается в т.ч. и тем, что стандартные потоки у него перекрыты.
 

Цитата:
@Elemir: Читатель, а ты знаешь какой-нибудь верный способ стать демоном? Какие минусы?
@proton: надо форкнуться и убиться
@dk: daemon(). Из минусов: закрываются stdin, stdout и stderr

 
;-)
 
> Есть ли возможность
Обрисуйте задачу, которая перед вами стоит.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:58 16-02-2012 | Исправлено: ASE_DAG, 23:10 16-02-2012
Weinaum



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

Код:
src=\\\"archiv
src=\\\"http:\\/\\/panofactory.net

 
В общем, тут еще те заморочки. Ну хорошо, от первой части допустим можно избавиться, т.е. от src=\\\,  
но от кавычек никак, поскольку в дампе есть строки с вхождением archiv , без кавычек, которые нельзя ессно менять. А вот строки с вхождением "archiv - с кавычками, только те, что нужно изменять.  
Решил я все таки попытаться остаться с вимом.
Остальное у меня получилось вот так:

Код:
vim -c '%s/"archiv/"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' -c 'wq!' /home/dumps/db_120216.sql

причем эта конструкция срабатывает нормально при прямом указании файла дампа.
 
Однако, у меня все это дело завязано в скрипт, вим работает с архивом, и вот в случае скрипта - он теперь вот такой -
Код:
BACKUPFILE=/home/путь_к_дампу_бд/dumps/db_`date "+%y%m%d_%H%M"`.sql.gz
mysqldump -u user1 -ppassword1 dbase1 -h host1 | gzip > ${BACKUPFILE}
vim -c '%s/"archiv/"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' ${BACKUPFILE}
/bin/gunzip < ${BACKUPFILE} | /usr/bin/mysql -u user2 -ppassword2 dbase2 -h host2
a=$(ls -ltr /home/путь_к_дампу_бд/dumps|wc -l);cd /home/путь_к_дампу_бд/dumps; rm $(ls -rt1 .|head -$(($a-4)))  

получается косяк, что вим продолжает что то делать уже после того, как данная строчка -  
vim -c '%s/"archiv/"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' ${BACKUPFILE} -  
была отработана. Видимо, дело в кавычках, поскольку в случае, когда в строке поменьше слешей и нет совсем кавычек, скрипт работает без проблем....
Кавычки эти тоже пытался экранировать, но в том то и дело, что без скрипта, одной командой, все работает и без экранирования кавычек, а со скриптом и с экранированием не идет...
Где то я косячу, не пойму где...

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 23:03 16-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
зачем же сразу на чистый perl переходить?)
 
Weinaum
Я собственно не понял в чём проблема-то? Экраниируйте всё что душе угодно...
vim -c '%s/\(src=\\"\)archive\\/\1http:\\\/\\\/mydomain.com\\\/archive\\/g' -c 'wq!' ${BACKUPFILE}
Часть регулярки с src="\ и последний \ можно вообще убрать из обихода, оставил для полноты картины, т.к. пример привели вы с ними...
 
Добавлено:

Цитата:
-c 'wq!
а эту часть команды вы где в скрипте потеряли? оО Или вы думаете это для красоты?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:15 16-02-2012
Weinaum



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

Цитата:
-c 'wq!
а эту часть команды вы где в скрипте потеряли? оО Или вы думаете это для красоты?

...а я всю голову сломал..(посыпая ее самую пеплом...)

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 23:42 16-02-2012
slech



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

Цитата:
Обрисуйте задачу, которая перед вами стоит.

Mikrotik Router OS / RouterBoard and Snort IDS/IPS
Краснненьким я выделил свою проблему.
Задача настроить связку Mikrotik + Snort.
 
Вижу 2 варианта:
1. Решить задачу текущим способом, может производители trafr чем-то смогут помочь - написал в support.
2. Поидее можно стартануть Snort обычным способом, пускай слушает eth0 и ловит пакеты в promiscuous mode - всё равно нужный трафик я направил на этот сервер и Snort его должен увидеть.
Хотел избежать этого и ловить только нужный поток.
 
Добавлено:

Цитата:
@dk: daemon(). Из минусов: закрываются stdin, stdout и stderr

Т.е. это в принципе невозможно ?

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 12:08 17-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
Прочитал. Не вполне понял, честно говоря, какую задачу выполняет здесь trafr и что это такое вообще (никогда раньше о нем не слышал) — если не лень, расскажите или дайте полезную ссылку. Но к делу это не относится.
 
Важно, что непонятно иное — зачем вам запускать snort как демон? Ну т.е., допустим, запустите вы его демоном, заставите принимать трафик из потока, формируемого trafr’ом (ничего невозможного тут нет, можно воспользоваться, например, именованным каналом (FIFO)) — дальше-то что? Trafr же, как я понял, запускаться демоном не умеет. Итого у вас один из работающих в связке процессов запущен демоном, а второй — обычным процессом. Какой в этом смысл?
 
Так что народную мудрость «лучшее — враг хорошего» и не морочьте себе голову — используйте так, как есть. :-) GNU Screen в помощь. Если нужен инит-скрипт для всего этого безобразия, то посмотрите как он реализован для rtorrent’a, последний вообще интерактивное приложение на ncurses’ах — и ничего, работает не хуже демона.

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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Есть рутер Mikrotik
На нём установлен пакет calea
calea формирует поток необходимого мне трафика и шлёт всё это добро куда я говорю - данном случае на мой сервер с установленным Snort.
 
Поток этот можно принимать утилиткой под именем trafr(написааной ребятами из Mikrotik) и далее по stdiout на другое приложение, в моём случае на snort.
 
Разработчики trafr посоветовали мне:

Цитата:
 
attach trafr to screen:
screen -dmS mytrafr ./trafr
 
list all attached apps:
screen -list
 
connect to screen
screen -r
 

 
Т.е. то что посоветовали и вы.
Сначала потестирую как оно в обычном режиме, позже может доберусь и до screen.
 
Спасибо за помощь.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 18:07 17-02-2012
Weinaum



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

Код:
#!/bin/sh
 
BACKUPFILE=/home/путь_к_дампу_бд/dumps/db_`date "+%y%m%d_%H%M"`.sql.gz  
mysqldump -u user1 -ppassword1 dbase1 -h host1 | gzip > ${BACKUPFILE}  
vim -c '%s/\"archiv/\"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' -c 'wq!' ${BACKUPFILE}
/bin/gunzip < ${BACKUPFILE} | /usr/bin/mysql -u user2 -ppassword2 dbase2 -h host2
a=$(ls -ltr /home/путь_к_дампу_бд/dumps|wc -l);cd /home/путь_к_дампу_бд/dumps; rm $(ls -rt1 .|head -$(($a-4)))    

в принципе, может, от того что я его несколько раз почти подряд запускал, поскольку тестировал...
Да, и последнее,  
вот эта строчка с vim-
vim -c '%s/\"archiv/\"http:\\\\\/\\\\\/mysite.net\\\\\/archiv/g' -c 'wq!' ${BACKUPFILE}
что тут не хватает в случае консольного vim-a под windows?
Под cygwin-ом работает но только с незапакованным файлом.
Без cygwin не работает никак
Под юникс сейчас проблем нет никаких.
Еще раз спасибо за помощь и науку.

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 19:38 17-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
Про windows боюсь что-либо сказать...
Меняйте такого хостера к чёртовой матери - что за бред блокировать чужие процессы - я бы еще и п**шь поднял... Если не хочет что бы вы лишнего ели, то пускай ограничивает ресурсы, а не стопит процессы! Все эти операции будут жрать много процессорного времени, оперативки им много не надо, хотя это зависит от размера дампа. Vim, конечно не самое экономичное решение, но не думаю что он отъедает больше чем gzip.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:18 17-02-2012 | Исправлено: Alukardd, 21:18 17-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Vim, конечно не самое экономичное решение, но не думаю что он отъедает больше чем gzip.
Определенно больше. Гнузип не грузит весь дамп в память, а работает «на лету». А Вим грузит.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:30 17-02-2012 | Исправлено: ASE_DAG, 21:31 17-02-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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:00 17-02-2012
Weinaum



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

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 01:19 18-02-2012
slech



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста как можно округлить результат умножения $5/1024/1024 ?
Там появляется иногда 22.4533, хоется видеть не более 2-ух цифр после запятой:
 

Код:
 
awk '{print $1"-"$3 " " $5/1024/1024}' speed-test-report-`date +"%m-%Y"`.txt | sed ....
 


Код:
 
2012-02-18 - 13:36:59 - 23544026.45 bit/s
2012-02-18 - 14:10:20 - 22341659.30 bit/s
2012-02-18 - 14:14:13 - 17951621.12 bit/s
2012-02-18 - 14:50:50 - 20887633.92 bit/s
 

 
Спасибо.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 17:00 18-02-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
Вывод с заданной точностью (как и все, что относится к выводу) во си-подобных языках — задача функции printf().
 
$ gawk 'BEGIN{ printf ("%.2f\n", 1/3) }'
0.33

 
А если хотите задать формат вывода чисел, который будет использоваться функцией print(), то это делается переменной OFMT.

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

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



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

Код:
awk '{printf "%s%s %.2f\n", $1"-", $3, $5/1024/1024}' speed-test-report-`date +"%m-%Y"`.txt
#
# echo 2012-02-18 - 14:50:50 - 20887633.92 bit/s | awk '{printf "%s%s %.2f\n", $1"-", $3, $5/1024/1024}'

 
По поводу OFMT
 
вот так работает как нужно:

Код:
awk  'BEGIN{OFMT="%.2f"; print 12.3456789012 }'

а вот так не хочет

Код:
echo 12.3456789012 | awk  'BEGIN{OFMT="%.2f"; print $1 }'

Находил упоминание о том что $1 это строка, а не число.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 21:04 18-02-2012 | Исправлено: slech, 21:07 18-02-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
так фигли вы print $1 в BEGIN за толкали - он на вход ни чего не получает К тому же awk сам не догадается, что это число... Поэтому должно так:
echo "12.3456789012" | gawk 'BEGIN{OFMT="%.2f"}{print $1+0}'
Возможно т.ASE_DAG расскажет покрасивше что-нить... А вообще юзайте лучше printf

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:12 18-02-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите решить следующую задачу. Есть куча файлов, из разных папок, надо их скопировать на виндовую шару. Как скопировать я знаю, мне хотелось бы видеть процесс в динамике. Идеально организовать это так, как это делает тот же Krusader. Жмакаем "копировать", появляется уведомление с прогрессбаром и сам Krusader можно закрывать. Вот такой же функционал, но только через bash-скрипт, можно организовать?

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 12:57 05-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
$ man kioclient
 
$ kioclient --commands # или сразу так

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

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Спасибо. Попробую. Странно, когда рыл сеть, не натыкался на эту прогу. И ман у неё, надо заметить, весьма куцый. Хотя там для меня всего одной команды должно хватить - cp откуда куда. И вроде обещают наглядность.
 
Upd
Ииииииаааахуууу! Это оно!

Код:
kioclient cp failo.ext smb://192.168.1.25/Рабочий\ стол/

И над треем стандартное уведомление с прогрессбаром. Крастотища!

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:15 05-03-2012 | Исправлено: Maximus777, 08:24 06-03-2012
slech



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

Код:
 
ProjectName=test
ProjectBkDir="$ProjectName-`date +"%Y.%m.%d"`"
#
lastn=$(find -maxdepth 1 -type d -name "*$ProjectBkDir*" -print | sed -e "s/\.\/$ProjectBkDir"_"//" | sort  -nuibr | head -n 1)
nextn=$(echo lastn+1 | bc)
echo $nextn
 

Можно ли получить nextn одной строкой вместо 2-ух ?
 
Спасибо.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 15:45 15-03-2012 | Исправлено: slech, 15:46 15-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
1. Вы это сюда по памяти набирали что-ли?
> sort  -nuibr
sort: options `-in' are incompatible
 
> echo lastn+1 | bc
$lastn
 
2. Допустим, что эти опечатки исправлены — никаких двух строк на выходе нет.
$ echo $nextn
4

 
3. А вообще, это у вас жесть какая-то. nextn=$(echo lastn+1 | bc) — в особенности.
 

Код:
#!/bin/bash
ProjectName="test"
ProjectBkDir="$ProjectName-$(date "+%Y.%m.%d")"
for f in "$ProjectBkDir"*; do # добавьте «*» в начало, если она там таки нужна
    n=${f##*_} # номер, надеюсь, подчеркивания не содержит
    ((lastn < n)) && lastn=$n
done
echo $((lastn+1))



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:33 15-03-2012 | Исправлено: ASE_DAG, 18:36 15-03-2012
slech



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

Цитата:
1. Вы это сюда по памяти набирали что-ли?  


Цитата:
> sort  -nuibr
sort: options `-in' are incompatible


Код:
 
-i, --ignore-nonprinting    consider only printable characters
-n, --numeric-sort          compare according to string numerical value
 

вроде всё совместимо. в справке не нашёл упоминания о несовместимости этих опций.
 

Цитата:
> echo lastn+1 | bc

из текстового файлика. в скрипте нет такой ошибочки.

Цитата:
2. Допустим, что эти опечатки исправлены — никаких двух строк на выходе нет.  


Код:
lastn=$(find -maxdepth 1 -type d -name "*$ProjectBkDir*" -print | sed -e "s/\.\/$ProjectBkDir"_"//" | sort  -nuibr | head -n 1)
nextn=$(echo $lastn+1 | bc)  
 

вот тут 2 строки сейчас используются. сначала получаем lastn а затем увеличиваем его на 1 и получаем nextn.  
Вот об этом я и спрашивал, а можно ли в одну строку эти два действия выполнить ?
 

Цитата:
3. А вообще, это у вас жесть какая-то. nextn=$(echo lastn+1 | bc) — в особенности.  

А в чём жесть ?
Навреное в этом ?

Код:
 
echo $((lastn+1))
 

Буду обходиться без bc.
 
Спасибо за ваш вариант вырешения вопроса, буду разбираться как она работает.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 19:06 15-03-2012 | Исправлено: slech, 19:07 15-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
${f##*_}
ух... полезно иногда man bash перечитывать...
slech
Цитата:
А в чём жесть ?  
жесть в find + sed + sort + head...

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 19:09 15-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос
comerun
Во первых в  выражении grep стоит использовать кавычки одинарные, а вообще grep перед awk совсем не нужен. AWK и без того вумный язык.
Во вторых, второй сайт отдаёт 2 ответа на поиск hiiden поля, по сему надо бы взять только один.
И того на выходе получаем следующее
Код:
#!/bin/bash
 
URL1="https://www.voipdiscount.com/login/"
URL2="https://www.voipdiscount.com/recent_calls/"
HIDDEN=$(curl -s -k -c /tmp/cookie.txt "$URL1" | awk -F\" '/input.*hidden/{print $6"="$8}')
curl -s -b /tmp/cookie.txt -c /tmp/cookienew.txt --data "login[username]=provider21&login[password]=sev94kam55tar89rau88&$HIDDEN" "$URL1" > /dev/null
curl -s -b /tmp/cookienew.txt "$URL2" | grep "Remaining credit:" | awk -F\< '{print $3}' | awk -F" " '{print $3}'  
 
URL1="https://www.sipdiscount.com/login/"
URL2="https://www.sipdiscount.com/recent_calls/"
HIDDEN=$(curl -s -k -c /tmp/cookie.txt "$URL1" | awk -F\" '/input.*hidden/{print $6"="$8; exit;}')
curl -s -b /tmp/cookie.txt -c /tmp/cookienew.txt --data "login[username]=test2011_2&login[password]=test2011&$HIDDEN" "$URL1" > /dev/null
curl -s -b /tmp/cookienew.txt "$URL2" | grep "Your credit:" | awk -F\< '{print $3}' | awk -F" " '{print $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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:21 16-03-2012
SuperBeavers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# cd~
# vi ./.cshr
# reboot
# cvs -q checkout -rpkgsrc-2011Q4 -P pkgsrc
# pkg_add pwgen
# pwgen -sH /usr/pkg/bin/pwgen 20 1
# passwd
 
Какой пароль сгенерируется???

Всего записей: 5 | Зарегистр. 17-03-2012 | Отправлено: 17:38 17-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuperBeavers
щито это за неадекватный набор команд, причем некоторый из них явно интерактивные (vi, passwd)???
 
Что вы хотите получить в ответ?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:44 17-03-2012 | Исправлено: Alukardd, 18:44 17-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> # pwgen -sH /usr/pkg/bin/pwgen 20 1
> Какой пароль сгенерируется?
Один двадцатисимвольный, без ограничений по читабельности (-s), воспроизводимый по хэшу файла /usr/pkg/bin/pwgen (плохой выбор, кстати — до первого обновления воспроизводимый).
Обратите внимание, что я вам не сообщил ничего такого, чего нельзя было бы узнать из мана. ;-)
 
> # cd~
> # vi ./.cshr
> # reboot
> # passwd
А это тут к чему?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:46 17-03-2012
SuperBeavers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
извите не шарю в csh поэтому обращаюсь сюда. Известно, что команды генерируют пароль. Нужно найти этот пароль.
 
Добавлено:
Администратор операционной системы сгенерировал себе стойкий ключ, используя следующие команды
 
# cd~
# vi ./.cshr
# reboot
# cvs -q checkout -rpkgsrc-2011Q4 -P pkgsrc
# pkg_add pwgen
# pwgen -sH /usr/pkg/bin/pwgen 20 1
# passwd
 
Добудьте его!

Всего записей: 5 | Зарегистр. 17-03-2012 | Отправлено: 18:53 17-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Администратор операционной системы сгенерировал себе стойкий ключ, используя следующие команды
> Добудьте его!
Опять, судя по этим формулировочкам и использованию CVS, домашнее задание подкинули.

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

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вроде того. Я буду благодарен если вы поможете.
 

Всего записей: 5 | Зарегистр. 17-03-2012 | Отправлено: 19:19 17-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuperBeavers
> домашнее задание
> Вроде того.
Такие вещи надо сообщать сразу.
 
То, что пароль генерирует команда # pwgen -sH /usr/pkg/bin/pwgen 20 1, я надеюсь, вы понимаете. Генерируется он, как я уже сказал (а вы могли прочитать в мане), на основе хэша файла /usr/pkg/bin/pwgen. Это бинарник, собранный предыдущим пунктом на конкретной системе (NetBSD некой версии, да?), на конкретной неизвестной нам архитектуре, из исходников конкретной неизвестной нам версии (2011Q4 — это ветка репозитория, версия пакета в ее пределах может и обновляться, да?).  
Так что не имея доступа к системе того состояния, что было на момент генерации, вы пароля не воспроизведете. Я вам это, кстати, тоже уже сообщал: «плохой выбор, кстати — до первого обновления воспроизводимый».
 
P. S. Если не секрет, сообщите, из какой это книги или еще откуда.
 
P. P. S. Впрочем версию pwgen’а мы знаем — 2.06 — новых не выходило с 2007 года.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:50 17-03-2012 | Исправлено: ASE_DAG, 19:51 17-03-2012
SuperBeavers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема в том, что пароль нужно ввести в textbox. Итогом будет ответ либо "ok" либо "fail".  
Возможно надо ввести не определенный пароль, а что то еще. А задание дали для специальности 090105. На счет команды генерирующий пароль я понял с самого начала. Дела в том, что совсем не имел дела с Unix. То что пароль генерируется на основе хэша, тоже узнал. А вот какой пароль. Я не понимаю...

Всего записей: 5 | Зарегистр. 17-03-2012 | Отправлено: 19:56 17-03-2012 | Исправлено: SuperBeavers, 19:57 17-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuperBeavers
Вам это срочно?
 
> совсем не имел дела с Unix
Т.е. не изучали, а в контрольных тестах есть? Что это за тесты такие? Дайте ссылку, а?
 
> 090105
«Комплексное обеспечение информационной безопасности автоматизированных систем», ну-ну. :-)
 
> вот какой пароль. Я не понимаю...
Какой сгенерирует. :-) На машинке, с которой я вам сейчас пишу (Debian Wheezy, amd64), например, будет так:
$ pwgen -sH $(which pwgen) 20 1
eJ2fnmMyV3yf0L5T1aAn

 
> Возможно надо ввести не определенный пароль, а что то еще.
Ну, что у вас там за задание, я точно не знаю.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuperBeavers
Мб проще textbox расковырять и из него выудить ответ?)
 
Ну а остальное вам сказал т.ASE_DAG. Всё что вам нужно попытаться сделать, это получить тот самый файл /usr/pkg/bin/pwgen, можете пробовать все подряд, по убыванию свежести. И повторять команду генерации пароля, попутно проверяя их в вашей формочке.
 
p.s. Да, надо бы это как-то отметить, что если это сферический пример в вакууме, а не реальная ситуация. Я генерю пароли так: cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 12 && echo пойди получи точно такой же
 
Добавлено:
А вообще я не понимаю прикола таких утилит как pwgen, ну кому она нужна? Единственное, что полезное в ней нашёл это генерация легко запоминаемого пароля. Остальное достигается и без неё в 2-3 pipline почти в любом unix like окружении.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:19 17-03-2012
SuperBeavers

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VPN лег. Как поднимут проверю ответ.

Всего записей: 5 | Зарегистр. 17-03-2012 | Отправлено: 20:59 17-03-2012
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:54 17-03-2012
armaturator

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
#!/bin/sh
 
ssh -i /home/user/.ssh/id_dsa user@ip "if [ -e /usr/home/user/1 ]; then :; else mkdir /usr/home/user/1; fi";
Помогите пожалуйста как заставить этот скрипт работать?

Всего записей: 6 | Зарегистр. 16-03-2012 | Отправлено: 02:44 21-03-2012 | Исправлено: armaturator, 02:47 21-03-2012
ASE_DAG



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

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

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
да ошибок то в строке вроде нет
а при отработке получаю (забыл написать):
./test.sh
if: Expression Syntax.
 
Нашел причину проблемы при логине грузится tcsh шелл
Помогите переделать часть проверки существования папки на tcsh

Всего записей: 6 | Зарегистр. 16-03-2012 | Отправлено: 11:00 21-03-2012 | Исправлено: armaturator, 13:18 21-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
armaturator
csh ужасен!!! Я вообще его не могу воспринимать.
Просто измените команду так:
ssh -i /home/user/.ssh/id_dsa user@ip "sh -c 'if [ ! -e /usr/home/user/1 ]; then mkdir /usr/home/user/1; fi'";

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:42 21-03-2012
armaturator

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

Всего записей: 6 | Зарегистр. 16-03-2012 | Отправлено: 16:26 21-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
>> if [ -e /usr/home/user/1 ]; then :; else mkdir /usr/home/user/1; fi
> if [ ! -e /usr/home/user/1 ]; then mkdir /usr/home/user/1; fi
Если уж решили оптимизировать — оптимизируйте до конца ;-) :
$ ssh -i /home/user/.ssh/id_dsa user@ip "[ -e /usr/home/user/1 ] || mkdir /usr/home/user/1"
 
И да, это одинаково хорошо подходит как для борношеллов, так и для си-шеллов.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:48 21-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Если уж решили оптимизировать
да просто пустое тело if'а меня угнетает

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:06 21-03-2012
Jugador

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос...
$((RANDOM%12+1)) выдает случайное число от 1 до 12
Но, почему-то в скрипте...
#!/bin/bash
num=$((RANDOM%12+1))
echo $num
 
Выдаёт 1, а не случайное...
Не пойму уже 2 часа в чём дело ) Используется terminal, linux mint.

Всего записей: 136 | Зарегистр. 14-04-2004 | Отправлено: 21:30 21-03-2012
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:28 21-03-2012
cp58

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jugador
Можно пойти другим путем:
num=$(od -A n -t u -N 4 /dev/random)
echo $((num%12+1))

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 22:40 21-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cp58
Ну тогда уж в одно действие всё-таки число получать стоит:
num=$(($(od -A n -t u -N 4 /dev/random)%12+1))
 
Jugador
такое поведение может быть вызвано тем что в скрипте у вас переменная RANDOM оказывается не установлена. Т.е. либо она по какой-то причине оказалась не установлена, либо её кто-то принудительно выполнил unset RANDOM
 
Добавлено:
Нашёл кривой способ вернуть её в самом же скрипте, хз почему она исчезает...
Первой строчкой прописать: RANDOM=$$

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:51 21-03-2012
Jugador

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

Цитата:
Первой строчкой прописать: RANDOM=$$

Не рандомно меняется а, как i++ , т.е. по единице прибавляет, иногда по 2 ))
 

Цитата:
num=$(($(od -A n -t u -N 4 /dev/random)%12+1))  
- работает! Но! Если злоупотреблять (генерировать подряд несколько), думает по три - пять секунд! Многовато это.

Всего записей: 136 | Зарегистр. 14-04-2004 | Отправлено: 02:43 22-03-2012 | Исправлено: Jugador, 03:02 22-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jugador
Щито у вас там происходит?
Не, всё, я пас. Знания мои на этом иссякли, а что бы что-то исследовать нужен доступ к косячной системе.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 03:07 22-03-2012
cp58

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

Цитата:
- работает! Но! Если злоупотреблять (генерировать подряд несколько), думает по три - пять секунд! Многовато это.

Читать с /dev/random дорого, если не так важно, то можно считывать с /dev/urandom(псевдослучайные значения).
num=$(($(od -A n -t u -N 4 /dev/urandom)%12+1))  

Всего записей: 295 | Зарегистр. 06-12-2011 | Отправлено: 09:47 22-03-2012
Jugador

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

Цитата:
num=$(($(od -A n -t u -N 4 /dev/urandom)%12+1))  
 

То, что надо. Не тормозит. Большое спасибо.  
Для тех, кто видит впервые, вкратце поясню... Эта строчка даёт случайное значение от 1 до 12 в скрипте #!/bin/bash

Всего записей: 136 | Зарегистр. 14-04-2004 | Отправлено: 10:39 22-03-2012
LevT



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

ASE_DAG

Цитата:
 

Цитата:
> об этом решении первый раз слышу, надо изучить  
Изучил. На данном этапе развития эту штуку использовать не надо. Там сейчас служебного кода больше, чем полезных функций.  

Если интересует, могу попробовать вспомнить, где я встречал более обширный «фрэймворк» для Баша.  

 
Было б здорово.
Хотя полезных функций дофига например в примерах к absg, а для меня распарсить строчку табличного конфига на практике, как выяснилось, проблема...
 
 
 
Добавлено:
 
нашел кусок который нравится, такой стиль я люблю
  в винворде 15 лет назад что-то подобное сооружал
 
while IFS=: read -r link addr ; do
    ((nic_cnt++))
    nics[$nic_cnt]=$link
    macs[$nic_cnt]=`echo $addr | sed 's/\\\:/:/g'`
    assigned[$nic_cnt]="-"
done < <(dladm show-phys -pmo link,address 2>/dev/null)

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 00:26 23-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Вместо конструкции ``, лучше использовать $().
оО Впервые вижу команду dladm, как понял это Solaris.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:13 23-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Ага, даталинки админятся так, L3 из ipadm.
Но самая жесть, которую мне надо обернуть в свой конфигуратор - это stmfadm, itadm и sbdadm (ядро фреймворка рулящее видимостью лунов, драйвер scsi block device и драйвер iscsi таргет порта)

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 01:27 23-03-2012
Alukardd



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

LevT
Разругались тут *adm утилитами - я к 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:38 23-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Там всё через адмы ради SMF - по мотивам которой сделан upstart.
В этой Service Management Facility конфиги сервисов декларативные в xml, меняются законно только либами, которых дёргают адмы.
Соотвественно разработчики могут менять схемы никого не спрашивая и не отчитываясь в доках: совместимость обещана на уровне либов.  

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 01:45 23-03-2012 | Исправлено: LevT, 01:46 23-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
ужОс
не хочу даже лезть в это... Не люблю такие подходы, меня просто воротит от них.
 
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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:47 23-03-2012 | Исправлено: Alukardd, 01:48 23-03-2012
LevT



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

Зато бэкап настроек через экспорт-импорт xml конфига. И я гроша ломанного не поставлю за переносимость этих бэкапов между разными солярами.
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 01:49 23-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
бэкап настроек через экспорт-импорт xml конфига
м-м, да спасёт нас великий tar с обдуманным  списком нужных Вам .conf файлов... А еще все эти конфиги можно в свой пакет завернуть (deb, rpm) и настравивать всю систему, накатыванием пары таких самопальных пакетов.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:53 23-03-2012
LevT



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

Цитата:
Не люблю такие подходы, меня просто воротит от них.  

 
К сожалению, окружить себя гомогенной вычислительной средой не получится, огородившись от всего остального.
 
Приходится учиться управлять такими системами как чОрными ящиками, собирая из них полезные конструкции, более прозрачные в своём масштабе.
 
 
Добавлено:

Цитата:
да спасёт нас великий tar с обдуманным  списком нужных Вам .conf файлов... А еще все эти конфиги можно в свой пакет завернуть

 
Между разными инстансами-то одного дистрибутива настройки переносимы наверняка. Но хочется переносить настройки таргета вместе с самим стораджем (ZFS, который переносим между всеми современными дистрами на солярном ядре и не только ими).
 
Вот у меня сейчас нексента и смартос поочерёдно раздают сторадж с одного и того же массива. Хочу после перезагрузки (передёргивания системы) передёрнуть и настройки, а не колупать адмы, подставляя туда руками параметры-гуиды лунов ..
 
 
Добавлено:
 
Выше я чутОк ввёл в заблуждение: ipadm допилил только оракул (но ifconfig оставил для совместимости с предыдущими солярами)
 
А Ыщё оракул добавил нетворк автомагик - netcfg и netadm, рекомендовав именно их для применения на серверах. Это типа искусственный интеллеХт: вооружившись поллитрой и такой-то матерью, с его помощью можно запрограммировать единые декларативные настройки для всех случаев, где ни придётся запустить систему (например, на физическом железе или под разными гипервизорами).

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 01:56 23-03-2012 | Исправлено: LevT, 12:01 23-03-2012
slech



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

Цитата:
 
sed -i '4i \n test 1 \ntest 2 \ntest 3 \n' file.txt
 

 

Код:
 
n test 1
test 2
test 3
 

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 15:28 23-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
Ответ ближе чем вы думаете...
sed -i '4i \\ntest 1 \ntest 2 \ntest 3 \n' file.txt

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:54 23-03-2012
slech



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

Цитата:
Ответ ближе чем вы думаете...
sed -i '4i \\ntest 1 \ntest 2 \ntest 3 \n' file.txt  

Спасибо, видать пропустил этот вариант при тесте без переменных
 

Цитата:
 
sed -i "4i \\n$linea \n$lineb \n$linec \n" $indexfile
 

так вот опять проблема:

Цитата:
 
n<a href="speed-test-03-2012.txt">
<img src="speed-test-03-2012.png" width="1024" height="576" />
</a>
 


Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 16:21 23-03-2012 | Исправлено: slech, 16:22 23-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
А вы не заметили что изменили ' на "???
Добавляйте еще один слэш

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:26 23-03-2012 | Исправлено: Alukardd, 16:26 23-03-2012
slech



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

Цитата:
А вы не заметили что изменили ' на "???  

заметил, потому как без кавычек переменные работать не будут:

Код:
 
sed "s/$pattern//g"
# or
sed 's/'"$pattern"'//g'
 

а зачем 3-ий \ ?

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 16:32 23-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
содержимое заключенное в двойных кавычках подлежит раскрытию еще в shell, так что приходится с этим считаться.
 
Добавлено:
Хм, вот только я не очень понял почему на остальные \n это так сильно не влияет как на первый, и почему они работают и с одни м и двумя слешами... Надо покурить доку на sed.

Похоже, что \n внутри строки так и уходит в sed как символ новой строки...

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:34 23-03-2012 | Исправлено: Alukardd, 16:45 23-03-2012
LevT



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

Как из скрипта (если точнее - то из файла, который сорсится исполняемым скриптом) добавить алиасы к интерактивному шеллу, из которого запускается тот самый исполняемый скрипт?
 
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 19:32 24-03-2012 | Исправлено: LevT, 19:53 24-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Сделать что-либо из дочернего шелла в родительском? Никак.
А для исполнения перечня команд из скрипта без запуска нового интерпретатора, напомню, есть команда source, она же .:
$ . myscript

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:50 24-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну да, я про sourcing упомянул в своём вопросе
 
хорошо, скажу как я вышел на такую именно задачу - а Вы подскажете мне правильный путь ее постановки (раз уж решение невозможно)
 
Я всё-таки завел у себя bhork  
Там есть файл ~\.bhork, содержащий в частности
 

Код:
# shortcuts
alias cde="cd ${BHORK_HOME}/errors"
alias cdi="cd ${BHORK_HOME}/input"
alias cdl="cd ${BHORK_HOME}/logs"
alias cdo="cd ${BHORK_HOME}/output"
alias cdp="cd ${BHORK_HOME}/profiles"
alias cds="cd ${BHORK_HOME}/scripts"
alias cdt="cd ${BHORK_HOME}/tmp"
alias cdu="cd ${BHORK_HOME}/util"

 
Итак, я сделал cds и вручную отлаживаю скрипт myapp/test
 
Логи попадают в определённый файл в директории ../logs/myapp/,
ошибки в определённый файл в директории ../errors/myapp/
имена этих файлов экспортируются в дочерний шелл из стандартной библиотеки фреймворка - файла ../profiles/bhork_profile (они там генерятся заново при каждом её включении)  
 
После запуска ${BHORK_HOME}/scripts/myapp/test (который благодаря включению стандартной библиотеки всегда завершается успешно с точки зрения интерактивного шелла), мне надо быстро заглянуть в эти файлы.  
 
Как в интерактивном шелле узнать, куда именно заглядывать?
 
 
Добавлено:
 
Если сохранять куда-то список сгенерённых в стандартной биб-ке значений - то я похерю всю динамику, о которой автор фреймворка позаботился с явным умыслом (мне пока неведомым, но заранее уважаемым).

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 23:21 24-03-2012 | Исправлено: LevT, 23:30 24-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
> Как в интерактивном шелле узнать, куда именно заглядывать?
Не трогая bhork_profile — только опираясь на содержимое logs/myapp/ и errors/myapp/ — взяв последний по дате файл, например, если их имена для этого непригодны.
А, собственно, что автор этого вашего bhork’а предлагает делать?
 
> подскажете мне правильный путь
Выкинуть bhork. ;-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:52 24-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
 
Мне кажется, что bhork это именно основа для IDE: остаётся открыть сгенерённые файлы в отдельных терминалах/окошках и переключаться между ними.
 
 
Добавлено:
 
Но мне пожалуй слабО эту IDE дописать: есть собственные дела поактуальней.
 
 
Добавлено:

Цитата:
Не трогая bhork_profile  

 
В bhork_profile заложено локальное расширение:

Код:
 
if [ -e ${BASH_SOURCE}_local ]; then
        . ${BASH_SOURCE}_local
fi
 


Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 00:21 25-03-2012
LevT



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

Цитата:
 
root@nex3:/zones/dsu/nfs/bhork/scripts/storcfg# find ../../errors/storcfg/ -type f | sort | tail -n 1
../../errors/storcfg/get_digested_20120324190551.err
root@nex3:/zones/dsu/nfs/bhork/scripts/storcfg# nano  ${find ../../errors/storcfg/ -type f | sort | tail -n 1}
bash: ${find ../../errors/storcfg/ -type f | sort | tail -n 1}: bad substitution
 

 
Вручную файл открывается. В чём грабли?
 
Добавлено:
 
Определил временно переменные путей в ~/.bhork_local
как правильно открыть файл? Обе строчки работают неверно
 
nano $_CDE$("ls -ctr1 ../../errors/storcfg/ | sort | tail -n 1")
nano $_CDE"ls -ctr1 ../../errors/storcfg/ | sort | tail -n 1"

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 11:06 25-03-2012 | Исправлено: LevT, 11:41 25-03-2012
LevT



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

Ответы по-прежнему интересны, а вопрос с логами решил: в bhork_profile есть для этого  

Код:
 
if [ -e ${BASH_SOURCE}_logging ]; then
        . ${BASH_SOURCE}_logging
else
        export MYPROJ_LOG=${MYPROJ_LOG_DIR}/${MYPROJ_SCRIPT_NAME}.log
        export MYPROJ_ERROR=${MYPROJ_ERROR_DIR}/${MYPROJ_SCRIPT_NAME}_${MYPROJ_DATESTAMP}.err
fi
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 14:10 25-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
А зачем у вас после ls -ctr еще и sort исполняется?
Что у вас в переменной _CDE?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:14 25-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Спасибо, догадался уже: слэша последнего не было.  
 
Мне кажется, что-то такое вроде bhork может быть полезным для сокращения трудоёмкости вашей тут с ASE_DAG деятельности и роста её эффективности, за счёт уменьшения шума.
 
"Скачай вот это, запусти (устанавливается контролируемая среда для эксперимента...)
а потом воспроизведи свою проблему"
 
"Выполни probe18..." и т.д.
 
 
И вообще, имхо, подобные "фреймворки" хороши для обмена, не только опытом, но и готовыми скриптами.  А еще с их помощью можно заладить в своей кухне что-то вроде собственного RPC между допустим линуксом и нексентой, на скорую руку.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 15:08 25-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Нет, от таких вещей как bhork боюсь нам тут только головной боли добавится (за т. ASE_DAG не скажу, но мне так точно)...
 
Лучше на чистом bash'е, с примесью системных утилит, те что есть в практически любом окружении (coreutils так сказать. ну и куда же без 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:11 25-03-2012
LevT



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

Всё-таки, не всегда и не везде одно и то же. Вот у меня в нексенте дебиановский юзерленд, а в ошибках bhork всегда строчка

Цитата:
 
/usr/lib/sendmail: No such file or directory
 

 
Ничего я там не нашёл, что бы сендмейл дёргало. В одном месте есть запуск mailx при серьезной ошибке.
 
А мейлер в принципе хотелось бы настроить..
 
 
Добавлено:
 

Цитата:
А еще с их помощью можно заладить в своей кухне что-то вроде собственного RPC между допустим линуксом и нексентой, на скорую руку.  

 
У меня у самого на bhork бо-ольшие виды )
Я вот сейчас оберну своей конфигурялкой солярные настройки маппинга лунов в таргеты для своих инициаторов - а со временем попробую портировать конфигурялку на линукс и-или бздю.
 
Можно будет потестить таргеты разных операционок в контролируемой среде.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 15:29 25-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
И что вам не нравится в строчке про sendmail? Sendmail является, практически, командой по умолчанию. В случае Debian что /usr/sbin/sendmail, что /usr/lib/sendmail являются симлинками на бинарник /usr/sbin/exim4.
 
Что вы имеете в виду под настроить мейлер? Что бы письма слать? Или полноценный почтовый сервер развернуть?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:41 25-03-2012
LevT



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

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

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 15:49 25-03-2012
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:05 25-03-2012
LevT



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

нет в нексенте ни senmail, ни exim, ни postfix. Но mailx есть
И мейлер какой-то есть, настраивается из GUI и CLI
 
Дёргается через dbus родным API. Может, он самописный какой-нибудь у них?
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:11 25-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Так, например, можно отправлять письма через mailx, используя любой почтовый сервер.
env MAILRC=/dev/null from=alukardd@company.ru smtp=smtp.company.ru smtp-auth-user=alukardd@company.ru smtp-auth-password=87JQS8wZ smtp-auth=login mailx -n -s "ТУТ ЗАГЛОВОК" LevT@company.ru <<< "ТУТ ТЕЛО ПИСЬМА"
 
Как делать это "локально" я не помню.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:15 25-03-2012
LevT



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

Включил set -x
Связанная с мейлером ошибка в логе уже после завершения скрипта по exit 0
 
В /etc/mail/mailx.rc упоминаний о сервере и аутентификации нет (а должны они там быть?)
 
 
Добавлено:

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

 
Спасибо, попробую.  
И всё ж интересно, что у них с мейлером. В сервисах тоже нет ничего похожего.
Похоже, собственный какой-то, внутри демона dbus или под.
 
 
 
Добавлено:
 
 
Alukardd
Можно ли в баше поставить брякпойнт?
 
 
 
Добавлено:
 
 
Ещё вопрос.
Не врубаюсь в логику взаимодействия флага set -x и редиректа ошибок. Особенно при включениях .
 
Можно как-то пояснить в двух словах?
 
 
Добавлено:
 
Alukardd

Цитата:
Нет, от таких вещей как bhork боюсь нам тут только головной боли добавится (за т. ASE_DAG не скажу, но мне так точно)...  

Я вот что имел в виду: задают здесь вопросы люди, неспособные самостоятельно определить, штатным ли образом у них настроена среда выполнения. Неясность предположений с обеих сторон добавляет шума.
 
Другое дело, если вам по-приколу каждый раз решать небольшие головоломки, и именно это вас мотивирует заниматься саппортом ))  Но с точки зрения эффективности процесса...
 
 
Добавлено:
 
Собственно, мой личный трип в bhork имел одной из своей целей именно протестировать штатную работу баша.
 
Для этих целей не обязателен именно bhork, но нужно нечто достаточно сложное, чтобы выявить косяки до того, как они начнут мешать продуктивной работе над своими задачами.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:20 25-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
Можно ли в баше поставить брякпойнт?  
В скриптах я использую свой любимый отладочный механизм, который часто применяю и для C (несмотря на бэбагер) - это несравненный echo (или printf).

Цитата:
set -x
данный флаг заставляет bash перед выполнением каждой команды вывести её на экран со всеми раскрытыми переменными и подставленными опциями по умолчанию.

Цитата:
заниматься саппортом  
не надо при мне этих слов) Я не люблю заниматься helpdesk'ом. А вот помочь накатать скрипт, да меня припирает, особенно если при этом я выкопаю для себя очередной интересный приём в дебрях man страниц.
Цитата:
выявить косяки
о каких косяках вы говорите? У shell'а есть только особенности, ни каких Вам косяков

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:20 25-03-2012
LevT



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

Цитата:
о каких косяках вы говорите? У shell'а есть только особенности, ни каких Вам косяков  

о косяках в настройках исполняющей среды
В нексенте, например, выявилось отсуствие /usr/lib/sendmail
В какой-нибудь "настроенной под себя" кем-то системе ещё и не то выявится... )
 
 
Ещё вопрос. Почему второе работает, а первое нет?
 

Код:
 
lun_cnt=0
while read -r num guid size device ; do  
    ((lun_cnt++))  
    guids[$lun_cnt]=$guid  
    devices[$lun_cnt]=$device
    _log $guid " - " $device  
done < < (sbdadm list-lu | grep /dev | nl)
 


Код:
 
#nic_cnt=0
#while IFS=: read -r link addr ; do  
#    ((nic_cnt++))  
#    nics[$nic_cnt]=$link  
#    macs[$nic_cnt]=$(echo $addr | sed 's/\\\:/:/g')
#    assigned[$nic_cnt]="-"  
#    _log $link " - " $addr
#done < <(dladm show-phys -pmo link,address | grep igb)
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 23:41 25-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Эм... Ну, собственно они не совсем одинаковые Или вы хотите что бы я Вам подсказал "5 отличий"?)
Думаю, что наиболее важны здесь эти строки:
Цитата:
while read -r num guid size device ; do

Цитата:
while IFS=: read -r link addr ; do
Соответственно важно здесь то, что вы меняете InputFieldSeparator с стандартного [[:blank:]] (пробел и таб, по сути) на двоеточие. И второй момент, что если количество полей возвращаемых командой окажется больше чем вы предоставили переменных в которые читаете, то в последнюю переменную запишется весь остаток строки, что не попал в предыдущие переменные.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Ну, и опечаточка в первом отрывке есть:
done < < (sbdadm list-lu | grep /dev | nl)
в то время, как надо
done < <(sbdadm list-lu | grep /dev | nl)
Словами говоря — пробел лишний затесался.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 04:24 26-03-2012 | Исправлено: ASE_DAG, 04:41 26-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
 
"Дизайнер" в мне машинально добавил самую тупую "красоту", спасибо за Ваш "дебаггер".
А вот IFS оказался в данном случае не при чём.
 
 
Добавлено:
 
 
Так... теперь мой "дизайнер" заинтересовался вопросом, можно ли сохранить функциональный стиль этой конструкции (пайп на входе цикла) внутри монады IO? (дадада, я уже в курсе, что в баше внемонадность называется heredocs, но меня волнует не столько "машинный" язык, сколько суть, которую он представляет)
 
Пускай я запомнил
LUNS=$(sbdadm list-lu) | grep /dev | nl  
 
Как модифицировать пайп?
 
А как "правильным образом" напрямую распарсить $LUNS ?

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 06:53 26-03-2012 | Исправлено: LevT, 08:13 26-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
гык, первый раз вижу утилиту nl, как-то и без неё вокруг добра хватает.

Цитата:
Как модифицировать пайп?
а можно для не посвящённых Вашу мысль как-то по другому изложить?
И что вы понимаете под "распарсить переменную"? Если я правильно вас понял, то тут либо использовать внутренние возможности bash (использовать возможности read -r или курим man на предмет подобных конструкций - ${parameter#word}), либо использовать внешние утилиты - awk, cut, sed.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:05 26-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Ну, я имел в виду - вот есть рабочий кусок проги, написанный в красивом функциональном стиле (с пайпами и с heredoc).  
Как бы Вы трансформировали этот кусок, чтобы он заработал с сохранённым состоянием? По возможности не отказываясь от остальной красоты.
 

Цитата:
гык, первый раз вижу утилиту nl, как-то и без неё вокруг добра хватает.  

Искусственный ключ (в человеческом виде, в дополнение к нелюдскому guid). Это из области проектирования БД. Здесь конечно лишний, тем более что без контроля надо сорцами sbdadm нет гарантии, что выдача всегда будет в том же порядке.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 20:19 27-03-2012 | Исправлено: LevT, 22:00 27-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LUNS=$(sbdadm list-lu)
как мне кажется, сохраняет одну длиннную строку без разрывов.
 
Как запомнить её вместе с переводами строк? (аналогично выводу команды в stdout)
Как лучше запомнить, вместе с разрывами, выдачу пайпа  (sbdadm list-lu | grep /dev)  ?
Как лучше получить отдельные строки из длинной переменной с разрывами?
 
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 10:47 28-03-2012 | Исправлено: LevT, 12:12 28-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
как мне кажется, сохраняет одну длиннную строку без разрывов.  
как вам кажется это конечно хорошо, но вывести переменную и посмотреть на неё видно не судьба? echo "$LUNS" - должны увидеть нормальный построчный вывод.
Цитата:
Как лучше получить отдельные строки из длинной переменной с разрывами?
ну видимо так: for line in $(echo $x); do echo "line is $line"; done, это при стандартном 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:11 28-03-2012
LevT



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

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 15:31 28-03-2012
Alukardd



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

Цитата:
обработку выдачи неизвестным мне форматтером
это проблемы последующих обработчиков, а не Ваши... Вы же тоже подстраиваете свой скрипт, под выводы системных утилит. Самым независимым вариантом будет слив данных в файл с использованием \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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:39 28-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
> В том-то и дело, что вижу всё слитно.
Еще один очень неконструктивный способ ведения диалога в данной теме — описывать ввод и вывод своими словами, когда можно их просто привести. Точно надо это в шапку красным вписать.
 
sbdadm’а у меня нет, но на примере произвольной утилиты с многострочным выводом — du.
 
/tmp$ TEST=$(du)
/tmp$ echo "$TEST"
0       ./orbit-main
0       ./pulse-teYQrpJA76Ac
0       ./akonadi-main.wwNBvz
0       ./.winbindd
4       ./ksocket-main
0       ./kde-main
0       ./ssh-sBofOrbZ3711
0       ./.ICE-unix
0       ./.X11-unix
8       .

 
но, заметьте:
 
/tmp$ echo $TEST
0 ./orbit-main 0 ./pulse-teYQrpJA76Ac 0 ./akonadi-main.wwNBvz 0 ./.winbindd 4 ./ksocket-main 0 ./kde-main 0 ./ssh-sBofOrbZ3711 0 ./.ICE-unix 0 ./.X11-unix 8 .


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

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



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

Цитата:
 
Logging
Wed Mar 28 15:33:50 GET 2012 ================================================================================
Logging
Wed Mar 28 15:33:50 GET 2012 Script: /zones/dsu/nfs/bhork/scripts/storcfg/get_digested started
Logging
Wed Mar 28 15:33:50 GET 2012 Getting sbd luns
Found 4 LU(s) GUID DATA SIZE SOURCE -------------------------------- ------------------- ---------------- 600144f099d1040000004f6b40a50001 5497558138880 /dev/zvol/rdsk/zones/dsu/zvols/FRONT 600144f099d1040000004f6b40d10002 4398046511104 /dev/zvol/rdsk/zones/dsu/zvols/bigserv 600144f099d1040000004f6b40d90003 2040109465600 /dev/zvol/rdsk/zones/dsu/zvols/w2k8 68b329da9893e34099c7d8ad5cb9c940 37580963840 /dev/zvol/rdsk/zones/dsu/zvols/test2
Logging
Wed Mar 28 15:33:50 GET 2012 Script /zones/dsu/nfs/bhork/scripts/storcfg/get_digested completed with errors/warnings
------------------------------
++ sbdadm list-lu
+ LUNS='
Found 4 LU(s)
 
              GUID                    DATA SIZE           SOURCE
--------------------------------  -------------------  ----------------
600144f099d1040000004f6b40a50001  5497558138880        /dev/zvol/rdsk/zones/dsu/zvols/FRONT
600144f099d1040000004f6b40d10002  4398046511104        /dev/zvol/rdsk/zones/dsu/zvols/bigserv
600144f099d1040000004f6b40d90003  2040109465600        /dev/zvol/rdsk/zones/dsu/zvols/w2k8
68b329da9893e34099c7d8ad5cb9c940  37580963840          /dev/zvol/rdsk/zones/dsu/zvols/test2'
+ echo Found 4 'LU(s)' GUID DATA SIZE SOURCE -------------------------------- ------------------- ---------------- 600144f099d1040000004f6b40a50001 5497558138880 /dev/zvol/rdsk/zones/dsu/zvols/FRONT 600144f099d1040000004f6b40d10002 4398046511104 /dev/zvol/rdsk/zones/dsu/zvols/bigserv 600144f099d1040000004f6b40d90003 2040109465600 /dev/zvol/rdsk/zones/dsu/zvols/w2k8 68b329da9893e34099c7d8ad5cb9c940 37580963840 /dev/zvol/rdsk/zones/dsu/zvols/test2
+ set +x
 

 
Добавлено:
 
Ага, теперь вижу то, чего не вижу на консоли. Форматер таки есть, но концы строк не режет.
 
 
Добавлено:

Цитата:
Да собственно я ни кого не предполагаю, просто я так общаюсь... Что касается данного моего вопроса, то он предполагал непоняток, а не возмущение. Ну, да ладно.  

 
Заметано
 
 

Цитата:
это проблемы последующих обработчиков, а не Ваши...

 
дело в том, что я желаю контролировать всё обработчики на своих системах - и либо их единообразно отключить, либо включить, либо обойти. "Подземного стука мне не надоть".
 
Только вот опыта у меня нет, необходимого чтобы отличить норму от отклонения.
 
 
 
Добавлено:
 
 

Цитата:
Ага, теперь вижу то, чего не вижу на консоли. Форматер таки есть, но концы строк не режет.  
 

 
Или всё-таки режет?  На консоли определённо нет никаких следов концов строк.
То есть, для выдачи дебага один форматтер (сохраняет концы), а для echo - более брутальный?
 
Это и есть норма?
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 15:46 28-03-2012 | Исправлено: LevT, 15:49 28-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
но, заметьте:  
ы, сначала решил что Вы загоняете... Потом понял в чём вкусняшка - я zsh использую там что в кавычках, что без - вывод разделён на строки... ^_^ А в bash'е действительно кавычки шпилят и я главное был удивлён когда вывод был такой красивый... (очередной сахар от zsh)

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:16 28-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
С кавычками, действительно, дебаг и echo в показаниях не путаются. Спасибо.
 
Два реально продвинутых "линуксоида" не могут согласовать предположения друг друга, без словесной переписки на форумах?
 
И это норма?
 
 
Конечно, каждый сам хозяин своих вкусов... но на этот данный счёт они у меня противоположные.

 
Может, мне проще будет примириться с неизбежным, ознакомившись с исторической логикой возникновения такого поведения в баше? Или вдруг существует какая-то удобозапоминаемая модель этого поведения, с которой примириться будет легче, чем в "увелекательном" процессе зубрёжки граблей и мин шелла на своей шкуре?
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:37 28-03-2012 | Исправлено: LevT, 16:41 28-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
IMHO, если не хотите неожиданных явлений посреди скрипта, то всегда оборачивайте любые выводы и вводы в кавычки.
 
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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:50 28-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможен ли автоматический тест системы на предмет выявления особенностей?
А для приведения к единообразию поведения неизвестной системы? Кажется,  #!/bin/bash недостаточно?
 
Что ещё надо сделать для поимения неизвестной системы и отбраковки совсем уж безнадёжных случаев (поправимых только мозгами и ручками)?
 
 
 
Добавлено:

Цитата:
p.s. О чём Вы там мелким шрифтом втирали я не понял.

 
О том, что, к моему величайшему удивлению и негодованию, Вы не можете быть уверены в поведении исполняющей среды своего коллеги.
 
Предположения Вас подводят. Себе и зависимым от меня людям я такого не хочу, это одна из базовых моих мотиваций: мозги и время людей должны быть свободными для решения собственных задач, без прерываний, вынужденных внезапными особенностями аутичного софта.
 
 
 
Добавлено:
 
И неважно, что именно случилось внезапно: захотелось ли новых денег очередному виндовому "цыганваре", или недостало высочашей "линуксоидной" квалификации, чтобы при взгляде на выдачу двухстрочного скрипта обойтись без когнитивного диссонанса.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:54 28-03-2012 | Исправлено: LevT, 17:09 28-03-2012
ASE_DAG



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Скажем так, я буду очень удивлён если на любой другой машине (отличной от моей), мой скрипт будет вести себя как-то по другому с тем условием, что внешними утилитами пользуемся по минимуму.
Если Вы сейчас о разногласиях меня и т.ASE_DAG, то моё удивление вызвано отличным поведением zsh от bash. А причина заключается в том, что zsh не пытается ни чего раскрыть при выводе переменной без кавычек, в отличии от bash'а который раскрывает всё что может перед выводом.
bash хранит много строчные выводы так: x=$'line\nline\nline' и за счёт этого он раскрывает их дважды в случае использования без кавычек, фактически без кавычек происходит следующее echo `echo "$x"`. (поправьте если я не так объяснил)

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:28 28-03-2012
LevT



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

Цитата:
Скажем так, я буду очень удивлён если на любой другой машине (отличной от моей), мой скрипт будет вести себя как-то по другому  

 
Машине, предварительно "настроенной под себя"? И непременно руками? Как с автоматизацией этого дела?
 
 

Цитата:
моё удивление вызвано отличным поведением zsh от bash.

 
Это-то понятно. Мне другое непонятно: как можно смиряться с тем, что рабочие инструменты (шеллы и никсы в целом) вынуждают удивляться и к себе адаптироваться, на таком-то уровне квалификации?
 
По-моему, такие фортели можно терпеть только от аутичного ребёнка, притом собственного. Чужих пусть терпят их родители, а софт пусть пляшет под мод дудку, а не наоборот.
 
Если относиться к софту как к инструменту - то не менее важна и переносимость опыта. Чтобы один коллега не готовился рушить свою среду ради предсказуемого поведения скрипта другого коллеги. Иначе обмен полезными скриптами облагается налогом (времени и внимания): в каких-то случаях дешевле в этом смысле изобрести велосипед, чем воспользоваться полученным со стороны результатом.
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 17:49 28-03-2012 | Исправлено: LevT, 17:57 28-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
Машине, предварительно "настроенной под себя"? И непременно руками? Как с автоматизацией этого дела?  

Цитата:
на любой другой машине

 
Пойдём далее, с чего вы взяли что у меня достаточный уровень квалификации, что бы хотя бы я сам мог заявить, что отлично знаю shell'ы (или хотя бы bash). Если так прикинуть то где-то 2/3 я более-менее знаю и помню, это в лучшем случае. К остальным 1/3 относится и то, что я вовсе могу первый раз увидеть и то, что я редко использую и за чем мне надо лезть в свои заметки, man'ы или инет.
 
Инструмент и окружение тоже меняется и развивается и есть вероятность что скрипт будет работать неадекватно или вообще не будет. Особенно если запутаться в соответствии стандартов POSIX и реалиям GNU утилит, примеры к сожалению сейчас не приведу.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:57 28-03-2012 | Исправлено: Alukardd, 17:59 28-03-2012
LevT



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

Цитата:
Пойдём далее, с чего вы взяли что у меня достаточный уровень квалификации,

 
Ну так квалификация познаётся в сравнении - и объективно затраченных усилий, и соотношения затрат к результату (по-моему, неудовлетворительного: глядя на Ваши достижения в избранном Вами направлении, мне хочется как-то более эффективно распорядиться своим личным ресурсом.)
 
Я не хочу приобретать личное, "семейное" отношение вообще не к какому софту (не в обиду ни Вам, ни башу-шеллам-никсам будь сказано).
 
Есть вещи совсем безальтернативные, на мой взгляд: такова ZFS сейчас. Но это рациональный выбор инструмента внутри одного класса альтернатив, и если я когда-нибудь решу допустим перейти на btrfs - я  недрогнувшей рукою постараюсь не только от ZFS избавиться (везде, где она ещё будет требовать от меня какой-то поддержки), но и покрепче о ней забыть. (Ну, оставлю что-то на периферии сознания, необходимое и достаточное для передачи опыта... если к тому моменту появится кто-то в нём заинтересованный и при том недостаточно свободный, чтобы поступить как я).

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 18:17 28-03-2012 | Исправлено: LevT, 21:00 28-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
К определению квалификации могу сказать, что я испытываю некую симпатию к разнообразным shell'ам и написанию скриптов в целом (да, даже batch файлов, хотя и в много меньшей степени). И не считаю что стоит настолько широко подходить к вопросу написания скриптов, надо уметь решать имеющиеся задачи.
Время на унификацию скрипта уходит уйма, даже имея некие шаблоны и понимание того, что стоит улучшить и обобщить. Почему я занимаюсь данным только если скрипт: 1- достаточно большой и сложный (думаю, от 100строк), 2 - решает какую-то практическую задачу, а не просто для разовых действий был состряпан, 3 - в моём ресурсе имеется некоторое время, которое я готов потратить на данный (прошу заметить уже рабочий скрипт). Как-то так я вижу картину скриптоваяния.
 
Касательно вашего примера с ZFS, я примерно так же смотрю на разновидность MTA, когда мне в руки попал Exim (спасибо maintainer'ам Debian'а за то, что они сделали его почтовиком по умолчанию) я понял что остальные sendmail'ы и postfix'ы я видеть не хочу (Exchange и прочие Kerio даже не упоминаю по понятным причинам ). Но не могу сделать такой вывод для всего софта. Хотя общее стремление, наверное, таково и есть. А всё потому, что среди программ с аналогичным функционалом какая-то тебе всё-равно нравится больше, и поэтому ты стремишься пользоваться ей и везде её протолкнуть, и это нормальная реакция.
Увы, что бы нормально работать надо уметь общаться с кучей аналогичного софта и железа.
 
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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:20 28-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
 
Как всё-таки подать содержимое $LUNS на вход цикла

Код:
 
while read -r num guid size device ; do  
    ((lun_cnt++))  
    guids[$lun_cnt]=$guid  
    devices[$lun_cnt]=$device
    _log $guid $device)  
done
 

 
У меня по-прежнему не получается: многими способами тыкался, понимания так и нет.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 10:11 29-03-2012
ndch

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем !
Подскажите пожалуйста литературу на русском в которой доходчиво объясняется о обработке текста и регулярных выражениях (sed, perl), желательно с примерами.
 
Т.е. ищу литературу (неважно электронную или бумажную), прочитав которую я смогу реализовать следующее:
в исходном текстового файле найти первое вхождение слова по regexp-у.
"отступить" от него назад до определенного слова, найденного по по regexp-у. установить "начало"
скопировать в новый файл весь текст от найденого  "начала" до конца файла.
 
Хочу научится, но мануалы мне поддаются с трудом.

Всего записей: 6569 | Зарегистр. 31-08-2008 | Отправлено: 10:34 29-03-2012
LevT



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

Цитата:
Время на унификацию скрипта уходит уйма, даже имея некие шаблоны и понимание того, что стоит улучшить и обобщить. Почему я занимаюсь данным только если скрипт: 1- достаточно большой и сложный (думаю, от 100строк), 2 - решает какую-то практическую задачу, а не просто для разовых действий был состряпан, 3 - в моём ресурсе имеется некоторое время, которое я готов потратить на данный (прошу заметить уже рабочий скрипт). Как-то так я вижу картину скриптоваяния.

 
Ну, а я связался со скриптами сразу именно ради пункта 2, и имею целью именно переносимость результата между разными системами, в которых есть рантайм stmf. А вот разные шеллы и разные способы достижения одинакового результата для меня скорее обуза.  
 
А ещё я отчасти эстет, потому уродливые/непонятные способы меня не устраивают. Подозреваю, что в шеллах есть своя красота, но ресурса ею проникаться у меня сейчас нет.  Так что мне сейчас нужен единственный способ, от которого не будет воротить.
 
 

Цитата:
Касательно вашего примера с ZFS, я примерно так же смотрю на разновидность MTA, когда мне в руки попал Exim (спасибо maintainer'ам Debian'а за то, что они сделали его почтовиком по умолчанию) я понял что остальные sendmail'ы и postfix'ы я видеть не хочу (Exchange и прочие Kerio даже не упоминаю по понятным причинам ).  

 
Спасибо, Ваша рекомендация в этом контексте для меня важна.
 
Что касается эксченджа - то он MTA постольку-поскольку. Базовый его функционал - это гранулярный шаринг папочек в мейлбоксах юзеров локалки.
 
Понятно, что мелкософт собирает сливки со своей инвестиции в инфраструктуру  AD, которая позволяет бесплатно для неё получить уйму сопутствующих плюшек... Но всё-таки интересно, есть ли софт в юниксах, изначально предназначеный для той же цели? (а не подражающий эксченджу и в первую очередь озабоченный совместимостью с аутлуком).
 
 
Добавлено:
 
На практике юзеры не пользуются discretional access control ни в файловой системе, ни в аутлуке - потому я могу смело считать, что этого клиентского функционала не существует.
 
Всё равно всё одминится одмином. Аутлук ещё берёт красивостью морды - но тут его способен заменить хороший веб-интерфейс...
 
 
Добавлено:
ndch

Цитата:
литературу на русском в которой доходчиво объясняется о обработке текста и регулярных выражениях (sed, perl),  

 
Правильную литературу не подскажу, потому что сам когда-то провалил аналогичный проект: сделал нужное в винворде.
 
А вот что я точно выяснил в процессе: регэкспы это скорее "принцип", чем "технология". Рантайм регэкспов в каждой утилите свой, примеры из одной и полученный с нею опыт применимы к другой весьма условно.
 
 
 
Добавлено:
 
Вот бы научиться приобретать опыт именно внутри "принципов"... только тогда  в моих глазах обретут смысл затраты на изучение отдельных утилит или шеллов, когда налицо будет полная карта от принципа до  рекомендованной коллегами реализации.
 
Опять же, выявятся источники экономии, вроде упомянутого выше принципа discretional access control. Оказывается, в моих условиях его реализации в клиентском софте - не более чем оверхед.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 10:41 29-03-2012 | Исправлено: LevT, 14:59 29-03-2012
ndch

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
То что регэкспы это концепция а не технология я понимаю.
Хотелось бы научиться пользоваться sed и perl для массовой обработки текстовых данных. Обладаю практически нулевыми знаниями.
 
В шапке написано "Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь" поэтому и написал сюда.
 
Может быть кто-нибудь ещё что-то посоветует ?
 
Для начального понимания regexp-ов помогает regexbuddy.

Всего записей: 6569 | Зарегистр. 31-08-2008 | Отправлено: 12:59 29-03-2012 | Исправлено: ndch, 13:55 29-03-2012
LevT



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

sed-ом наверное дешевле всего обойдётся проникнуться, прогнав "полезные примеры" из шапки параллельно с RegexBuddy
 
Останутся особенности неинтерактивной обработки никсовыми утилитами.
 
Закрепить опыт можно будет, повторив выученные уроки с использованием perl.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 13:48 29-03-2012
ndch

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Подскажите а есть нечто вроде "задачника с решениями" по sed ?
 
Понимаю что Вы упомянули "USEFUL ONE-LINE SCRIPTS FOR SED" но хотелось бы именно "задачника с решениями".
На первых порах задачник на русском был бы очень уместен.

Всего записей: 6569 | Зарегистр. 31-08-2008 | Отправлено: 14:03 29-03-2012 | Исправлено: ndch, 14:04 29-03-2012
LevT



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

Это к сожалению не ко мне, а к здешним экспертам.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 14:07 29-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
sed-ом наверное дешевле всего обойдётся проникнуться
не соглашусь ну ни как. Sed это просто бездонная яма различных функций и фич, на мой взгляд awk намного проще и удобнее, хотя на sed многие вещи будут выглядеть по короче, но при этом неискушенному разуму намного менее понятным.
 
ndch
В шапке есть ссылка на примеры на различных языках в т.ч. и sed. Есть интересный документик - Полезные одно-строчные скрипты sed (а, эта ссылка тоже есть в шапке, просто на opennet её читать поудобнее чутка)
 
LevT
По поводу $LUNS:
Код:
#!/bin/bash
LUNS=$(du | head)
while read -r x y; do
    echo -e "x is $x\ny is $y"
done <<< "$LUNS"


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:59 29-03-2012 | Исправлено: Alukardd, 15:04 29-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отлично, спасибо!
Непосредственная моя сиюминутная цель достигнута.
 
Теперь уточняю ради понимания:  
1) в чём смысл третьего <   ?    
2) Почему пробел после него не вызывает ошибку?
 
Я на самом деле пытаюсь решить более сложную задачу: интерпретировать смысл трансформации программы и понять соображения разработчиков баша, выбравших именно такой синтаксис для выражения этого смысла.
 
Даже тяжелое историческое наследство не обязательно влечёт хаос: люди-то умные шелл допиливали.. По-моему, правильный подход к изучению правильных инструментов - пытаться думать как их разработчики.
 
 
Добавлено:

Цитата:
не соглашусь ну ни как.

 
По моему, предмет спора отсутствует.  
sed-ом собрался проникаться ndch.  А я предложил навскидку экономный алгоритм достижения им своих целей, с учётом объявленного опыта и подручных инструментов.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 15:23 29-03-2012 | Исправлено: LevT, 16:01 29-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
 
> 1) в чём смысл третьего <?
 

Цитата:
  Here Documents
       This type of redirection instructs the shell to read input from the current source until a line containing only delimiter (with no trailing blanks)  is  seen.
       All of the lines read up to that point are then used as the standard input for a command.
 
       The format of here-documents is:
 
              <<[-]word
                      here-document
              delimiter
 
   <...>
 
   Here Strings
       A variant of here documents, the format is:
 
              <<<word
 
       The word is expanded and supplied to the command on its standard input.

 
> 2) Почему пробел после него не вызывает ошибку?
А с какого бы ему вызывать ошибку? Может возникнуть иной вопрос: почему лидирующий пробел не попадает во ввод, но это потому что «the word is expanded», а раскрытие это, в частности, и подразумевает.
 
P.S. Но я бы в вашем примере вообще переменной не использовал.
P.P.S. Откуда цитата, я думаю, догадываетесь.
 


 
ndch

Цитата:
Подскажите пожалуйста литературу на русском в которой доходчиво объясняется о обработке текста и регулярных выражениях (sed, perl), желательно с примерами.

 
> Подскажите, пожалуйста, литературу
Свою любимую литературу я уже перечислил в шапке. Если мне было чего туда добавить, то я бы добавил. ;-)
 
> на русском
А вообще, вот здесь у вас основной затык.
 

Цитата:
в исходном текстового файле найти первое вхождение слова по regexp-у.
"отступить" от него назад до определенного слова, найденного по по regexp-у. установить "начало"
скопировать в новый файл весь текст от найденого  "начала" до конца файла.

 
На Седе в общем случае это вообще не реализовать, только условившись, что два искомых слова находятся в одной строке (причем «строке» в узком смысле — последовательности символов от \n до \n — широкого толкования Сед, афайк, не допускает). Но даже так здесь лучше не пользоваться не Седом.


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
в чём смысл третьего <   ?
так гласит великий man bash сразу после here documents есть here strings
Цитата:
Почему пробел после него не вызывает ошибку?  
а собственно почему должно?
Если вы о том пробеле, что Вам т.ASE_DAG нашёл, то вот Вам полная картина ситуации:
Код:
#!/bin/bash
LUNS=$(du | head)
 
# Process Substitution
while read -r x y; do
    echo -e "x is $x\ny is $y"
done < <(cat /etc/resolv.conf)
 
# Here Documents
while read -r x y; do
    echo -e "x is $x\ny is $y"
done << EOF
some text
one more text
EOF
 
# Here Strings
while read -r x y; do
    echo -e "x is $x\ny is $y"
done <<< "$LUNS"
 
# Redirecting Input
while read -r x y; do
    echo -e "x is $x\ny is $y"
done < "/etc/resolv.conf"


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:55 29-03-2012 | Исправлено: Alukardd, 15:56 29-03-2012
LevT



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

Цитата:
P.P.S. Откуда цитата, я думаю, догадываетесь.  

 
Дык я упоминал здесь heredocs на предыдущей странице - стало быть, в курсе  названия этого предмета в рамках баша ))
 
Вот не оставляет меня мысль, что HERE это репрезентация вычислений вне монады IO, т.е. с их помощью можно попробовать оставаться в рамках почти чистого функционального стиля (без сохранения состояний). Разумеется, там, где именно это эстетствование не влечёт серьёзного ущерба.
 
А пытал я вас потому, что разбирать многострочные переменные мне всё-таки надо было научиться, и желательно не абы как, а именно стильно )

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:18 29-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Я эти словосочетания только от вас услышал и мб запомню) А так я оперирую задачами и языковыми конструкциями. У меня с теорией всегда были проблемы
 
За красивыми решениями это к 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:23 29-03-2012
LevT



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

Я надеюсь, что у разработчиков баша не было проблем с теорией, и они пытались подогнать к ней синтаксис (пускай и изначально на неё не ориентированный, по причине совместимости с sh)
 
 
Добавлено:
Не факт, что им это удалось в полной мере, потому что это не было их основной целью.  
 
 
 
Добавлено:

Цитата:
А так я оперирую задачами и языковыми конструкциями.

 
Смысл - причём, оказывается, универсальный - есть даже в синтаксисе естественных языков. А уж у разработчиков языков искусственных была возможность развернуться, потому что голый утилитаризм скучен, а люди они творческие.
 
Если поступать наоборот и ради обогащения семантики выжимать досуха существующий синтаксис - получается брейнфак, не поддающийся поддержке. То есть опять же развлечение, но для меня - пользователя - бесполезное.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:32 29-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ndch
Продолжая свою мысль:
 

Цитата:
> в исходном текстового файле найти первое вхождение слова по regexp-у.
> "отступить" от него назад до определенного слова, найденного по по regexp-у.  
> установить "начало", скопировать в новый файл весь текст от найденого  "начала" до конца файла.
 
На Седе в общем случае это вообще не реализовать, только условившись, что два искомых слова находятся в одной строке (причем «строке» в узком смысле — последовательности символов от \n до \n — широкого толкования Сед, афайк, не допускает). Но даже так здесь лучше не пользоваться не Седом.

 
Вот реализация этой фигни, без допущения о строках, на Гавке. В отличие от того, как могло быть на Седе, думаю, все предельно прозрачно. ;-)
 

Код:
#!/usr/bin/gawk -f
BEGIN {
    FIRST_REGEX = "foo";
    SECOND_REGEX = "bar";
}
P==0 && match($0, SECOND_REGEX) {
    delete S;
    $0 = substr($0, RSTART);
    j = 0;
    P = 1;
}
P==1 && match($0, FIRST_REGEX) {  
    for (i in S) print S[i];
    P = 2;
}
P==1 { S[j] = $0 }
P==2


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:36 29-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно, вскоре я решусь поставить что-то такое, что позволяет вызывать из баша платформенные сишные либы в солярке, и в нём разобраться. Если такое существует в природе. ))  
 
Выше строго сейчас предпочтительный вариант, ради него я готов прошерстить  комментарии к платформенным функциям и их заголовки. Но если я хочу невозможного - то программа-минимум: чем проще поковырять из баша XML? Надо нацелить парсер на определённый атрибут и сравнить его значения до вызова stmfadm и после него. Сгенерирую серию изменений - и попробую понять, что именно делают вызовы.
 
Разницу я по-тупому вижу диффом, но поскольку атрибут бинарный, глазами  анализировать отличия влом. Как-то оно должно быть связано с guid... (как минимум, но боюсь, этим не ограничится)
 
 
root@nex3:/zones/dsu/nfs/rootfiles# diff svccfg-stmf.backup svccfg-stmf-good.backup  
Подробнее...
 
Иными словами, намереваюсь подёргать те самые либы как чОрные ящики и отреверсить реализацию нек-рых функций. Не хочется доходить совсем уж до ручки: рытья в сишной реализации тех самых либов. Что-нибудь менее для меня сейчас трудоёмкое.
 
Ну и наконец последний вариант - который мне также представляется чрезмерно трудным, и потому я решусь на него только при крайней нужде - ставить полноценный сишный каркас для дёрганья тех самых солярных платформенных либов. В чём он должен состоять, ума не приложу.
 
 
Помогите советом: может быть, я недооцениваю или переоцениваю трудоёмкость разных вариантов.
Конечная цель предприятия - не полный контроль (возможный только на девелоперской машине), а несколько более полное понимание архитектуры подсистемы, чем то, что извлекается из манов к утилитам *adm   Сомнительно, чтобы я решился когда-нибудь править конфиги в обход этих утилит.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 18:53 29-03-2012 | Исправлено: LevT, 19:17 29-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Ну XML можно парсить внешними тулзами (4xpath, например), или разгребать чем-то вроде awk.
 
По поводу красивого diff'а, то единственное из того, что я знаю, что может показать посимвольную разницу с раскраской это vimdiff. Минус очевиден - это интерактивная программа, но можно вывести его результат в html файл и закрыть vim, что бы скрипт бегал дальше не останавливаясь.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 19:31 29-03-2012
ndch

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

Цитата:
На Седе в общем случае это вообще не реализовать, только условившись, что два искомых слова находятся в одной строке

Perl в качестве "редактора" в таком случае больше подходит  ?
Может быть что-то более подходящее для обработки текстовых файлов посоветуете ?
Про рекомендацию gawk-а понял.

Всего записей: 6569 | Зарегистр. 31-08-2008 | Отправлено: 20:09 29-03-2012 | Исправлено: ndch, 20:12 29-03-2012
ASE_DAG



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

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

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



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну, если из баша невозможно дёргать нативные lib*.so, то я могу несколько отложить мероприятие, его не отменяя вовсе.
 
Из жабы вроде бы можно так делать, если я правильно понял шароварщиков.  Что бы такое самое легковесное завести для этой цели - после того, как я башем отлажу бекап-модификацию-рестор со своими текстовыми конфигами? Чисто в исследовательских целях на одной машине: переносимый конфигуратор я ни на чём кроме баша городить не собираюсь.
 
Бэкенд нексентовского управляльного движка сделан из файлов *.pyc. Помогите оценить трудоёмкость затеи воспользоваться установленным питоновским рантаймом. Заодно - прошу прощения за то, что всё больше уклоняюсь в офтопик - совершенно отговорите от мысли поковырять те самые pyc или, напротив, присоветуйте направление изысканий в этом направлении.
 
 
Добавлено:
 
Есть вот такой цикл (внутренности я уже немного отрефакторил, и буду рефакторить дальше: не о них вопрос)
 
for $guid in `stmfadm list-lu | cut -d" " -f3`; do
   #echo $guid
  echo $(sbdadm list-lu | grep FRONT)
 
   stmfadm list-view -l $guid
 
   get_host_group $guid
   get_client_iqns $host_group
 
   echo Client IQNs $client_iqns
 
   echo
done
 
Я продолжаю путаться в раскрытии переменных. Выделенная строка находит единственную строчку из многострочного вывода (почти то, что нужно получить). Но если я пытаюсь следующим шагом заменить отладочную константу FRONT на $guid, у меня не выводится здесь ничего.
 
Опять прошу подсказки.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 21:38 29-03-2012 | Исправлено: LevT, 23:12 29-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Цитата:
for $guid in `stmfadm list-lu | cut -d" " -f3`; do  
эм... надеюсь $guid это очепятка и там написано просто guid. Продолжим тем, что я рекомендовал Вам использовать конструкцию $(), вместо ``.
Если у Вас реально там написано $guid то я не понимаю как скрипт вообще запускается.
 
К чему echo? Строка должна быть просто sbdadm list-lu | grep "$guid"
Отладочная строка #echo $guid выводила то, что Вам надо?
Помните, что grep регистрозависим.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:42 30-03-2012
LevT



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

Всё верно, очепятка, опять большое спасибо за помощь. Скрипт я постепенно модифицирую взятый откуда-то из инета: оттого там сохранялся `` вместо $()
 

Код:
 
echo --- List View and Associated Host Groups IQNs ---
for guid in $(stmfadm list-lu | cut -d" " -f3); do
   echo $guid
set -x
   sbdadm list-lu | grep "$guid"
   stmfadm list-view -l "$guid"
 

 
Предпоследняя строчка не работает (ничего не выводится)
интерактивно с тем же guid выводится
 
Влияние bhork исключено: без него то же самое. Вот подробнее отладочная выдача:
 

Цитата:
 
root@nex3:/zones/dsu/nfs/bhork/input/storcfg# /zones/dsu/nfs/rootfiles/config.view  
--- List View and Associated Host Groups IQNs ---
600144F099D1040000004F6B40A50001
+ sbdadm list-lu
+ grep 600144F099D1040000004F6B40A50001
+ stmfadm list-view -l 600144F099D1040000004F6B40A50001
stmfadm: 600144f099d1040000004f6b40a50001: no views found
+ exit
 

 
И следующий вопрос: как правильно перехватить ошибку stmfadm в последней строчке? Это важная инфа: она означает неконсистентность базы, получившуюся в результате ручного применения утилит.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 10:15 30-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
В смысле перехватить? try{}catch(Exception e){} здесь нету
Следующей строкой после команды можно вставить проверку кода возврата - if [ $? -ne 0 ]; then echo "Caution! Have a trouble"; fi.
Цитата:
Предпоследняя строчка не работает (ничего не выводится)  
так и предыдущая ни чего Вам не вывела, так и должно быть?
Когда Вы проверяли команду интерактивно в терминале, Вы пробовали скопировать именно отладочную строку из скрипта и именно она дала результат?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 12:16 30-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Блин, допёрло, как до жирафа!  
Разглядел, наконец, что регистр букв в выдаче sbdadm и stmfadm различаются
 
Как лучше закрыть проблему регистрозависимости?
 
 
Добавлено:
 
именно для грепа просто (ключ -i)
Есть ли более общий - но контролируемый - метод, вроде заключения переменных в кавычки?
типа нахрен отключить везде case sensitivity мне всё-таки не надо: это перебор.
 
А вот о [не]существовании для этой цели чего-то вроде флага вроде set -x я хочу знать.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 13:48 30-03-2012 | Исправлено: LevT, 14:43 30-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> if [ $? -ne 0 ]; then echo "Caution! Have a trouble"; fi
Зачем столько букв? И на STDOUT это вываливать все-таки не надо.
do-something || echo >&2 "E: Something has gone wrong."
 
> регистрозависимости
> для этой цели чего-то вроде флага
Флаг для Баша-то есть (о чем, кстати, легко узнать из мана, да).
$ [[ A == a ]]
$ echo $?
1 # ЛОЖЬ
$ shopt -s nocasematch
$ [[ A == a ]]
$ echo $?
0 # ИСТИНА

 
Только ни на что, кроме Баша, он влиять не будет, на Греп в т. ч.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Зачем столько букв?
зато, красиво) Я кстати редко когда пользуюсь ||, обычно всегда if описываю...
 
LevT
Если вы знаете в каком регистре вам нужна будет переменная, то есть вариант подать её в нужном виде, например так: ${guid,,*} - получить переменную $guid  в нижнем регистре.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:31 30-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
 
Дык вот зачем мне лишние знания, которые лягут мёртвым грузом, а в нужный момент как раз запросто и не вспомнятся (как это случилось только что с grep -i)?  
 
Мозги-то не резиновые, времени не вечность в запасе...
Я хотел узнать ровно то, что узнал, с Вашей любезной помощью.
 
И за напоминание о редиректе в stderr тоже спасибо.  
Но на самом деле я хотел бы ознакомиться с лучшей практикой организации средствами баша структурированного обработчика ошибок.
 
 
Добавлено:
 
И еще попутный вопрос. stderr в бхорке глобально перенаправлен в файл включением стандартной либы.
 
Есть ли более лаконичный способ перенаправлять текущие ошибки - что-нибудь вроде опять же флага, подменяющего stderr на том участке, где он включён?  
 
 
Добавлено:
 
Сдаётся мне, что я подкапываюсь сейчас под архитектуру юниксов.. Я не нарочно, деваться мне некуда: приму ответ такой, какой он есть.
 
 
Добавлено:
 
Вот пример:  
stmfadm list-view -l $guid
 
может возвращать два принципиально разных ответа: либо указанную ошибку "тра-ля-ля no views found", либо многострочный вывод, который надо разбирать для извлечения полезной инфы.
 
Как лучше закрыть подобную типичную проблему (вот этот пост именно закрывает проблему разбора многострочников, причём красивым образом)
 
 
Добавлено:
 
Можно ли в юниксах отличить по каким-то признакам "атомарную команду" - которая взаимоисключающим образом выдаёт что-то либо в stderr, либо stdout?
(если я понимаю дело правильно, сложные пайпы с большой вероятностью наваляют и туда, и сюда)

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 18:37 30-03-2012 | Исправлено: LevT, 19:57 30-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
> Дык вот зачем мне лишние знания, которые лягут мёртвым грузом
Решительно не понял, к чему это вы.
 
> Есть ли более лаконичный способ перенаправлять текущие ошибки  
> что-нибудь вроде опять же флага, подменяющего stderr на том участке, где он включён?
 
$ cat myexec
#!/bin/bash
exec 2> err.log
echo >&2 'Hello world!'
$ ./myexec
$ cat err.log
Hello world!

 
Кстати:
а) не думаю, что в том, что вы именуете «стандартной либой» это реализовано как-то иначе; неужели не нашли?
б) в «Advanced Bash-Scripting Guide» этому целая глава посвящена, можете почитать.
 
> я подкапываюсь сейчас под архитектуру юниксов
Чавой?
 
> может возвращать два принципиально разных ответа: либо указанную ошибку "тра-ля-ля no views found",  
> либо многострочный вывод, который надо разбирать для извлечения полезной инфы
На один и тот же дескриптор? О_о
 
> Как лучше закрыть подобную типичную проблему
Так какую проблему-то?
 
> Можно ли в юниксах отличить по каким-то признакам "атомарную команду" - которая взаимоисключающим образом выдаёт что-то либо в stderr, либо stdout?
Не понял.
 
> имхо, сложные пайпы с большой вероятностью наваляют и туда, и сюда
Не то, что не понял, а даже не распарсил.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:08 30-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Я согласен с непонятками 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:34 30-03-2012
LevT



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

Цитата:
Решительно не понял, к чему это вы.

 
к Вашему намёку на всемогущие маны, в которых содержатся ответы на все заданные вопросы ))
и кардинальным образом больше ответов на вопросы пока ещё даже не возникшие: для моего психотипа погрузиться в них означает обречь себя на DOS мозга
 
С предсказуемо жалким результатом, чему свежий пример grep -i.  Или ABSG, нужную главу которого я теперь уже прицельно пошёл перечитывать по Вашему совету, на сей раз с надеждой усвоить.  
 
 

Цитата:
Чавой?  

 
stderr УЖЕ перенаправлен куда-то стандартной либой. Знать не знаю куда (может, стандартная либа занимается какой-то динамической магией)
 
Хочу выделить блок кода, внутри которого ошибки будут перенаправлены в указанное по месту выделения место.
 
Хочу-то хочу, но боюсь, что моя хотелка нереализуема именно из-за архитектуры юникса как рантайма.
 
 

Цитата:
Не то, что не понял, а даже не распарсил.

 
"сложный пайп" - это то, что корректно в юниксах называется не то job, не то task.
Последовательность команд, принимающих вывод друг друга по цепочке.
 
Я пытаюсь изобрести свой рантайм в баше, ограничившись необходимым для меня минимумом "строительных блоков" и в меру возможностей (которую я как раз проясняю расспросами) дополнив высокоуровневую семантику. До такого состояния, чтобы прогу можно было собрать из красивых кирпичиков, без колебаний обойдясь без эстетически неприятных или не с ходу понятных конструкций.
 
Для того, чтобы вернувшись к своему коду скажем через год, я бы смог его сразу править, без обращения к манам и ABSG.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 20:50 30-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Думаю, что такое "сложный пайп" и так было понятно, а job и task это не сюда (ну не будем о них). Через pipeline уходит только stdout на stdin последующей команды, stderr стоит рядом и ждёт своего законного мусора.
Цитата:
Хочу выделить блок кода, внутри которого ошибки будут перенаправлены в указанное по месту выделения место.  
либо для каждой команды перенаправлять вывод, либо всё гораздо проще:
exec 5<&2    # сохранили текущие настройки в новый файловый дескриптор 5
exec 2>new_err.log   # запили новый вывод для ошибок
ls /qqq   # ошибка ушла в новый вывод
...   # еще с пяток команд с ошибками
exec 2<&5   # вернули настройки вывода ошибок в хз куда


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:32 30-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Спасибо, именно этого мне и не хватало.
Упд. А можно ли сами файловые дескрипторы сохранить в переменные?
 
В ABSG не вижу главы о структурной обработке ошибок: нужная инфа разбросана по разным местам.
 
 
Попробую опять с другого бока
 
Есть вот такая строчка
host_group=$(stmfadm list-view -l $guid | grep "Host group" | cut -d: -f 2)
 
Exit status у неё 0, $host_group на выходе пустая строка.
 
Как узнать в проге о случившейся ошибке и получить максимум информации о ней? (например, хотелось бы узнать, что ошибку с таким-то текстом выплюнула именно первая команда пайпа)

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 09:02 31-03-2012 | Исправлено: LevT, 09:19 31-03-2012
LevT



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

Может быть для этого можно обернуть интересные команды в свои инструментованные скриптики, обладающие нужными свойствами (например, сейчас мне кажется, что мне помогла бы "атомарность")?

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 11:32 31-03-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Во первых ошибка и так будет выдана в Ваш лог файл, если же Вы хотите на основании её что-то делать в скрипте, то вы не поверите, но ответ опять есть в man'е (хотя признаюсь в инете найти его проще)...
ls /qqq | wc -l   # очевидно что первая команда вернёт ошибку, а вторая 0
echo ${PIPESTATUS[0]}   # о чудо - bash хранит exit code каждой части строки с pipeline'ами!!!

 
кстати, zsh считает элементы массива с 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:38 31-03-2012 | Исправлено: Alukardd, 14:08 31-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Ну, сойдет. Спасибо!
 
я смотрю, PIPESTATUS определён всегда (пайпом считается даже единственная команда) - и это явно закрывающий проблему инструмент.
 
Проблему, которую создаёт несогласованная  реклама двух фич шелла (или юниксов как таковых?): пайпов и экзитстатусов.
 
 
А в манах имеет смысл что-то искать только при условии, что известно, чтО искать. Мне, кроме того, нужно и второе условие: известно, зачем нужно искать именно это (а не что-нибудь другое).
 
Маны описывают детали и не содержат архитектурного обзора, тем более его мотивационной части: почему сделано так, а не иначе? Какими предположениями об использовании инструмента руководствовались разработчики?
 
Я сперва спрашиваю себя, согласен ли я умерить свои хотелки до тех предположений, а затем изучаю (начиная с архитектуры) или адаптирую к себе инструмент, помаленьку пробуя его на прочность. И только по мере погружения в эту деятельность маны приобретают для меня значимость.
 
 
Иными словами, кроме манов и рекламы для чайников, есть третий род доков, с которыми, по-моему, не очень-то ладно в юниксах - архитектурно-мотивационные: не КАК делать что-то, а ЗАЧЕМ это делать, и ПОЧЕМУ предлагается делать это именно так, а не иначе.
 
(О существовании Робинсона и т.п. я в курсе: это не то, постольку, поскольку такого рода литература исходит из понимания юниксовой архитектуры как "божественной данности" - а не результата инженерного компромисса, достигнутого в определённых условиях)
 
 
Добавлено:
 
Оставшийся неясным на сегодня вопрос: существует ли способ придать динамику файловым дескрипторам в шелле? (насколько я понимаю, использовать вместо них переменные не прокатит)
 
Также вот этим индексам массива PIPESTATUS[0] я был бы не прочь придать значимости, динамически связав их с сопуствующей информацией. Готов ради этого изучить ещё какой-нибудь фреймворк, где такое реализовано.
 
Может, и сейчас в стандартном баше есть что-то для этой цели, помимо статического заглядывания в таблицу экзитстатусов, хранящуюся в голове скриптователя и-или грепанья предопределённых строк в логах?

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 14:46 31-03-2012 | Исправлено: LevT, 15:12 31-03-2012
Alukardd



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

Цитата:
литература исходит из понимания юниксовой архитектуры как "божественной данности" - а не результата инженерного компромисса, достигнутого в определённых условиях
Вы явно лезете туда куда не стоит... По крайней мере в рамках проблем решаемых Вами и нами. Архитектура тут именно как данность!

Цитата:
индексам массива PIPESTATUS[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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:38 31-03-2012
LevT



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

Цитата:
Разве что Вы сами будете создавать ассоциативный массив,

 
Я бы посмотрел фреймворк, который такое делает в фоне. Например, я согласен вызывать пайпы как-то так:
 

Код:
pipe "command1" "command2" ... "commandN"

с тем, чтобы после вызова мне была доступна расширенная инфа об ошибках.
 
Я согласен скармливать такому пайпу не всякую команду, а только обёрнутую в свой собственный скрипт, реализующий шаблонное расширение окружения.
Хорошо бы фреймворк во время исполнения сам чистил окружение или грамотно управлял субшеллами.
 
Наконец, рассмотрю варианты препроцессора (чтобы не шокировать подобным синтаксисом благонамеренных юниксоидов, привыкших к предопределённному виду пайпов).
 
 
Добавлено:
 

Цитата:
Вы явно лезете туда куда не стоит...

 
Дык покамест не лезу, а так, щупаю почву.
А вот стоит или не стоит - это вопрос личной мотивации, которая у всех разная.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:04 31-03-2012 | Исправлено: LevT, 16:24 31-03-2012
Alukardd



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

Цитата:
вызывать пайпы как-то так
можно написать такую функцию, навскидку она, даже, не сложная, но...

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:35 31-03-2012 | Исправлено: Alukardd, 16:37 31-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ещё один на мой взгляд недостаток PIPESTATUS-ов (насколько я ими успел проникнуться) - невозможность узнать статусы предыдущих пайпов.
 
Про (stmfadm list-view -l $guid | grep "Host group" | cut -d: -f 2) они рассказывают, а вот так уже нет:
host_group=$(stmfadm list-view -l $guid | grep "Host group" | cut -d: -f 2)  
 
Логично поручить это тому же фреймворку.
 
 
Добавлено:
 
Или, может... вместо фреймворка с препроцессором - масенький интерпретатор специально под описанную задачу созданного "языка описания пайпов" (написанный на том же баше, конечно), который бы для всей реальной работы запускал субшеллы в специально подготовленном для них окружении.
 
Впрочем, возможно я изобретаю велосипед, и в экосистеме юниксов такое уже присутствует
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 16:40 31-03-2012 | Исправлено: LevT, 16:54 31-03-2012
Alukardd



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

Цитата:
так уже нет
да, конструкция $() вызывается отдельно.
 
Повторюсь - ни что не мешает написать функцию 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:01 31-03-2012
LevT



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

Цитата:
можно написать такую функцию, навскидку она, даже, не сложная, но...

 
Ну да, продумать инфраструктуру (архитектуру исполнения и управляющий язык) определённо сложнее, а пока это не сделано, нет смысла писать отдельные функции под несуществующий рантайм.
 
Тут вопрос именно личной мотивации. Вас прикалывает решать задачки "вглубь", лазя по закоулкам манов - а меня другое, вот это вот самое: генерировать технически осмысленные мегазадачи, в надежде на то, что часть из них будут решены. Хотя бы с ростом брутальной силы окружающих гигагерц и контролируемой сложности систем.
 
 
Добавлено:
 

Цитата:
Причём здесь вообще система? Bash самый обычный интерпретатор.  

 
То, что PIPESTATUS-ы известны только для последнего пайпа - это фича системы или баша?
 
Но тема-то здешняя не только о баше, не так ли?

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 17:14 31-03-2012 | Исправлено: LevT, 18:41 31-03-2012
DrakonHaSh



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

Цитата:
либо для каждой команды перенаправлять вывод, либо всё гораздо проще:
exec 5<&2    # сохранили текущие настройки в новый файловый дескриптор 5
exec 2>new_err.log   # запили новый вывод для ошибок
ls /qqq   # ошибка ушла в новый вывод
...   # еще с пяток команд с ошибками
exec 2<&5   # вернули настройки вывода ошибок в хз куда
 

 
возник вопрос. а существует ли "консольная магия", позволяющая эмулировать tty ?
т.е. что-то, что делало бы возможным следующее:  
id
=>
uid=666(user) gid=666(user) groups=777(users)
 
exec /dev/tty1<&0; echo password $'\n' id | su;
=>
id uid=0(root) gid=0(root) groups=0(root)

Всего записей: 2077 | Зарегистр. 08-01-2008 | Отправлено: 18:36 31-03-2012 | Исправлено: DrakonHaSh, 19:12 31-03-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Могу ещё дополнить свой проект инструментовки транслятором обычного скрипта в программу на "языке управления пайпами" вкупе с шаблонами обёрток для команд (с #<TODO:> внутри).  
Готовые заполненные шаблоны могут выбираться из локальной библиотеки.
 
Впрочем, не исключаю что в экосистеме что-то для этой цели есть, и я изобретаю лисапед. )

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 19:12 31-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
> а существует ли "консольная магия", позволяющая эмулировать tty?
Крайне неудачная формулировка. Вы как бы постоянно пользуетесь именно эмулированным телетайпом. ;-)
 
> id
> =>
> uid=666(user) gid=666(user) groups=777(users)
 
Это, я так понимаю, следует читать так:
$ id
uid=666(user) gid=666(user) groups=777(users)

 
Тогда это вы, я так понимаю, пытаетесь обойти наложенный разработчиками по соображениям безопасности запрет на чтение рутового пароля не из терминала.
$ su <<< myrootpass
su: must be run from a terminal

 
Если да, то сразу это нельзя было написать, не запутывая нас заведомо ошибочными конструкциями вида su; id, вместо su -c id?
 
В качестве ответа могу сообщить, что наиболее детальный разбор этого вопроса я читал по адресу http://web.me.com/nissplus/SILKDOTCOM/SwimLanes/Entries/2008/8/3_SU_vs_TERMINAL.html

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
у-у, я в этом не участвую...
Я тут только по поводу shell'ов и скриптов к ним.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:11 31-03-2012
LevT



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

А я и не призываю никого заниматься чем-то ему несвойственным.
 
Но и к себе прошу такого же отношения - а именно не отсылать искать во "всемогущих манах" ответы на (возможно, неприятные) вопросы об ограничениях существующей архитектуры системы-шеллов-утилит:

Цитата:
То, что PIPESTATUS-ы известны только для последнего пайпа - это фича системы или баша?  

 
И на обратного рода вопросы тоже прошу ответы не скрывать, если они вдруг вам известны:

Цитата:
Впрочем, возможно я изобретаю велосипед, и в экосистеме юниксов такое уже присутствует  


Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 22:33 31-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
А если отвлечься от поиска уязвимости в su при проверке пароля, то писать во входной буфер произвольного tty, сиречь отдавать в него команды, вполне можно, но:
а) утилиты для этого среди дефолтных нету, но можно воспользоваться вот этой, что под названием ttyecho;
б) для этого нужны рутовые права ;-).
 
Писать во входной буфер того tty, с которого исполняемся, можно и с пользовательскими правами:
 
$ ttyecho -n $(tty) echo Ququ. # далее я ничего вручную не вводил
echo Ququ.  
$ echo Ququ.
Ququ.

 
Это применимо и из-под скриптов:
 
$ cat ttyechotest.sh  
#!/bin/bash
ttyecho -n $(tty) echo Ququ.
$ ./ttyechotest.sh # опять же, это последняя введенная мною команда
echo Ququ.  
$ echo Ququ.  
Ququ.


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
утилиты для этого среди дефолтных нету
# echo "some text" > /dev/pts/0
 
LevT

Цитата:
The following variables are set by the shell:
что бы Вас ни куда не посылать буду сам цитировать. Среди переменных и PIPESTATUS...
Ни чего подходящего под Ваши запросы я не встречал, да и не требовалось ни когда такого в моей практике.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:41 31-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
>> утилиты для этого среди дефолтных нету  
> # echo "some text" > /dev/pts/0
Цитата:
писать во входной буфер произвольного tty, сиречь отдавать в него команды, но утилиты для этого среди дефолтных нету

 
А для записи в выходной, кстати, суперпользовательские права не нужны. При условии, что это ваша tty, конечно.
$ echo "some text" > /dev/pts/0

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:49 31-03-2012 | Исправлено: ASE_DAG, 22:50 31-03-2012
LevT



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

Цитата:
что бы Вас ни куда не посылать буду сам цитировать.

 
Я всё же полагаю, что это от того, что разработчикам шелла не показалось нужным проложить более толстую прокладку над ЭТИМ МЕСТОМ системы (а над другими вполне показалось: выбор произвольный, под влиянием их тогдашних обстоятельств и приоритетов)
 
Это не означает, что их тогдашний выбор стал "божественной данностью".
 
Я считаю себя равноправным субъектом, способным интересоваться их мотивами и желать исправления всплывающих со временем ограничений. Например,  мне кажется, что на современных компах можно не экономить на использовании субшеллов.
 
 
Добавлено:
 
В то же время, вероятно есть какие-то базовые для юникса ограничения, которые можно выкинуть только вместе с юниксом как рантаймом (например, в пользу жабы какой-нибудь или powershell)
 
Как Вы думаете, относятся ли сюда проблемы интерпретации содержимого stderr и запоминания серии экзитстатусов (не только последнего пайпа)?
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 22:55 31-03-2012 | Исправлено: LevT, 23:08 31-03-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
> ...желать исправления всплывающих со временем ограничений. Например...
mailto:bug-bash@gnu.org?subject=Feature%20Request%3A

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

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



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:06 31-03-2012 | Исправлено: Alukardd, 23:06 31-03-2012
LevT



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

А почему технические проблемы с свободными инструментами должны решаться непременно с помощью метода гуманитарного - петиций к разработчикам и т.п. "политической" активности? Для меня лично этот метод даже затратнее затеи соорудить собственный фреймворк, расширяющий рантайм.
 
Кроме того, даже если такая петиция будет удовлетворена через некое время в новой версии баша - это мне не поможет: обновлять баш на невнятных деривативах соляры я не рискну.
 

Цитата:
В то же время, вероятно есть какие-то базовые для юникса ограничения, которые можно выкинуть только вместе с юниксом как рантаймом (например, в пользу жабы какой-нибудь или powershell)
 
Как Вы думаете, относятся ли сюда проблемы интерпретации содержимого stderr и запоминания серии экзитстатусов (не только последнего пайпа)?
 

 
Поскольку выкидывать юникс-рантайм я никак не могу: шанс управлять моими таргетами покамест предоставляет мне только он, мне В ТАКОМ (см. самоцитату) СЛУЧАЕ остаётся примириться с его аутизмом в некоторых областях. ((
 
 

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 23:22 31-03-2012 | Исправлено: LevT, 00:13 01-04-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможности метода петиций ограничены самой технической реальностью.  
 
Для разработчиков баша приоритетна совместимость с существующими скриптами; по этой причине язык невозможно бесконечно гнуть под влиянием разнонаправленных векторов: имхо, он и так уже не блещет красотой из-за трудного прошлого. Я понимаю их вероятное стремление оставаться в каких-то важных для них, а для меня непонятных рамках и уважаю их решение.
 
Но язык это тоже всего лишь инструмент, как и рантайм. По большому счету, приоритетны люди, их цели, их свободы от технически немотивированных ограничений и даже эстетические вкусы и причуды (поскольку они физически обеспечены дармовыми гигагерцами-иопсами): если возможности существующих языков и рантаймов перестают тем удовлетворять, ничто не мешает создавать более подходящие инструменты.  
 
А также использовать существующие неожиданным и непривычным образом, по соображениям экономии личных ресурсов.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 08:57 01-04-2012 | Исправлено: LevT, 09:45 01-04-2012
SIgor33

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вопрос в crone запускаю скрипт в котором хочу остановить glassfish cron настроен на работу от пользователя который запустил glassfish
скрипт выглядит  
#!/bin/bash
cd /home/umms/
/home/umms/usr/glassfish3/bin/asadmin stop-domain
glassfish почему-то не стопиться а если запускаю скрипт из командной строки все отрабатывается подскажите что сделать чтобы он из крона пахал

Всего записей: 652 | Зарегистр. 03-03-2009 | Отправлено: 15:06 01-04-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SIgor33
акакаянеобходимостьвскрипте · здесьвсегооднастрочканужна · /home/umms/usr/glassfish3/bin/asadmin stop-domain · ееивпишитевкронтаб · адабыотследитьгдеошибкаперенаправьтевыводвфайл · $HOME/usr/glassfish3/bin/asadmin stop-domain >> $HOME/var/asadmin.log 2>&1

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:32 01-04-2012 | Исправлено: ASE_DAG, 17:52 01-04-2012
DrakonHaSh



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

Цитата:
В качестве ответа могу сообщить, что наиболее детальный разбор этого вопроса я читал по адресу http://web.me.com/nissplus/SILKDOTCOM/SwimLanes/Entries/2008/8/3_SU_vs_TERMINAL.html

это шаманство заюзать мне не получилось - у меня оно в BackTrack не работает. У вас получилось ?
 

Цитата:
а) утилиты для этого среди дефолтных нету, но можно воспользоваться вот этой, что под названием ttyecho;
б) для этого нужны рутовые права .  

за прогу спасибо, но толку от нее, раз рут для запуска всегда обязателен.
 
нашел решение попроще и поуниверсальнее:

Код:
#!/usr/bin/expect
spawn su
sleep 1
send "toor\r"
sleep 1
send "id\r"
interact

Всего записей: 2077 | Зарегистр. 08-01-2008 | Отправлено: 23:15 01-04-2012 | Исправлено: DrakonHaSh, 23:17 01-04-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
> но толку от нее, раз рут для запуска всегда обязателен
Отнюдь не всегда. Вы как-то выборочно читаете. ;-)
ASE_DAG (22:33 31-03-2012)
Цитата:
Писать во входной буфер того tty, с которого исполняемся, можно и с пользовательскими правами:

Но ввести рутовый пароль таким образом у меня не получилось, хотя команды, как я и показал выше, отдаются корректно.
 
> #!/usr/bin/expect
Любопытная штука. Спасибо, запишу себе в блокнотик.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Я, надеюсь, вы только о строке определения интерпретатора...
 
DrakonHaSh
sleep юзать в expect это не гуманно, только если вы совсем на разных системах хотите её запускать...
Я бы сделал так:
Код:
spawn su
expect Пароль {send "myPassWorD\r"}
expect # {send "id\r"}
interact


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:54 01-04-2012
DrakonHaSh



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

Цитата:
> но толку от нее, раз рут для запуска всегда обязателен
Отнюдь не всегда. Вы как-то выборочно читаете.  

вы наверное про это:

Цитата:
Писать во входной буфер того tty, с которого исполняемся, можно и с пользовательскими правами.

если у меня уже есть tty, с которого я исполняюсь, то я могу и ручками пароль ввести. меня интересует возможность *стандартными средствами и утилитами bash/*nix, которые уже почти 100% есть в системе* (сорри за непрофиональную формулировку) создания tty (не имея tty - например от учетки, у которой шел стоит a la /bin/false) и возможности работы с ним - в частности запуска и ввода пароля в su.
 
Alukardd

Цитата:
sleep юзать в expect это не гуманно, только если вы совсем на разных системах хотите её запускать...  

я как раз стараюсь ориентироваться не на гуманность, а на практичность и *универсальность*

Всего записей: 2077 | Зарегистр. 08-01-2008 | Отправлено: 11:10 02-04-2012 | Исправлено: DrakonHaSh, 11:13 02-04-2012
LevT



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

Нашёл вроде бы годную книжку под свои запросы:
Chris_F.A._Johnson-Pro_Bash_Programming__Scripting_the_GNU_Linux_Shell_(Expert's_Voice_in_Linux)(2009).pdf
 
 
Добавлено:
 
Я их сам неверно формулировал. Мне надо было в первую очередь научиться грамотно обходиться с конфигурационными файлами и манипулировать своими данными.
Для этого в книжке есть главы Runtime Configuration и Data Processing

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 09:09 03-04-2012 | Исправлено: LevT, 09:30 03-04-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
> Chris_F.A._Johnson-Pro_Bash_Programming__Scripting_the_GNU_Linux_Shell_(Expert's_Voice_in_Linux)(2009).pdf
А я бы на вашем месте и ссылку какую-нибудь привел, поприличнее. Вот, например:
http://uod.ac/it/wp-content/uploads/2011/04/Pro-Bash-Programming-Scripting-the-GNU-Linux-Shell-Expert-039-s-Voice-in-Linux.pdf
 
Тем паче, что имя файла в вашем виде не гуглится абсолютно никак.

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

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



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

ну, я взял из библиотеки genesis именно в таком виде  
там в нескольких вариантах
Прямую ссылку специально не стал давать, чтобы зря библиотекарей не подставлять.

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 15:56 03-04-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите пожалуйста (г)авком распознать вот такую структуру (это родная выдача stmfadm list-view -l $guid)
 

Цитата:
600144F099D1040000004F3113870001
View Entry: 0
    Host group   : vmware
    Target group : vcenter
    LUN          : 1
View Entry: 1
    Host group   : windows
    Target group : wincluster
    LUN          : 0
 

 
 
Добавлено:
По смыслу здесь guid-у сопоставлена таблица БД
Первичный её ключ viewentry (автоинкремент)
 
В рабочем конфиге как минимум не может быть совпадающих триплетов (hg, tg, lun).
Есть и ещё какие-то "бизнес-правила", которые мне только предстоит выяснить.
 
Например, ограничение на комплект подобных файлов: номера LUN произвольны, но архитектура SCSI требует, чтобы у каждого таргета имелся как минимум LUN 0 (т.е. чтобы для каждой tg хотя бы в одном файле присутствовал LUN:0).  В рабочем конфиге это последнее правило не энфорсится, но последствия его нарушения для инициаторов бывают печальны.
 
 
Добавлено:
 
Второй вопрос.
 
Вот здесь есть небольшая проблема с последним снипетом (Redirecting Input):
входной файл должен заканчиваться \n
 
Как её лучше закрыть в этом и всех других вариантах, где она потенциально может встретиться?

Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 09:14 04-04-2012 | Исправлено: LevT, 10:33 04-04-2012
Maximus777

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

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 14:03 17-04-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
А "Строка первая" и т.д. имеют какой-то особый конец? Например, точка обязательно есть, а до этого её не было?..

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:53 17-04-2012
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:06 17-04-2012
Maximus777

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

Код:
Строка первая. Строка первая.
Строка вторая. Строка вторая.
...
Последняя строка. Последняя строка.


 
Самое главное условие то, что в строках фразы дублируются. Вот эти дубли и надо срезать. Насчёт точки хз.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 15:13 17-04-2012 | Исправлено: Maximus777, 15:17 17-04-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ладно поглумились и хватит)
Вот команда:
sed -r 's/(.*)[[:blank:]]*\1/\1/' /tmp/testfile

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:16 17-04-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
sed -r 's/(.*)[[:blank:]]*\1/\1/' /tmp/testfile

Работает. Спасибо.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 15:20 17-04-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Кстати, для справки - я Вам не сообщил ни чего такого чего нельзя было бы узнать элементарным запросом в гугл (первая же ссылка).

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:39 17-04-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пробовал, не осилил. Я спрашивал так "sed поиск повторов" и "sed поиск дубликатов".

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 17:07 17-04-2012
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Maximus777
"чтобы воспользоваться поиском УСПЕШНО, надо знать, что именно искать" (с)
 
1) Причём совет "задавай вопросы правильно!" - пустая отмазка. Откуда получатель такого совета возьмёт правильный критерий правильности?
"Задавай вопросы правильно" это отсылка к общему контексту. Ошибочно предполагается, что правильный критерий един и всем известен по умолчанию.
 
2) Даже правильный ответ на правильно заданный вопрос может быть человеком вне контекста:
- интерпретирован неверно (как нерелевантный), пошел дальше искать
- не понят или не усвоен (попробовал - не получилось, пошел дальше искать; или не знает даже, как попробовать, не затрачивая на этот проект запретительно много личного ресурса).
 
Помогать людям "удочкой, а не выловленной рыбкой" много затратнее, чем предполагают обычно линуксоиды. Лучше промолчать, чем отсылать "в гугль" или "в маны".

 
Добавлено:
 
Ищущий на самом деле оптимизирует не один параметр, а больше. То что ему нужно РЕАЛЬНО - это не найти ответ на свой сиюминутный вопрос, а встроиться в правильный контекст, в котором его цель достигается с минимумом затрат. Если цена связывания личного интерпретатора с правильным контекстом для него запретительно высока, он будет искать более затратные пути. (До некоторого предела, который он готов на свою цель потратить - превысив который, он бросит это занятие, отчаявшись.)
 
Реально помочь людям "удочкой" можно, лишь облегчая им связывание с полезными для них контекстами. Это тоже работа, и нелёгкая. К тому же, обычно несвойственная технарям, потому что требует не столько технических, сколько коммуникатвных навыков.


Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 19:17 17-04-2012 | Исправлено: LevT, 19:53 17-04-2012
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT,
подписываюсь под каждым словом. Если бы мне здесь не выдали "рыбку", скорее всего я бы её не поймал

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 20:07 17-04-2012
Alukardd



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

Цитата:
То что ему нужно РЕАЛЬНО - это не найти ответ на свой сиюминутный вопрос, а встроиться в правильный контекст, в котором его цель достигается с минимумом затрат.
вот с данной фразой да, во многом согласен. Однако я тоже выражение дал не из своей "бездонной" памяти, а с этого примера построил. Возможно мне немного проще искать т.к. я чутка "в теме". Однако умение правильно строить поисковые запросы это тоже не пустой звук и тут даже хз как и чему учится... Мне еще оочень сильно помогает персонализированная выдача, за несколько лет поиска, имея гуглоакк, она весьма приятна - разница видна, когда ищу не залогинившись, так же влияет установленный язык по умолчанию английский.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:10 18-04-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите как реализовать сравнение слова по маске?
Например, есть маска "internet", подходящие совпадения будут "i", "in", "int" ... "internet".
Сравнение возможно производить начиная с любого символа (ну это не фокус, просто лишнюю часть можно вытащить за пределы конструкции).
 
На чём всё это надо написать? Ну вообще на QRegExp. Оно весьма похоже на обычные регулярки для sed или awk.
p.s. Вумных программистов сразу предупреждаю: мне нужно сделать это через QRegExp, т.к. это составная часть сложной строки и заниматься её разбором через split() и пачку if'ов очень запарно и легко запутаться. Посему не надо кричать что startWith() выполняет нужное мне действие. Самому абыдно, что под рукой инструмент, но тут он бессилен.
Хотя если такую регулярку не написать, то придётся выстроить костыль
 
Добавлено:
Вариант с костылями почти точно отменяется т.к. от QRegExp я получил еще очень приятный бонус, так что вопрос очень актуален.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:42 15-05-2012 | Исправлено: Alukardd, 22:14 15-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Подскажите как реализовать сравнение слова по маске?
> Например, есть маска "internet", подходящие совпадения будут "i", "in", "int" ... "internet".
На PCRE? Как бы элементарно, не?
 

Код:
#!/usr/bin/perl
 
$mystr = 'int';
$mymask = 'internet';
print 'Y' if $mymask =~ $mystr . '.*';

 
Вы по-видимому что-то иное имели в виду, но из ваших общих слов больше ничего не понятно. :-)
Так что, давайте код, и наверное не сюда (какое отношение эта ветка имеет к Кутэ), а куда-нибудь в форум «Прикладное программирование».

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Не-не-не, мне именно сюда Пофигу на Qt. Мне регулярку написать надо, а про QRegExp я уточнил только для того что бы вы понимали чем мы ограничены или наоборот.
 
Я может чего-то не понимаю, конечно... Полностью проблема выглядит так:
Есть фраза "we have very slow internet", по сути это максимальная маска. Нужно проверить входящую фразу, в которой слова могут быть сокращены до произвольного числа букв, но не менее 2-х скажем. Т.е. фраза "we hav very sl inter" должна пройти. Вот такую канитель надо получить.
Вопрос - как должна выглядеть маска? Бить на отдельные слова вариант не совсем удобоваримый.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:08 16-05-2012
ASE_DAG



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

Код:
#!/usr/bin/perl
 
$myinput = 'we hav very sl inter';
$myregex = 'we ha(?:v(?:e)?)? ve(?:r(?:y)?)? sl(?:o(?:w)?)? in(?:t(?:e(?:r(?:n(?:e(?:t)?)?)?)?)?)?';
print 'Y' if $myinput =~ $myregex;


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

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

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

Код:
#!/bin/bash
# This only works thanks to a sane structure of host sections
echo '' > users.txt
 
for H in $(awk '/^host/{print $2}' < dhcpd.conf);  
do  
    M=$(grep -A 1 " ${H} " dhcpd.conf \
        | awk '/hardware ethernet /{gsub(";","",$3); print $3}') ; # get the MAC address
 
    A=$(grep -A 2 " ${H} " dhcpd.conf \
        | awk '/fixed-address /{gsub(";","",$2); print $2}') ;     # get the associated IP
    N=$(echo "" | awk -v n=${H} '{print tolower(n);}');
    echo 4,${N},${M},${A}  >> users.txt
done

Заранее благодарен.

Всего записей: 6 | Зарегистр. 16-03-2012 | Отправлено: 10:44 18-05-2012
ASE_DAG



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
armaturator
Что вообще за изврат... Не проще ли это было чистым 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.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> изврат
Кстати, как там ваш QRegExp поживает?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
armaturator
> Здесь, на первый взгляд, только элементы синтаксиса на позиксные заменить
Ну, то есть ${var} на $var, $(cmd) на `cmd`, да здесь и все, вроде бы.
 
А вообще, как заметил т. Алукард, это не мешало бы и переписать.


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Кстати, как там ваш QRegExp поживает?
времени не было, завтра доберусь. А можно его прокомментировать? Я сначала думал что ? должен стоять для целых групп (), но у Вас не так. Так же я не понимаю что делает :. В awk у меня оно на вскидку не отработало как надо.
gawk '{print $0 ~ /so(?:m(?:e)?)? stri(?:n(?:g)?)?/ ? "Y" : "N";}' <<< "some string"
На QRegExp не было возможности еще проверить, как уже сказал - завтра.
 
Или ?: кострукция это if??? Правда мне от этого не стало понятнее как прочесть regexp.
 
Добавлено:
ВАЙ! В awk я добился результата, завтра в программе все с QRegExp проверю.
Надо просто удалить все ваши ?: - как я уже сказал хз что они там делают. И оставить просто вложенный конструкции (m)?, где m следующий символ. И обязательно ограничить начало и конец ^$.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:22 18-05-2012 | Исправлено: Alukardd, 00:15 19-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Или ?: кострукция это if?
> ?: - как я уже сказал хз что они там делают

Цитата:
Если группа используется только для группировки и её результат в дальнейшем не потребуется, то можно использовать группировку вида (?:шаблон). Под результат такой группировки не выделяется отдельная область памяти и, соответственно, ей не назначается номер. Это положительно влияет на скорость выполнения выражения, но понижает удобочитаемость.
 
Регулярные выражения // Википедия

 
> В awk у меня оно на вскидку не отработало
А с чего ему работать? АВК не поддерживает PCRE, остановившсь в развитии на ERE. Зачем вы вообще его взяли? Я же на Перле пример привел.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Я же на Перле пример привел.
это я вижу.
Цитата:
АВК не поддерживает PCRE, остановившсь в развитии на ERE
а вот это честно, новость для меня.
 
Проверил - в QRegExp пашет и с ?: и без него. По скольку скорость мне не важна (сравнение с единичной строкой, а не по большому объёму данных) я воспользуюсь лучше удобочитаемостью...
Спасибо.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:13 19-05-2012
ASE_DAG



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

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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 19:15 19-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> А как еще регулярку создать?
В смысле «как»? Машиной. Вы же программу пишите, нет?
Я, например, даже единичный пример (что выше) не рискнул писать руками, зная, что обязательно обсчитаюсь в количестве скобочек или иных значков, а написал кусочек быдлокода:
 

Код:
#!/usr/bin/perl
$mystr = 'we have very slow internet';
@words = split (' ', $mystr);
for my $j (0 .. $#words) {
    @chars = split ('', $words[$j]);
    for my $i (0 .. 1) {
        print $chars[$i];
    }
    for my $i (2 .. $#chars) {
        print '(?:' . $chars[$i];
    }
    print ')?' x ($#chars-1);
    print ' ';
}


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

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



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть некий файл fstab. В нём разделы прописаны по UUID. Начальная версия этого файла неизменна. Все дальнейшие действия производятся над его копией.
С помощью скрипта создается три раздела. Естественно надо, чтобы их UUID фигурировали в копии файла fstab.
Данную задачу я реализовал двумя способами:
1. С помощью tune2fs менял UUID разделов с фс ext4, вытаскивая их из исходного файла fstab. А UUID свопа задавал при создании. Однако кривизна решения в том, что нет уникальности id разделов, что не принципиально, но и не все версии mkswap поддерживают параметр -U.
2. Выдёргиваем из fstab UUID и полностью переписываем fstab с нуля. В этом случае получается какой-то громоздкий код, а хочется ещё и красивости решения.
Конечно можно воспользоваться sed`ом, но тогда кода всё равно будет не меньше. Да и три раза придётся перечитывать файл. Как быть?


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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 17:15 20-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Извините, я не понял проблемы. Чего вы вообще хотите сделать?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Упрощаем.
В файле fstab есть три "левых" UUID. Их надо заменить на три текущих. Как сделать это практичнее?

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 18:26 20-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
> Как сделать это практичнее?
Практичнее использовать метки, а не UUID’ы.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Практичнее использовать метки, а не UUID’ы.
uuid обычно всегда есть, в отличии от метки...
 
urodliv
изначально суть задачи и наши действия тоже не понял...
Цитата:
Упрощаем.
В файле fstab есть три "левых" UUID. Их надо заменить на три текущих. Как сделать это практичнее?
упрощение, кажется, чрезмерно... Откуда взять соответствие левых и текущих, что бы менять?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:06 21-05-2012
urodliv



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

Цитата:
Откуда взять соответствие левых и текущих, что бы менять?

Допустим в исходном файле есть есть три интересующие записи:
UUID=сссссссс-сссс-сссс-сссс-сссссссссссс         /               ext4    errors=remount-ro 0       1
UUID=hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhh   /home           ext4    defaults        0       2
UUID=ssssss-ssss-ssss-ssss-ssssssssssss     none            swap    sw              0       0
 
И допустим, что после создания разделов команда blkid -s UUID выдаёт:
/dev/[hs]da1: UUID="86d14270-3dc2-45c4-a7b3-6ed19f97ec6d"  
/dev/[hs]da2: UUID="04c07c50-f807-4b2e-b3c8-3cade70ba247"  
/dev/[hs]da3: UUID="0e8fe39f-1b56-4d1d-b013-81c5bc3d6008"
 
Заранее известно, что /dev/[hs]da1 всегда своп-раздел, /dev/[hs]da2 - корневой раздел, а /dev/[hs]da3 - "домашний" раздел. Вот и надо поменять UUID`ы из fstab`а значениями из blkid.

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 01:44 21-05-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Ну тогда я вижу это так:
  • Новые uuid - /tmp/new_uuid_file
    Код:
    /dev/sda1: UUID="AAA"
    /dev/sdb1: UUID="BBB"

  • То, что заранее известно оформлено в файле /tmp/correlations:
    Код:
    /dev/sda1: /home
    /dev/sdb1: swap

  • Скрипт выглядит так:
    Код:
    #!/usr/bin/awk -f
    function ltrim(s) { sub(/^[ \t]+/, "", s); return s }
    function rtrim(s) { sub(/[ \t]+$/, "", s); return s }
    function trim(s)  { return rtrim(ltrim(s)); }
    BEGIN {
        file = "/tmp/new_uuid_file";
        cor="/tmp/correlation"
        FS=":";
        # reading correlation of mount points and partions
        while (getline < cor) {
            c[trim($1)] = trim($2);
        }
        while (getline < file) {
            uuid[trim($1) in c ? c[trim($1)] :""] = trim($2);
        }
        FS="[[:blank:]]+";
    }
    /^[^#]/{
        if ($2 in uuid)
            gsub(/.*/,uuid[$2],$1);
        if ($3 in uuid)
            gsub(/.*/,uuid[$3],$1);
        print;
    }
    /^#/{print;}
    Запускать так: /tmp/script.awk /etc/fstab
    Весь результат вывалится на stdout.
     
     
     
    Добавлено:
    Скажем так - код получился весьма не маленький, зато по каждому файлу пробежались ровно один раз. :-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.

  • Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:12 21-05-2012
    armaturator

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    есть  файл с такой структурой
    name|number|id
    разделение используется именно "|"
    как мне его роспарсить чтобы при проверке айди "id" имя "name" "выводилось" писалось  в такой-то файл, если айди "id" такой-то то имя "name" в такой-то файл

    Всего записей: 6 | Зарегистр. 16-03-2012 | Отправлено: 15:29 22-05-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    armaturator
    Я не до конца распарсил отправленный вами набор слов, но думаю, посмотрев на пример ниже, вы легко сделаете, что вам нужно.
     
    $ gawk -F '|' '$3 == "foo" { print $1 > "foofile" }  $3 == "bar" { print $1 > "barfile" }'

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

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

    Всего записей: 6 | Зарегистр. 16-03-2012 | Отправлено: 16:44 22-05-2012
    slech



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста как можно разобрать текстовые блоки ?
     
      - ResourceRecordSetCount: 6
        CallerReference: 96b6713d
        Config:
        Id: /hostedzone/ZNRT8675
        Name:domain.ru
      - ResourceRecordSetCount: 2
        CallerReference: 0c15b044
        Config:
        Id: /hostedzone/Z3IJLT5
        Name: domain.com.
     
    на выходе нужно получить  ZNRT8675 и  domain.ru и выполнить операцию экспорта, и так по всем блокам

    Код:
     
    zonename=ZNRT8675
    zoneid=domain.ru
    #
    cli53 export $zoneid --full >$zonename
    ....
     

     
    Спасибо.

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 02:15 24-05-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    slech
    Ну если данные промежуточные не нужны то можно так:
    Код:
    gawk -F':' '/^[[:blank:]]*Id/{id=$2;} /^[[:blank:]]*Name/{system("cli53 export "id" --full > "$2)}' /tmp/source
    в противном случае можно 2 скрипта сделать: 1 - просто вытащит пары, 2 - выполнит команду для каждой пары. Мне просто лениво было и я в 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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:39 24-05-2012
    slech



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    Спасибо.
     
    Почти всё работает, у меня не /hostedzone/Z3IJLT5  а просто  Z3IJLT5.
    Т.е. из /hostedzone/Z3IJLT5 нужно получить Z3IJLT5

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 19:29 24-05-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    slech
    проморгал...
    щас в баньку схожу - потом напишу там просто gsub() надо добавить вокруг id... Можеш погуглить или в мане глянуть. Убёг)

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:11 24-05-2012
    Alukardd



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

    Код:
    gawk -F':' '/^[[:blank:]]*Id/{id=$2;} /^[[:blank:]]*Name/{system("cli53 export "gensub(/.*\//,"","",id)" --full > "$2)}' /tmp/source
    Разумеется это именно для gawk, для 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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:38 24-05-2012
    ForposT_ForeveR



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здравствуйте.
    Вопрос по регулярному выражению для grep.
    Имеется такой вот списочек:
     
    100890!ACE TENNIS NET !58 !46.4 !01-JAN-89
    100860!ACE TENNIS RACKET I !35 !28 !01-JUN-90
    100861!ACE TENNIS RACKET II !45 !36 !01-JUN-90
    100870!ACE TENNIS BALLS-3 PACK !2.8 !2.4 !01-JAN-90
    100871!ACE TENNIS BALLS-6 PACK !5.6 !4.8 !01-JAN-90
    101860!SP TENNIS RACKET !24 !18 !15-FEB-89
    101863!SP JUNIOR RACKET !12.5 !9.4 !15-FEB-89
    102130!RH: "GUIDE TO TENNIS" !3.4 !2.8 !18-AUG-89
    200376!SB ENERGY BAR-6 PACK !2.4 !1.75 !15-NOV-90
    200380!SB VITA SNACK-6 PACK !4 !3.2 !15-NOV-90
    103120!WIFF SOFTBALL BAT I !25 !20 !01-JUN-90
    103121!WIFF SOFTBALL BAT II !30 !24 !01-JUN-90
    103130!WIFF SOFTBALL, SMALL !4.2 !3.6 !01-JAN-90
    103131!WIFF SOFTBALL, LARGE !4.5 !3.9 !01-JAN-90
    103140!WIFF SOFTBALL MITT (LH) !20 !15 !15-FEB-89
    103141!WIFF SOFTBALL MITT (RH) !20 !15 !15-FEB-89
    102132!RH: "GUIDE TO SOFTBALL" !3.4 !2.8 !18-AUG-89
    104350!DUNK BASKETBALL INDOOR !44 !35.3 !01-JUN-90
    104351!DUNK BASKETBALL OUTDOOR !26 !20.8 !01-JUN-90
    104352!DUNK BASKETBALL PROFESSIONAL!58.3 !40.8 !01-JUN-90
    104360!DUNK HOOP !39 !32 !01-JAN-90
    104361!DUNK HOOP W/FIBERGLASS BOARD!50 !35 !01-JAN-90
    104362!DUNK NETS - RAINBOW !5 !4 !15-FEB-89
    102134!RH: "GUIDE TO BASKETBALL" !3.4 !2.8 !18-AUG-89
    105123!YELLOW JERSEY BICYCLE HELMET!40 !34 !01-JUN-90
    105124!YELLOW JERSEY BICYCLE GLOVES!15 !10 !01-JUN-90
    105125!YELLOW JERSEY WATER BOTTLE !3 !2.6 !01-JAN-90
    105126!YELLOW JERSEY BOTTLE CAGE !6 !5 !01-JAN-90
    105127!YELLOW JERSEY FRAME PUMP !6 !5 !15-NOV-90
    105128!YELLOW JERSEY SADDLE PACK !10 !8 !15-NOV-90
    102136!RH: "GUIDE TO CYCLING" !3.4 !2.8 !18-AUG-89
     
    Подскажите, пожалуйста, как получить строки, которые содержат слово YELLOW и заканчиваются на цифру 90.
    Пробовал grep "YELLOW*90$" myfile.txt, не помогает.
    Отдельно "YELLOW" и "90$" отрабатывают.

    Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 23:45 24-05-2012
    slech



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

    Код:
     
    grep ".*YELLOW.*90$" s.txt
     

     
    Добавлено:
    Alukardd
    эх, банька ....
    спасибо большое. отработало на 5 +

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 23:52 24-05-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вопрос
    dendodor
    Цитата:
    Помогите написать скрипт в Debian Linux след характера. Необходимо рекурсивно найти в некотором каталоге все файлы и их имена записать в файл Temp.txt построчно

    Код:
    find /some/catalog -type f -printf '%f\n' > Temp.txt


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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:33 27-05-2012
    dendodor



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd, спасибо БОЛЬШОЙ!!!!

    Всего записей: 158 | Зарегистр. 27-11-2008 | Отправлено: 23:32 27-05-2012
    urodliv



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

    Цитата:
     
    Люди, помогите пожалуйста написать скрипт. Скрипт принимает в переменную имя файла и ищет все файлы с этим именем.

     
     

    Код:
     
    #! /bin/bash
    find / -iname $1  


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

    Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 23:21 06-06-2012 | Исправлено: urodliv, 23:22 06-06-2012
    blaro



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

    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 23:31 06-06-2012
    urodliv



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

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

    Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 23:54 06-06-2012
    king_stiven

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 20:42 11-06-2012
    ASE_DAG



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

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

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

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

    Цитата:
     
    Download using a local torrent file
    aria2c -u40K /path/to/file.torrent
    You can download multiple torrents.  
    aria2c /path/to/file1.torrent /path/to/file2.torrent
     

    Проверил, работает в параллель.

    Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 20:57 11-06-2012
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Просто думал запускать вместо utorrent, а там несколько сот торрентфайлов.
     
    Добавлено:
    Alex_Piggy
    А раздавать несколько сот торентов?

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 20:57 11-06-2012
    Alex_Piggy

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

    Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 21:16 11-06-2012 | Исправлено: Alex_Piggy, 00:06 12-06-2012
    slech



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

    Код:
     
    ipfile=ip.txt
    from="from_admin"
    date=$(date +"%Y-%m-%d_%H-%M")
    #
    #
    for n in $(for n in $(seq --format=%04.f 171 249)
    do
    #   echo $n
    awk -v n="$n" -v date="$date" -v from="$from" '{print "name " $1 " Blocked_" n " description " date "_" from}' $ipfile
    done
     

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

    Цитата:
     
    name 99.99.99.98 Blocked_0248 description 2012-06-14_09-10_from_admin
    name 99.99.99.99 Blocked_0249 description 2012-06-14_09-10_from_admin
     

     
     
    Мой же скриптик проходит по каждой строке и по ней добавляет диапазон.
     
    Как можно пройтись по файлику ip.txt и каждой строке рибавить число из диапазона ?
     
    Спасибо.
     
    Добавлено:
    Заработало вот так:

    Код:
     
    startn="170"
    ipfile="ip.txt"
    comment="from_admin"
    date=$(date +"%Y-%m-%d_%H-%M")
    #
    nl -v $startn -nrz -w4 $ipfile | awk -v n="$n" -v date="$date" -v comment="$comment" '{print "name " $2 " Blocked_" $1 " description " date "_" comment}'
     

     
    ил вот так

    Код:
     
     awk -v startn="$startn" -v date="$date" -v comment="$comment" 'BEGIN{i=startn} /.*/{printf "name " $0 " Blocked_%.4d% s\n",i," description " date"_"comment; i++}' $ipfile
     

     

    Цитата:
     
    name 99.99.99.90 Blocked_0245 description 2012-06-14_10-35_from_admin
    name 99.99.99.91 Blocked_0246 description 2012-06-14_10-35_from_admin
    name 99.99.99.92 Blocked_0247 description 2012-06-14_10-35_from_admin
     

    Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 13:17 14-06-2012 | Исправлено: slech, 16:18 14-06-2012
    bsnvolg



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

    Код:
    #!/bin/sh
     
    curl http://www.nnvv.org/ | \
    grep -A2 Update.*`date +%Y-%m-%d` | \
    awk '{if(sub(/<p>Username:/,"USERNAME=")) \
    {if(sub(/<br\/>Password:/,"PASSWORD=")) \
    {if(sub(/<\/p>/,"")) { print $1"\n"$2}}}}' > pass.sh

     
     
    После его выполнения создается файл pass.sh но он пустой.
    Что подправить?

    Всего записей: 334 | Зарегистр. 07-12-2002 | Отправлено: 13:11 06-07-2012 | Исправлено: bsnvolg, 15:20 06-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bsnvolg
    Мне проще было переписать...
    Код:
    #!/bin/sh
     
    curl http://www.nnvv.org/ | gawk -v FS=':|<br \/>' -v RS='p>' '/Username:/{print "USERNAME="$2" PASSWORD="gensub(/<\//,"","g",$4)}' > accounts.txt
    Обратите внимание, что я использовал GNU AWK, а не классический AWK. Ну и сваливает свой результат он в accounts.txt

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:14 06-07-2012 | Исправлено: Alukardd, 15:15 06-07-2012
    bsnvolg



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

    Всего записей: 334 | Зарегистр. 07-12-2002 | Отправлено: 15:23 06-07-2012 | Исправлено: bsnvolg, 15:45 06-07-2012
    Alukardd



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

    ----------
    Microsoft gives you windows, linuх gives you the whole house...
    I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:24 06-07-2012 | Исправлено: Alukardd, 15:32 06-07-2012
    bsnvolg



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Дак вот нету у меня pass.sh прошлого - он же обновляется всякий раз при запуске... Есть основной скрипт куда эти ключи вставляются из файла pass.sh
     
    Вот, собственно, основной скрипт, которому и требуются ключи...
     

    Код:
     
    # cat ./nodupdate.sh
    # Версия адаптирована под Linux Ubuntu 10.04 LTS
    # по материалам http://habrahabr.ru/blogs/linux/125062/
    #!/bin/bash
    CURDIR=/var/www/site.ru/web
    cd $CURDIR
    wget -q --timestamping http://update.eset.com/eset_upd/update.ver
    mv -f update.ver update.rar
    #cd eset_upd
    #../unrar e -f -y -c- ../update.rar 2>&1 >/dev/null
    ./unrar e -y -c update.rar \eset_upd 2>&1 >/dev/null
    #cd $CURDIR
    mv -f update.rar update.ver
    grep file= $CURDIR/eset_upd/update.ver |grep    "engine3/"| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist1.txt
    grep file= $CURDIR/eset_upd/update.ver |grep    engine3ess| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist2.txt
    grep file= $CURDIR/eset_upd/update.ver |grep          emsx| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist5.txt
    grep file= $CURDIR/eset_upd/update.ver |grep v3eav|grep -v pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist3.txt
    grep file= $CURDIR/eset_upd/update.ver |grep v3ess|grep -v pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist4.txt
    grep file= $CURDIR/eset_upd/update.ver |grep v3eav|grep    pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist6.txt
    grep file= $CURDIR/eset_upd/update.ver |grep v3ess|grep    pre| sed -e 's/file\=/http\:\/\/um10.eset.com/' |grep -v data > downlist7.txt
    ./getpass.sh > ./pass.sh
    chmod 755 pass.sh
    source ./pass.sh
    cd download/engine3/
    wget   --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../downlist1.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
    cd ../engine3ess/
    wget   --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../downlist2.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
    cd ../win/v3eav/
    wget   --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../downlist3.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
    cd ../v3ess/
    wget   --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../downlist4.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
    cd ../emsx/
    wget   --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../downlist5.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
    cd ../v3eav/pre/
    wget     --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../../downlist6.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"
    cd ../../v3ess/pre/
    wget     --timestamping --http-user=$USERNAME --http-password=$PASSWORD --input-file=../../../../downlist7.txt --user-agent="ESS Update (Windows; U; 32bit; VDB 7001; BPC 4.0.474.0; OS: 5.1.2600 SP 3.0 NT; CH 0.0; LNG 1049; x32c; UPD http://um10.eset.com; APP ess; BEO 1; CPU 5964; ASP 0.0)"  

     
    Связка USERNAME--PASSWORD нужна для выкачивания wget_ом файлов обновлений

    Всего записей: 334 | Зарегистр. 07-12-2002 | Отправлено: 15:44 06-07-2012 | Исправлено: bsnvolg, 16:06 06-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bsnvolg
    Мде...
    Да немного не такой вывод я Вам дал. Попробуйте так. Основной скрипт я тестить очень не хочу сам.
    Код:
    #!/bin/sh
     
    curl http://www.nnvv.org/ | gawk -v FS=':|<br \/>' -v RS='p>' '/Username:/{print "USERNAME="$2"\nPASSWORD="gensub(/<\//,"","g",$4); exit 0}' > pass.sh


    ----------
    Microsoft gives you windows, linuх gives you the whole house...
    I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:05 06-07-2012 | Исправлено: Alukardd, 16:06 06-07-2012
    bsnvolg



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    У меня сбойнула флешка при переносе из линукса в винду... Тут приходится бегать от компа к компу. Еще разок посмотрите код в предыдущем посте - я прямо из линукса вставил.
    Ага - теперь формат в pass.sh вроде как такой же как и был, однако, видно нодовцы спалили ключи. Надо подождать, пока китайцы обновят сайт. А так то, вроде, все хорошо.

    Всего записей: 334 | Зарегистр. 07-12-2002 | Отправлено: 16:08 06-07-2012 | Исправлено: bsnvolg, 16:13 06-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bsnvolg
    Там вообще много ключей... Я в файл записываю самую верхнюю пару.

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:59 06-07-2012
    blaro



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

    Код:
     
    #!/bin/csh
     
    if($#argv%3==0) then
      echo "Usage: <First Name> <Last Name> <ID>"
    else
      echo $#1 $#2 $#3 > student_list.txt
      sort +1 -2 student_list.txt
    endif
     

    Небольшое объяснение: скрипт через командную строку принимает 3 параметра и записывает их в файл. А потом сортирует содержимое файла по второй колонке.  

    Цитата:
     
    #содержимое файла student_list.txt
    Ivan Ivanov 1234
    Peter Petrov 4321
     


    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 22:08 07-07-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    blaro
    Не очень понял, откуда в student_list.txt может появиться несколько строк, если вы его каждый раз перезаписывате (echo $#1 $#2 $#3 > student_list.txt), а не дополняете (echo $#1 $#2 $#3 >> student_list.txt).

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:35 07-07-2012 | Исправлено: ASE_DAG, 22:38 07-07-2012
    blaro



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Да все, уже нашел решение. Всем спасибо
     
    Добавлено:
    ASE_DAG

    Цитата:
    blaro
    Не очень понял, откуда в student_list.txt может появиться несколько строк, если вы его каждый раз перезаписывате (echo $#1 $#2 $#3 > student_list.txt), а не дополняете (echo $#1 $#2 $#3 >> student_list.txt).
     

    Кста, он у меня не поэтому не работал. Там другая проблема была

    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 22:51 07-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG, blaro
    Не смотря на то, что решение человек нашёл. Мне еще не понятно что Вы ждёте увидеть в student_list.txt записывая туда $#1 — так вообще не сработает, не говоря уже о том, что если каким-то чудом он не ругнётся, то выведет туда только размер массива. Ну и if первый не правильно написан, там собственно 1-я ошибка была...
     
    p.s. вообще в скрипте много странного, ну раз вопрос снят, то и писать не буду)
    p.p.s. я за bash для скриптов

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:57 07-07-2012 | Исправлено: Alukardd, 22:58 07-07-2012
    blaro



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

    Цитата:
    p.p.s. я за bash для скриптов

    А я за мир во всем мире.

    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 00:24 08-07-2012
    blaro



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    У меня такой вопрос. Почему у мну выскакивает ошибка что переменная i не определена?

    Код:
     
    #!/bin/csh -f
     
    if($#argv % 3 != 0) then
      echo "Usage <Name> <Last Name> <Id>"
      exit 1
    endif
    set $i = 1  
    set $params = ($#argv / 3)
    while($i < $params)
      addOneStudent ${i} ${i + 1} ${i + 2}
      $i = $i + 3
    done
     


    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 20:12 08-07-2012 | Исправлено: blaro, 20:12 08-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    blaro
    Потому, что при объявлении переменной не нужно пытаться её разыменовывать...
    set i = 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.

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    blaro
    > set $i = 1
    > ${i + 1}
    > $i = $i + 3
    > Почему у мну выскакивает ошибка...?
    Потому что вместо сишелловского ваша мна пользуется каким-то неведомым синтаксисом. Ни одной из трех этих конструкций csh не поймет.

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:45 08-07-2012 | Исправлено: ASE_DAG, 20:50 08-07-2012
    blaro



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

    Цитата:
    Потому что вместо сишелловского ваша мна пользуется каким-то неведомым синтаксисом. Ни одной из трех этих конструкций csh не поймет.
     

    А как надо?
     
    Добавлено:
    Так, ладно, не важно. На первый вопрос нашел ответ. Есть другой вопрос как вызвать другой скрипт и передать в него параметры которые принимает основной (главный) скрипт через командную строку?
     
    Добавлено:

    Цитата:
    Есть другой вопрос как вызвать другой скрипт и передать в него параметры которые принимает основной (главный) скрипт через командную строку?

    Не важно. На это вопрос я тоже нашел ответ. Теперь другой вопрос где должна быть точка?

    Код:
     
    #!/bin/csh -f
     
    if($#argv % 3 != 0) then
      echo "Usage <Name> <Last Name> <Id>"
      exit 1
    endif
    set i = 1
    while ($i < $#argv)
       addOneStudent  < $argv[i] $argv[i + 1] $argv[i + 2]
      @i = $i + 3
    end
     


    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 21:30 08-07-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    blaro
    > А как надо?  
     
    Например, вот так, если у вас есть seq:
    foreach i (`seq 1 3 $#argv`)
        addOneStudent $1 $2 $3
        repeat 3 shift
    end

     
    Или так, если все-таки хотите циклом «пока»:
    @ l = $#argv / 3
    @ i = 1
    while ( $i <= $l )
        addOneStudent $1 $2 $3
        repeat 3 shift
        @ i++
    end

     
    Но лучше я вам скажу, как делать не надо: не надо писать скрипты на си-шелле. :-)
     
    Добавлено:
    > Теперь другой вопрос где должна быть точка?
    Двоеточие должно быть после слова «вопрос». :-) Если вы про скрипт, то никакой точки там не пропущено хотя бы по той простой причине, что такого синтаксического элемента в Си-шелле нет.
     
    P. S. Точка как имя файла означает текущую директорию, но это свойство ФС, а не шелла.

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

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



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

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:17 09-07-2012
    blaro



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

    Цитата:
    Если вы знаете конкретное действие, которое хотите совершить, то лучший помощник man и google.
    Если же вы не знаете как это реализовать и хотите спросить, то не спрашивайте "где не хватает точки", а скажите "что надо сделать и получить на выходе".

    Если бы знал что спрашивать и как. У нас было 3 урока по си-шелл после первого выяснилось что мы учили баш а не си-шелл. Потом нас стали учить си-шелл, и то все по быстрому и даже примеров не было. Ничего толком не объяснили, сказали сами учите. А как его учить если сессия в эту среду. Вот и приходиться мне все делать "на ощупь".

    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 01:36 09-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    blaro
    OMG - это где Вас си-шелу учат? оО
    Попробуем что-то Вам объяснить, но мы здесь больше по bash'у и др(см. название темы)...

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 09:43 09-07-2012
    blaro



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

    Цитата:
    это где Вас си-шелу учат?

    Учат? Вы преувеличиваете. Нас не учат, нас заставляют учить самим.  
    Посмотрите еще один скрипт. Он должен печатать несколько строк а печатает только одну. Получает число через командную строку и выводит на экран все поля "Номер студента", оценка которых выше параметра

    Код:
     
    #!/bin/csh -f
     
    if($#argv != 1) then
      echo "Usage: GradeStatistics <grade>"
      exit 1
    endif
     
    set lines = `wc -l student_list.txt`
    set i = 1
    while($i <= $#lines)
      set out = `head -$i student_list.txt | tail -1`
      if($out[4] > $1) then
        echo $out[3]
      endif
      @ i++
    end
     

    Файл составлен так:

    Цитата:
     
    Ivan Ivanov 2255 5
    Peter Petrov 1155 4
    <Имя> <Фамилия> <Номер Студента> <Оценка>
     


    ----------
    Оптимистично смотрю на мир глазами убийцы.

    Всего записей: 311 | Зарегистр. 29-01-2006 | Отправлено: 19:25 09-07-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    blaro
    > set out = `head -$i student_list.txt | tail -1`
    Буэ.
     
    > Получает число через командную строку и выводит на экран все поля "Номер студента",  
    > оценка которых выше параметра

    Код:
    #!/bin/csh -f
    if ( $#argv != 1 ) then
      echo "Usage: GradeStatistics <grade>"
      exit 1
    endif  
     
    awk -v GRADE="$1" '$4 > GRADE { print $3 }' student_list.txt

     
    P. S. Кстати совершенно неправдоподобное сравнение — оценка строго больше некоторой.

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Ы, выродили задачу на csh в вызов awk
     
    blaro
    Цитата:
    Нас не учат, нас заставляют учить самим.  
    Вы странные какие-то. Мы всегда договаривались с перподами, например вместо ASP..NET, сначала пытались протолкнуть JSP, а в итоге писали на Django. И в Вашем случае, думаю что ни кто не возражал бы против bash'а, например.
     
    Если именно на csh, то покрасивее выглядит так:
    Код:
    #!/bin/csh -f
     
    if($#argv != 1) then
      echo "Usage: GradeStatistics <grade>"
      exit 1
    endif
     
    foreach line ("`cat /tmp/stud.txt`")
    set stud = ( $line )
        if ($1 < $stud[4]) then
            echo $stud[3]
        endif
    end


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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:35 09-07-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    > выродили задачу на csh в вызов awk :-)
    Почему «выродил»? Свел. Если wc, head и tail используются, с чего бы АВК нельзя?

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Ну одно дело вызов небольшой, а другое дело всю задачу решить в вызове. Тогда уже #!/usr/bin/gawk -f...

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:29 09-07-2012
    ndch

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста с sed:
     
    Дано: исходный файла, размером ~60 мегабайт, приблизительно такого содержания:

    Код:
     
    всякий мусор
    всякий мусор
    \t\t\t\t\t<div class='post entry-content '>
    несколько
    нужных
    строк
    \t\t\t\t\t</div>
    всякий мусор
    всякий мусор
    всякий мусор
    всякий мусор
    \t\t\t\t\t<div class='post entry-content '>
    несколько
    нужных
    строк
    \t\t\t\t\t</div>
    всякий мусор
    всякий мусор
     

     
    Как из исходного файла выводить в новый файл многострочное содержимое между "\r\n\t\t\t\t\t<div class='post entry-content '>" и "\r\n\t\t\t\t\t</div>" ?
     
    Как бы удалить "всякий мусор".
     
    Что-то типа sed  -nr "/^\Q\t\t\t\t\t<div class='post entry-content '>\E/,/^\Q\t\t\t\t\t<\/div>\E/p" source.htm >clean.htm
    Или sed  -nr "/\t\t\t\t\t<div class=/,/\t\t\t\t\t<\/div/p" test.htm >2

    Всего записей: 6569 | Зарегистр. 31-08-2008 | Отправлено: 10:30 17-07-2012 | Исправлено: ndch, 10:40 17-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ndch
    sed -n '/<div/,/<\/div>/p' source.html > clean.html

    ----------
    Microsoft gives you windows, linuх gives you the whole house...
    I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 12:50 17-07-2012
    ndch

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

    Всего записей: 6569 | Зарегистр. 31-08-2008 | Отправлено: 12:55 17-07-2012 | Исправлено: ndch, 13:21 17-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ndch
    Ну напишите столько уточнений сколько надо...
    sed -n '/\t*<div class=/,/\t*<\/div>/p' source.html > clean.html
     
    Добавлено:
    Вот так вроде будет работать как Вам надо:
    sed -n '/\t*<div id="" class="post entry-content ">/,/\t*<\/div>/p' source.html > clean.html

    ----------
    Microsoft gives you windows, linuх gives you the whole house...
    I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:16 17-07-2012
    MakPol



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Доброго времени суток!  
     
    Создал сначала топик, но умные люди подсказали этот топик. Решил попытать счастье здесь.
     
    На днях писал очередной скрипт автоматизации на bash и столкнулся с забавной штукой - скрипт, который верой и правдой работал на Ubuntu 10.04 перестал корректно отрабатывать на Cent OS 6.2 и 6.3, а также воспроизвел ситуацию на Fedora 16. В общем вот что надо для воспроизведения:
     
    /etc/init.d/testsh

    Код:
     
    #! /bin/bash
    #
    # testsh       Test bash
    #
    case "$1" in
      start)
     /tmp/starttestscript.sh &
            ;;
      stop)
             
            ;;
      status)
            ;;
      restart|reload|force-reload)
            $0 stop
            $0 start
            rc=$?
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
            exit 2
    esac
     
    exit $rc

     
    /tmp/sarttestscript.sh - скрипт запуска проекта (когда запускается система, она пишет log-файл, тут я искуственно такой log-файл создал.
     

    Код:
    #! /bin/bash  
    tcpdump >> /tmp/testfile.log

     
    /tmp/sborkatestscript.sh - скрипт запуска процесса сборки проекта, запуска системы и вывод лога запуска на экран.
     

    Код:
    #! /bin/bash
    /etc/init.d/testsh start
    tail -f /tmp/testfile.log

     
    Так вот, мой порядок действий:
    1. Запускаю скрипт /tmp/sborkatestscript.sh и на экране у меня начинает бежать лог.
    2. В это время смотрю работает ли моя "служба" при помощи ps -f -C tcpdump --no-headers
    мне выводится что-то в роде:
    # ps -f -C tcpdump --no-headers
    tcpdump   5804  5802  5 15:27 pts/2    00:00:00 tcpdump
    3. Как только я "насмотрелся лога" после запуска системы я выхожу из tail -f при помощи Сtrl+С
    4. Далее хочу проверить ка там "служба" и вот что получаю
    # ps -f -C tcpdump --no-headers
    #
    т.е. такого демона получается не запущено.
     
    Не могу понять почему так происходит. Ведь запуск был от другого скрипта, да и как я понимаю ctrl+C должен повлиять то был только на прекращение tail.
    Если посмотреть в pstree, то ИМХО не должно убивать запущенный процесс
             
    Ну и самое главное, на Ubuntu то у меня точно таой же скрипт работал.
    Помогите пожалуйста разобраться как быть, мне надо работать именно по воспроизведенной на простых скриптах схеме и именно через tail.
     
    Заранее большое спасибо!

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 00:11 30-07-2012 | Исправлено: MakPol, 00:12 30-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MakPol
    Есть вероятность, что tcpdump умирает от SIGHUP после завершения скрипта. Посему попробуйте вызвать его через nohup.

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:31 30-07-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MakPol
    > /tmp/starttestscript.sh &
    Совершенно верно пишет тов. Алукард. Не надо надеяться на то, что опции Баша везде в желаемом вами состоянии. В нашем случае речь об опции huponexit. Либо ультимативно ее выключайте:
    $ shopt -u huponexit
    , либо используйте nohup. Обычно выбирают второе, поскольку это Баш вам позволяет выбирать желаемое поведение при завершении, остальные борн-подобные шеллы SIGHUP всегда посылают.
     
    UPD: Все не так. См. далее.

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

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



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Спасибо большое за ответы! Но в моем случае как раз надо, чтобы осуществлялся выход из tail -f но не убивался процесс, запущенный ранее, в моем случае это подобие службы.
    И тогда не пойму, почму в Ubuntu то не убивалось ничего?

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 07:09 30-07-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    > Но в моем случае как раз надо
    Что значит «но»? И я, и тов. Алукард с первого раза прекрасно поняли, что вам надо — чтоб по завершению родительского процесса sborkatestscript.sh дочерний starttestscript.sh не завершался. Вы полагаете, что его для этого достаточно перевести последний в фон (/tmp/starttestscript.sh &), но в общем случае это не так. Нужно еще чтобы либо шелл не посылал SIGHUP по завершению — в Баше это настраиваемое опцией huponexit поведение, и удивляться тому, что в разных дистрибутивах оно настроено по-разному не надо; либо дочерний процесс не завершался по SIGHUP’у — это обеспечивает nohup ($ nohup /tmp/starttestscript.sh &).
     
    > не пойму, почму в Ubuntu то не убивалось ничего?
    Ну, теперь, я надеюсь, понятно? ;-)

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 07:31 30-07-2012 | Исправлено: ASE_DAG, 07:34 30-07-2012
    MakPol



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Понятно то понятно, но снова в теории...
    Сейчас у меня вот что:
     
    /etc/init.d/testsh

    Код:
    #! /bin/bash
    #
    # testsh       Test bash
    #
    case "$1" in
      start)
    nohup /tmp/starttestscript.sh &
            ;;
      stop)
     
            ;;
      status)
            ;;
      restart|reload|force-reload)
            $0 stop
            $0 start
            rc=$?
            ;;
      *)
            echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
            exit 2
    esac
     
    exit $rc

     
    /tmp/sborkatestscript.sh

    Код:
    #! /bin/bash
    /etc/init.d/testsh start
    tail -f /tmp/testfile.log

     
    /tmp/starttestscript.sh

    Код:
    #! /bin/bash  
    tcpdump >> /tmp/testfile.log

     
    Запускаю /tmp/sborkatestscript.sh
    все ок, лог идет (отображается благодаря tail -f
    Смотрю на процессы:

    Код:
    # ps -f -C tcpdump --no-headers  
    tcpdump  22084 22082  0 09:12 pts/6    00:00:00 tcpdump

    Жму Ctrl-C
    Снова смотрю на процессы:

    Код:
    # ps -f -C tcpdump --no-headers  
    #

    Когда работает, то pstree выдает:
     

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 09:15 30-07-2012 | Исправлено: MakPol, 09:19 30-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MakPol
    добавьте в скрипт перед tail строку jobs. И скажите что она выводит.
    Так же можно в начало  /tmp/sborkatestscript.sh скрипта вставить строку set -x для большей наглядности.

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:18 30-07-2012 | Исправлено: Alukardd, 10:18 30-07-2012
    MakPol



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

    Код:
    # cat /tmp/sborkatestscript.sh  
    #! /bin/bash
    set -x
    /etc/init.d/testsh start
    jobs
    tail -f /tmp/testfile.log  

     
    И вот часть вывода при запуске скрипта sborkatestscript.sh, почти сразу нажал Ctrl-C, чтобы лог был небольшой и привел все:

    Код:
    # /tmp/sborkatestscript.sh  
    + /etc/init.d/testsh start
    + jobs
    + tail -f /tmp/testfile.log
    nohup: вывод добавляется в «nohup.out»
    10:39:17.162860 IP polyakov.ascon.ru.54763 > 10.1.5.88.ssh: Flags [.], ack 4224, win 321, options [nop,nop,TS val 611311485 ecr 351368486], length 0
    10:39:17.162860 IP makpol.54763 > 192.168.0.88.ssh: Flags [.], ack 4224, win 321, options [nop,nop,TS val 611311485 ecr 351368486], length 0
    10:39:17.171443 IP tupak.62417 > 255.255.255.255.hlserver: UDP, length 40
    10:39:17.171565 IP 192.168.0.88.55687 > contora.domain: 2614+ PTR? 38.5.1.10.in-addr.arpa. (40)
    10:39:17.171710 IP contora.domain > 192.168.0.88.55687: 2614* 1/0/0 PTR tupak. (76)
    10:39:17.273696  
    10:39:17.328850 IP gena.danf-ak2 > 255.255.255.255.hlserver: UDP, length 40
    10:39:17.328964 IP 192.168.0.88.37012 > contora.domain: 41765+ PTR? 32.5.1.10.in-addr.arpa. (40)
    10:39:17.329140 IP contora.domain > 192.168.0.88.37012: 41765* 1/0/0 PTR gena. (72)
    10:39:17.463143 IP makpol.54763 > 192.168.0.88.ssh: Flags [P.], seq 1:49, ack 4224, win 331, options [nop,nop,TS val 611311785 ecr 351368486], length 48
     
    ^C

     
    А также nohup.out:

    Код:
    # cat ~/nohup.out  
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
    321 packets captured
    324 packets received by filter
    3 packets dropped by kernel
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
    960 packets captured
    960 packets received by filter
    0 packets dropped by kernel
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
    1488 packets captured
    1488 packets received by filter
    0 packets dropped by kernel
    ...

    Ну все преводить не стал, т.к. пробовал несколько раз
     
    Файлы конфигов те же что я выкладывал постом выше.

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 10:50 30-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MakPol
    Цитата:
    И вот часть вывода при запуске скрипта sborkatestscript.sh, почти сразу нажал Ctrl-C, чтобы лог был небольшой и привел все:  
    прикольно пишите)
     
    Хм. Ну гляньте для надёжности что в переменной о которой говорил т.ASE_DAG: shopt huponexit

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 11:12 30-07-2012
    MakPol



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Да в том то и дело что уже и shopt huponexit попробовал
    Сейчас перепробую и с логами отпишу, может получится разобраться.

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 11:21 30-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MakPol
    Гляньте еще вместо pstree на такой вывод: ps -eo ppid,pid,cmd | grep 'bash\|tcpdump'
     
    А так же для эксперимента попробуйте запустить в bg не весь скрипт а именно tcpdump.

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 11:38 30-07-2012
    MakPol



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

    Цитата:
    Гляньте еще вместо pstree на такой вывод: ps -eo ppid,pid,cmd | grep 'bash\|tcpdump'

     

    Код:
    # ps -eo ppid,pid,cmd | grep 'bash\|tcpdump'
        1  2572 /bin/bash /usr/sbin/ksmtuned
     5678  5679 /bin/bash
     5678  5691 /bin/bash
     5678  5882 /bin/bash
     5678  5981 /bin/bash
    17997 18001 -bash
    18026 18030 -bash
    18054 18055 -bash
    18030 26714 /bin/bash /tmp/sborkatestscript.sh
        1 26716 /bin/bash /tmp/starttestscript.sh
    26716 26718 tcpdump
    18001 26722 grep bash\|tcpdump

     

    Цитата:
    Хм. Ну гляньте для надёжности что в переменной о которой говорил т.ASE_DAG: shopt huponexit

     

    Код:
    # shopt huponexit
    huponexit       off

     

    Цитата:
    А так же для эксперимента попробуйте запустить в bg не весь скрипт а именно tcpdump.

     Точнно такая же ситуация, тоже пробовал
     
    Спасибо огромное за помощь! То что предлагаете варианты. Просто очень надо разобраться.

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 12:22 30-07-2012 | Исправлено: MakPol, 12:27 30-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MakPol
    Такс, Ваше счастье — у меня в Debian так же всё завершается по Ctrl+C и есть некоторое свободное время, так что щас раскопаем, ну или хотя бы попробуем раскопать)

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 12:40 30-07-2012 | Исправлено: Alukardd, 12:40 30-07-2012
    MakPol



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

    Цитата:
    MakPol
    Такс, Ваше счастье — у меня в Debian так же всё завершается по Ctrl+C и есть некоторое свободное время, так что щас раскопаем, ну или хотя бы попробуем раскопать)

    Спасибо огромнное! Еще есть OpenSUSE там проверил знакомый, так у него не убивается процесс. А у меня как и писал выше на CentOS 6.2, 6.3 и на Fedora 16 убивается...
     
    P.S. Если убрать tail, то скрипт отрабатывает и после чего tcpdump работает как ни в чем ни бывало (в связке starttestscript-->tcpdump), только если убить запущеный tail эта цепочка прерывается.

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 12:49 30-07-2012 | Исправлено: MakPol, 12:56 30-07-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MakPol
    Хрень вся в том, что SIGINT получает не tail, а скрипт. Таково управление процессами. И почему оно в Ubuntu другое я хз.
    Решение такое: изменить строку вызова в init крипте на такую: setsid /tmp/starttestscript.sh &
     
    Добавлено:
    Куря man bash нашёл еще вариант.
            set -m
             /tmp/starttestscript.sh &

     
    Соответсвенно что бы Вам было понятнее о чём это я — выполните такую команду при запущенных скриптах: ps -eo ppid,pid,pgid,cmd | grep 'bash\|tcpdump'.
    И увидите что pgid у них у всех одинаковый, а именно он и получает SIGINT.

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    > что SIGINT получает не tail, а скрипт
    Не совсем. Это SIGHUP получал бы только скрипт (и вызывал бы цепную реакцию hang-up’oв по дочернему дереву, которую можно было бы пресечь). А хрень в том, что по ^C SIGINT получает вся группа процессов (PGID).  
     
    Сравните результат:
    # /tmp/sborkatestscript.sh
    nohup: appending output to `nohup.out'
     
    ^Z
    [1]+  Stopped                 /tmp/sborkatestscript.sh
    # jobs -l
    [1]+ 11896 Stopped                 /tmp/sborkatestscript.sh
    # ps -C sborkatestscript.sh -C tcpdump -O pgid
      PID  PGID S TTY          TIME COMMAND
    11896 11896 T pts/7    00:00:00 /bin/bash /tmp/sborkatestscript.sh
    11900 11896 T pts/7    00:00:00 tcpdump
    # kill -KILL 11896
    # ps -C sborkatestscript.sh -C tcpdump -O pgid
      PID  PGID S TTY          TIME COMMAND
    11900 11896 S pts/7    00:00:00 tcpdump
    [1]+  Killed                  /tmp/sborkatestscript.sh
    # kill -KILL -11896 # N.B. минус PID — это PGID
    # ps -C sborkatestscript.sh -C tcpdump -O pgid
      PID  PGID S TTY          TIME COMMAND
    #

     
    KILL вместо не действующего на остановленные процессы INT’а использован, чтоб оставаться в одном терминале.
     
    Таким образом, действительно, для иммунности tcpdump’а к ^C придется использовать setsid.
     
    MakPol
    Замечу все-таки, что SIGINT — сигнал аварийного останова и использовать его для штатного выхода не вполне правильно. Если бы вы использовали для завершения tail’а SIGQUIT (на клавиатуре: ^\ или ^4), то получили бы желаемое поведение безо всяких уловок.
     
    P. S. За первоначальный ложный ответ прошу прощения.
     
    P. P. S. А почему же все-таки в Убунте ситуация иная?

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Цитата:
    А хрень в том, что по ^C SIGINT получает вся группа процессов (PGID).  
    Я позже уточнил. Просто не убрал старый текст(
    Цитата:
    P. P. S. А почему же все-таки в Убунте ситуация иная?
    и это я предположил. Там в ~/.bashrc, например или еще где описано set -m

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:33 30-07-2012 | Исправлено: Alukardd, 17:34 30-07-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    > в ~/.bashrc, например или еще где описано set -m
    Если бы... Опции, задаваемые set’ом, не наследуются.

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

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



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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:43 30-07-2012
    MakPol



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Alukardd, ASE_DAG, спасибо огромное за помощь. Очень помогли. А самое главное разжевали все. Отдельное огромное спасибо за терпение!

    Всего записей: 139 | Зарегистр. 14-07-2004 | Отправлено: 23:25 30-07-2012
    ck80

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Прошу помочь в написании простенького скрипта на bash.
     
    Вводное. Каждый час на фтп складываются файлы из нескольких источников.
    Задача. Проверять время создания файлов в этой папке и если время создания какого-либо файла отличается от остальных(или в сравнении с текущим временем), то высылать уведомление админу на почту.
     
    Структура каталога /home/ftp/exchange/:
     
    -rw-r--r--  1 ftp nogroup  8096 2012-08-02 10:00 in1.zip
    -rw-r--r--  1 ftp nogroup  4330 2012-08-02 10:00 in2.zip
    -rw-r--r--  1 ftp nogroup  2737 2012-08-02 10:00 in3.zip
     
     

    Всего записей: 247 | Зарегистр. 03-07-2007 | Отправлено: 08:08 02-08-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ck80
    Эм? Так там разные же партии файлов будут иметь разные timestamp'ы... По какому критерию определять что файлы из одной группы?
    К тому же на сколько точно надо сравнивать время? Нету ли зазора что копирование может продлится больше минуты? В общем насколько точно надо сравнивать времена.

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:39 02-08-2012
    ck80

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    Я неправильно изъяснился.  
     
    На ftp лежат файлы. В начале каждого часа (в 00 минут) они перезаписываются новыми файлами, каждый из своего источника. Нужно контролировать, все ли файлы из всех ли источников появились вовремя. Сейчас я каждый час захожу на фтп и проверяю, все ли файлы на месте. А хочется скриптом, если файла вовремя нет - бить тревогу.  
    Скрипт я предполагаю поместить в cron, ежечасно в 15 минут каждого часа. 15 минут хватит на копирование.
     
    Как я себе это представляю
     
    if timestamp_file in1.zip => curenttime-15min then exit
        esle mailto root -subject "Файл из источника 1 не скопировался!"

    Всего записей: 247 | Зарегистр. 03-07-2007 | Отправлено: 13:35 02-08-2012 | Исправлено: ck80, 13:44 02-08-2012
    Alukardd



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

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:08 02-08-2012
    bga83



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Коллеги, нужна помощь.
    идея следующая: надо задать переменную окружения на выполнение одной команды.  
    А именно надо для одной команды(скорее все wget будет) указать другой прокси в http_proxy, но так чтобы это не затронуло работу остальных сервисов.

    Всего записей: 2008 | Зарегистр. 30-11-2007 | Отправлено: 14:20 02-08-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ck80
    Извини, что в одну строку, но я писал это прямо в терминале)вотЪ

    Код:
    #!/bin/bash
    IFS=$'\n';
    for file in $(ls -l /tmp/testdir/|grep -v 'итого'); do
        name=$(echo "$file" | awk '{print $NF}');
        res=$(echo "$file" | awk '{gsub(/:[0-9][0-9]/,"",$8); print $6" "$7" "$8}');
        now=$(date | awk '{gsub(/:[0-9][0-9]/,"",$4);
        print $2" "$3" "$4}');
        if [ $res != $now ]; then
            echo alarm - $name;
        fi
    done

     
    Добавлено:
    bga83
    Указываете её прямо в строке перед командой и всё. Или есть подвох?)..

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:55 02-08-2012 | Исправлено: Alukardd, 15:02 02-08-2012
    bga83



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

    Всего записей: 2008 | Зарегистр. 30-11-2007 | Отправлено: 15:38 02-08-2012
    ck80

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
     
    Спасибо сейчас попробую.
     
    Встретил ещё вот такой вариант:
     
    #!/bin/bash
    if [[ $(find /home/ftp/*1.zip -mmin +15) ]]; then
       mail -s "Тревога!" root
    fi

    Всего записей: 247 | Зарегистр. 03-07-2007 | Отправлено: 08:32 03-08-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ck80
    Да норм вариант. Правда он Вам не покажет какой именно файл, но это уже мелочи.
    Лучше используйте вариант с 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.

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    Опять вывод ls’а парсите? -_- Вы бы еще вывод дэйта додумались АВКом разобрать... И ведь, блин, додумались.
     

    alarm() {
    # тут что-нибудь на типа
    # mail -s "Alarm!" root <<< "File $1 is not up to date."
    }
    now=$(date +%Y-%m-%d)
    for f in /home/ftp/*.zip; do
        date=$(date -r "$f" +%Y-%m-%d)
        [[ $date == $now ]] || alarm "$f"
    done


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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:31 03-08-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Да-а-а, я такой извращенец)

    Цитата:
    %Y-%m-%d
    а про часы забыли... Так что если укорачивать то так: %D\ %H.
     
    p.s. да у ls-то дату не вывести в произвольном формате, вот я машинально и date за компанию распарсил. Выражение уже было, просто скопировал его и всё)
     
    Добавлено:
    Я поначалу думал вывод stat распарсить, честно не знал что date имеет ключ -r...

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:14 04-08-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    > а про часы забыли
    Да, да, признаюсь, саму задачу я не читал.
     
    > думал вывод stat распарсить
    Да, можно было бы; а если бы потребовалась дата доступа, а не модификации, то и пришлось бы. Вот:
    $ date -d "@$(stat -c %X file)" "+%F %H"
    Но не АВКом же. ;-)

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Я как-то не привык к такому использованию date... Надо будет запомнить)

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:35 04-08-2012
    ck80

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    Да, действительно, вы правы. Без имени файла не удобно.
     
    ASE_DAG
    Не могу заставить работать ваш скрипт, подскажите, пожалуйста, что не так?
     

    Код:
    #!/bin/bash
    alarm() {
    mail -s "File $1 is not up to date." root  
    }
     now=$(date +%Y-%m-%d)
     for f in /home/ftp/exchange/*1.zip; do
         date=$(date -r "$f" +%Y-%m-%d)
         [[ $date == $now ]] || alarm "$f"
     done

     
    Ругается:

    Код:
    sh /usr/share/autoobmen2.sh
    /usr/share/autoobmen2.sh: 9: [[: not found
    alarm /home/ftp/exchange/a1.zip
    /usr/share/autoobmen2.sh: 9: [[: not found
    alarm /home/ftp/exchange/b1.zip
    /usr/share/autoobmen2.sh: 9: [[: not found
    alarm /home/ftp/exchange/c1.zip
    /usr/share/autoobmen2.sh: 9: [[: not found
    alarm /home/ftp/exchange/d1.zip
     

    Всего записей: 247 | Зарегистр. 03-07-2007 | Отправлено: 10:17 10-08-2012 | Исправлено: ck80, 10:19 10-08-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ck80
    Вообще скрипт корректен... Ошибка знакомая но не могу вспомнить когда она вылезает, кроме случаев когда вы не поставили пробел между [[ и $date.
    Можете заменить эту строку на такую - test $date == $now || alarm "$f"

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:56 10-08-2012
    ck80

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
     
    А now это команда? Если так то у меня в системе нет такой команды. А вот date есть.

    Всего записей: 247 | Зарегистр. 03-07-2007 | Отправлено: 12:26 10-08-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ck80
    Вас просто немного запутали имена переменных которые использовал т. ASE_DAG.
    То что стоит перед знаком =, что и логично это имя переменной. Соответсвенно что бы получить её значение перед именем ставится $. И того now — это переменная, а date это и переменная и одноимённая команда.

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 12:40 10-08-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Упс, что-то я пропустил последние посты.
     
    >> sh /usr/share/autoobmen2.sh
    >> [[: not found
    > когда она вылезает
    Ну, например, когда синтаксического элемента [[ в вашем шелле нет. Тов. Ck80 из каких-то соображений во-первых вместо того, что вызывать скрипт как исполняемый, явно вызывает интерпретатор (что еще не беда), а во-вторых вызывает не тот интерпретатор, под который скрипт написан — sh вместо bash — вот тут результат ожидаем.

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

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



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

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 09:15 22-08-2012
    dimmer123

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

    Код:
     
    #( Задача_084213062012
    NoActive
    SingleInstance
    Action:
    S" E:\Tes\1.txt" FILE S>NUM
    CASE  
     70 OF MSG: "70" ENDOF
     60 OF MSG: "60" ENDOF
     50 OF MSG: "50" ENDOF
     DUP OF MSG: "0" ENDOF
    ENDCASE
    )#
     

     
    Как сделать то же самое средствами линукс (Centos)?

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 22:35 26-08-2012 | Исправлено: dimmer123, 22:39 26-08-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dimmer123
    > в зависимости от содержимого файла  запускать определенную задачу
    Давайте без мнимых упрощений. Какая реальная задача стоит?
     
    > Пример из nncron
    Извините, но этот синтаксис мне не знаком и не кажется интуитивно понятным. Опишите словами или псевдоязыком.

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:30 26-08-2012
    dimmer123

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В файле находится одно число: 10 или 20, 30 и т.д до 360. В зависимости от числа, ImageMagick поворачивает картинку на определенный угол и вырезает кусок.
     
    Например,  
    если в файле 10, то запускаем convert big.png -rotate 80 -crop 80x22+190+173 small.png
    если в файле 20, то запускаем convert big.png -rotate 70 -crop 80x22+185+185 small.png
    если в файле 30, то запускаем convert big.png -rotate 60 -crop 80x22+178+197 small.png
    и т.д

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 01:36 27-08-2012 | Исправлено: dimmer123, 01:39 27-08-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    > если в файле 10
    А если в файле 15? Угол поворота — это 90 – a; а координаты левого верхнего края каким соотношением со входом связаны?
     
    Впрочем, если хотите плодить китайский код, то не вижу затруднений, какие могли бы вам встретиться:
     

    Код:
    #!/bin/bash
    set -e
    INPUTFILE='/tmp/myinputfile'
    INPUTIMG='big.png'
    OUTPUTIMG='small.png'
     
    do_convert() {
        convert "$INPUTIMG" -rotate $1 -crop 80x22+${2}+${3} "$OUTPUTIMG"
    }
     
    read IN < "$INPUTFILE"
    case $IN in
        10) do_convert 80 190 173 ;;
        20) do_convert 70 185 185 ;;
        30) do_convert 60 178 197 ;;
        # and so on
        *)  echo >&2 'E: Invalid input.' ;;
    esac

     
    Написано навскидку и не проверено, надеюсь, что косяков нет.

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 09:30 27-08-2012 | Исправлено: ASE_DAG, 09:39 27-08-2012
    dimmer123

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

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

    Я так и не нашел, как в Imagemagick вырезать кусок картинки под определенным углом. Поэтому я просто вращаю картинку на нужный угол и вырезаю прямоугольник.

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 23:35 27-08-2012 | Исправлено: dimmer123, 23:38 27-08-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dimmer123
    > Большое спасибо.
    Всегда пожалуйста. :-) Но основную мысль моего сообщения вы почему-то проигнорировали. Пусть сам по себе Баш и не умеет тригонометрии, но всегда можно и нужно использовать внешнюю утилиту (в этом и смысл шелла), а не писать код удивительно сочетающий в себе благодаря 36-и строчкам условий — детскую прямоту и наивность, а благодаря 72-м предварительно рассчитанным неизвестным образом «магическим» числам — абсолютную непрозрачность.

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:42 28-08-2012
    dimmer123

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

    Цитата:
    Но основную мысль моего сообщения вы почему-то проигнорировали.  

    Основную мысль я понял сразу, но она не совпадает с моей, поэтому не хотел вас как-то обидеть или показаться неблагодарным. Я не программист и для меня существует 2 вида кода: рабочий и нерабочий. Пусть он корявый, длинный и с точки зрения настоящего программиста не правильный, но он работает! Пусть он обрабатывается на несколько секунд дольше или больше загружает процессор - пока меня это не волнует. Возможно, знающий человек сможет заменить мои 36 условий на что-нибудь покороче, но я сделал как мог, и оно работает.

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 15:37 28-08-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dimmer123
    Вопрос, который я задал, требовал, кажется, куда более простого ответа, чем вы дали.
    Он, я напомню, звучал так: «координаты левого верхнего края каким соотношением со входом связаны?». Ответ я полагал получить вида: «x = f(a); y = g(a)». Ответьте, пожалуйста.

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:32 28-08-2012 | Исправлено: ASE_DAG, 18:33 28-08-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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:42 28-08-2012
    dimmer123

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В формулах не силен, объясню на пальцах. Есть такая картинка. Из INPUTFILE берется направление (10-360). А вырезать нужно стрелку с противоположным направлением (плюс 180 градусов). Т.е если в файле 90, вырезаем стрелку 270 + немного по бокам от стрелки, прямоугольник 80x22. Магические цифры я подбирал вручную, просто вырезал кусок и смотрел, подходит или нет. Стрелки сходятся в центре с координатами 262px слева, 287px сверху.

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 21:00 28-08-2012
    Alukardd



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

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    > явно проще стрелку отрисовать
    Там результат не одинокая стрелка, а что-то вот такое:
     
     

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

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый день, dimmer123
    Прошу прошения за глупый вопрос, а если подойти с другой стороны - развернуть картинку на ноль (-угол), вырезать прямоугольник 80х20, развернуть еще раз, так что  бы стало в нужное положение (180+2*угол)? К сожалению, спешу, днем/вечером буду разбиратся с ImageMagick.

    Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 09:32 29-08-2012
    dimmer123

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

    Цитата:
    Прошу прошения за глупый вопрос, а если подойти с другой стороны - развернуть картинку на ноль (-угол),

    Так я ж так и делаю. На предыдущей странице пример, который ASE_DAG переделал под линукс. Но это же китайский код )).
     

    Цитата:
    развернуть еще раз, так что  бы стало в нужное положение (180+2*угол)? К сожалению, спешу, днем/вечером буду разбиратся с ImageMagick.

    Разворачивать не надо, мне просто нужен вырезанный кусочек, а под каким он углом будет не важно.  
     
    По-моему придумал как избавится от магических чисел. Вырезаем кружок со всеми стрелками чтобы получился квадрат.
    convert.exe big.png -crop 144x144+191+216 square.png
    Затем берем значение из файла и если оно меньше 90, значит считаем 90-число из файла = угол поворота картинки. Теперь просто подставляем в Imagemagick
    convert square.png -rotate сюда вставляем угол поворота, который мы посчитали -crop 80x22+0+62 готово.png
    Пока только не соображу, если в файле значение >90. Получается форумула: значение из файла - 90 = - (результат)
     

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 13:43 29-08-2012 | Исправлено: dimmer123, 15:55 29-08-2012
    kpp77

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток!
    Подскажите что\где (кроме man-а) почитать об использовании curl в шелле.
    Сам программирую на SH (FreeBSD, Linux Debian).
    И вот понял что имеется пробел в использовании утилиты curl.
     
    Реальная задача: автоматическая проверка балланса через сайт провайдера.
    Скриптом зайти на страницу статистики, передать логин\пароль, считать страницу.
    До этого всегда хватало wget-а, решил попробовать с curl-ом.

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    > что\где (кроме man-а) почитать об использовании curl в шелле
    Ничего, кроме мана, по Курлу можно не читать. Это довольно примитивная и негнушная1 утилита, поэтому в мане описано все.
     
    > до этого всегда хватало wget-а, решил попробовать с curl-ом
    Из каких соображений? Курл за парой мелочей нисколько не более функционален, чем Вэ-гет.
     
    Если хотите, можете детально описать задачу, я попробую подсказать команду, которую вам надо отдать.
     

    1 По порядкам, принятым в ГНУ, полная документация — это info, а не man.

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

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

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    dimmer123
    Пока получил доступ к компьютеру Вы уже сами нашли/поняли

    Код:
     
    #!/bin/bash  
    set -e
    INPUTFILE='inputfile'  
    INPUTIMG='test.jpg'  
    OUTPUTIMG='test_out.jpg'  
    read IN < "$INPUTFILE"
    convert test.jpg -crop 200x200+163+188 -rotate $[-$IN-90] jpg:- | convert - -crop 80x20+0+90 -rotate $[270+$IN] out.jpg
     

    +163+188 - координаты оси вращения. Исправлено: не оси вращения - угол квадрата. Ось будет +263+288 (начало=ось-сторона/2).
     
    ASE_DAG

    Цитата:
    Курл за парой мелочей нисколько не более функционален, чем Вэ-гет.

    AFAIK гораздо лучше работает с post запросами / легче создать имитацию браузера.
     
    Добавлено:

    Цитата:
    Кстати, для справки.

    Спасибо.

    Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 17:24 29-08-2012 | Исправлено: Alex_Piggy, 00:56 30-08-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alex_Piggy
    > гораздо лучше работает с post запросами / легче создать имитацию браузера
    Ну да, вы правы, Вэ-гет multipart/form-data вообще не умеет.

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

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



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

    Цитата:
    Arithmetic Expansion
    Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result.  The format for arithmetic expansion is:
     
        $((expression))
     
    The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
    bash(1)


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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:50 29-08-2012 | Исправлено: ASE_DAG, 23:52 29-08-2012
    dimmer123

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

    Цитата:
    Пока получил доступ к компьютеру Вы уже сами нашли/поняли  

    Начал проверять, работает, но не так как-надо. Проблема вот в чем: если повернуть картинку в photoshop - выглядит вот так, углы уходят за границы. А если повернуть в Imagemagick, получается так. Углы распирают картинку, изменяется размер и из-за этого нужный прямоугольник  неправильно вырезается.  

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 13:32 01-09-2012
    Alex_Piggy

    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый день, dimmer123
    Тогда попробуйте другую функциию - разворачиваете с помощью -distort SRT вокруг оси и затем вырезаете. RTFM, однако.
    convert test.jpg  -distort SRT 263,288,$[-$IN-90] -crop 100x20+163+278 out2.jpg
    Добавлено:  C тремя аргументами (-distort SRT X,Y,Angle) размеры изображения не меняются.

    Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 14:33 01-09-2012 | Исправлено: Alex_Piggy, 14:49 01-09-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dimmer123
    Цитата:
    Поворот изображения
    Чтобы повернуть изображение, указываем:
    -rotate "+-градусы"
    Для того, чтобы повернуть изображение по часовой стрелке, пишем -rotate "+90" для поворота против часовой стрелки, соответственно -rotate "-90"
    Если поворот производится на произвольное число градусов, то изображение поворачивается как целое, увеличиваясь для вмещения исходной картинки. Появившиеся области становятся цвета фона, который определяется параметром -fill цвет.

    Произвольную область можно вырезать в ImageMagic по точкам. Делается это в 2 этапа:
    Код:
    $ convert test.jpg -matte -fill none -draw 'color 0,0 reset' -fill red -draw 'polygon 256,276 270,297 328,261 310,234' polygon.png
    $ convert test.jpg -matte polygon.png -compose DstIn -composite out.png
    Усё собственно. Вырезается катинка по 4 точкам. Как расчитать координаты точек это отдельная математическая задача) Мб т. 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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:42 01-09-2012 | Исправлено: Alukardd, 14:43 01-09-2012
    dimmer123

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

    Цитата:
    Тогда попробуйте другую функциию - разворачиваете с помощью -distort SRT вокруг оси и затем вырезаете. RTFM, однако.

    Alex_Piggy, большое спасибо. Работает.

    Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 15:53 01-09-2012
    kpp77

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее...
     
    Имеется веб страничка, с помощью которой нужно ввести логин\пароль.
    Пробую curl-ом:
     

    Код:
     
      curl -k -v \
      --output file_rez\
      --user-agent Mozilla/4.0 -d "login=***&password=***"\
      https://stat.stat.net.ua
     

     
    Не удается. С curl-ом пока на "вы". Подскажите как нужно.
     
    Автоматом сообщение оборачивается в тег more, почему не понятно.
     [/more] [/more]

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    Цитата:
    Автоматом сообщение оборачивается в тег more, почему не понятно.  
    Потому, что форум настроен на "не доверие новичкам", что бы простыне в пост не выкладывали.
     
    Так данные-то надо передавать на страницу login.php, а не в корень сайта...

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:13 01-09-2012
    kpp77

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

    Код:
     
      curl -k -v \  
       --output file_rez\  
       --user-agent Mozilla/4.0 -d "login=***&password=***"\  
       https://stat.stat.net.ua/login.php
     

    Вернее так сразу и делал, потом пошли вариации

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    > Имеется веб страничка
    Локальная, да? Из Интернета не видна?
     
    > Не удается.
    То есть? Ввод вы приводите, а где вывод?

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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Из инете видна, вывод в файл file_rez - просто код страницы https://stat.stat.net.ua с формой ввода логина\пароля.
    Название сайта изменил на всякий случай.
    Если нужно реальное - https://stat2.magnus.net.ua

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    > вывод в файл file_rez - просто код страницы https://stat.stat.net.ua с формой ввода логина\пароля.  
    Этого не может быть. В ответ на $ curl -k -v --output file_rez  --user-agent Mozilla/4.0 -d "login=***&password=***" https://stat2.magnus.net.ua/login.php страница https://stat2.magnus.net.ua/ никогда не вернется. Наведите порядок у себя в экспериментальном журнале, иначе никогда не разберетесь. ;-)
     
    Попробуйте:
    $ UA="Mozilla/5.0 (X11; Linux x86_64; rv:10.0.6) Gecko/20100101 Firefox/10.0.6 Iceweasel/10.0.6"
    $ curl -i -k -c cookies.txt -F "login=yourlogin" -F "password=yourpass" -A "$UA" "https://stat2.magnus.net.ua/login.php"
    $ curl -i -k -b cookies.txt -A "$UA" "https://stat2.magnus.net.ua/" | iconv -f koi8-r


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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот это то, что нужно, дело в кукисах.
    Получается сначала логинимся, сохраняя куки, а потом заходим еще с использованием этих кукисов.
    А было: после аутентификации происходит редирект, и получалась опять форма логина\пароля.
     
    Благодарю ASE_DAG.
     
    На сколько важно\критично передавать информацию о браузере?
     

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    > после аутентификации происходит редирект
    Не совсем. Вы упорно не приводите вывод, а приводили бы — видели бы, что login.php возвращает 302 Found пустым полем Location. Это не стандартизированное поведение, и обрабатывать такой ответ могут по-разному: никак, как Location: / или как обновление текущей страницы. Курл его никак не обрабатывает. Ко всему прочему, и корректным редиректам он будет следовать только если явно ему это приказать (-L). Поэтому я и говорю, что «в ответ на $ curl -k -v --output file_rez  --user-agent Mozilla/4.0 -d "login=***&password=***" https://stat2.magnus.net.ua/login.php страница https://stat2.magnus.net.ua/ никогда не вернется».
     
    > Благодарю
    Всегда пожалуйста.
     
    > Насколько ... критично передавать информацию о браузере?
    Вы это меня спрашиваете? У меня действительного логина-пароля от этого ресурса нет.

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:53 02-09-2012
    kpp77

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее... Да, так и есть, каюсь, в ответ на $ curl -k -v --output file_rez  --user-agent Mozilla/4.0 -d "login=***&password=***" https://stat2.magnus.net.ua/login.php ничего не возвращается.
    Файл file_rez вообще не создается.
    Вывод:
     

    Код:
     
    < HTTP/1.1 302 Found^M
    < Date: Sun, 02 Sep 2012 13:43:32 GMT^M
    < Server: Apache/2.2.20 (FreeBSD) DAV/2 PHP/5.3.8 with Suhosin-Patch mod_ssl/2.2.20 OpenSSL/0.9.8q^M
    < X-Powered-By: PHP/5.3.8^M
    < Set-Cookie: PHPSESSID=; path=/^M
    < Expires: Thu, 19 Nov 1981 08:52:00 GMT^M
    < Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0^M
    < Pragma: no-cache^M
    < Location: ^M
    < Content-Length: 0^M
    < Content-Type: text/html^M
     

     
    >> Насколько ... критично передавать информацию о браузере?  
    > Вы это меня спрашиваете? У меня действительного логина-пароля от этого ресурса нет.
    Я за общий случай. Или это всегда индивидульно для каждого конкретного случая?
     [/more] [/more]

    Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 17:55 02-09-2012 | Исправлено: kpp77, 18:14 02-09-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    > Или это всегда индивидульно для каждого конкретного случая?  
    Да, это, очевидно, зависит от настроения в отношении неинтерактивных качалок со стороны владельцев ресурса. По-умолчанию веб-сервера никакой дискриминации по юзер-агентам не проводят, т. е. User-Agent: curl/7.26.0 в запросе их тоже устроит.
     
    > Set-Cookie: PHPSESSID=sessi0nc00kiehere; path=/^M  
    А куку по которой вы, тов. Кохан, только что авторизировались, публиковать в открытом виде не надо. ;-) Логин и пароль же вы не публикуете, верно?

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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Мда, совсем плох... ;(
     
    В шапку темы я бы еще добавил две хорошие книги:
    - Дэвид Тейнсли "Linux и UNIX: программирование в SHELL"
    - Д. Пик, Т. О'Райли, М. Лукидис "UNIX инструментальные средства" 2-е идание
    Доступны в электронном виде.

    Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 18:19 02-09-2012 | Исправлено: kpp77, 23:02 02-09-2012
    urodliv



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Коллеги.
    Пытаюсь для отладки скрипта использовать конструкцию:

    Код:
    read -s -n 1

    Вне циклов всё работает идеально. Но как только хочу притормозить вывод сообщений на экран в середине цикла, то данный код не помогает. Где косяк?

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

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



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

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:03 15-09-2012
    urodliv



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

    Цитата:
    УМВР

    Ну всё, сейчас будет наводнение от вопросов.
    Есть у меня файлик с таким содержимым:

    Код:
    tttt;15;1190;V-t-15-1190;O-t-15-1190-1;0
    tttt;15;1190;V-t-15-1190;O-t-15-1190-2;0
    tttt;15;1190;V-t-15-1190;O-t-15-1190-3;0
    tttt;15;1190;V-t-15-1190;O-t-15-1190-4;1
    tttt;15;1189;V-t-15-1189;O-t-15-1189-1;1
    tttt;15;1189;V-t-15-1189;O-t-15-1189-2;0
    tttt;15;1189;V-t-15-1189;O-t-15-1189-3;0
    pppp;11;889;V-p-11-889;O-t-11-889-1;1
    pppp;11;889;V-p-11-889;O-t-11-889-2;0
    pppp;11;889;V-p-11-889;O-t-11-889-3;0
    pppp;11;889;V-p-11-889;O-t-11-889-4;0
    pppp;11;888;V-p-11-888;O-t-11-888-1;0
    pppp;11;888;V-p-11-888;O-t-11-888-2;0
    pppp;11;888;V-p-11-888;O-t-11-888-3;1
     

    И есть маааленький тестовый скриптик (spisok.csv):

    Код:
    #! /bin/bash
     
    cat spisok.csv | while read line;
    do
        echo $line;
        read -s -n 1;
    done
     

    Я считал, что после вывода каждой строки программа должна ожидать от меня нажатия клавиши. Так нет же. Она вываливает весь список в терминал без задержки. Что я не догоняю?

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

    Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 18:16 15-09-2012
    FuzzyLogic



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

    Цитата:
    Я считал, что после вывода каждой строки программа должна ожидать от меня нажатия клавиши. Так нет же. Она вываливает весь список в терминал без задержки. Что я не догоняю?

    В обоих случаях (и while read line и read -s -n 1) ваши read'ы читают из STDIN куда вы кинули spisok.csv посредством cat. Вам нужен отдельный дескриптор для одного из read.
     
    Добавлено:

    Код:
     
    exec 3<spisok.csv
    while read -u 3 -r line; do  
      echo $line;  
      read -s -n 1;  
    done  
     

    как-то так

    Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 18:28 15-09-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    urodliv
    В дополнение к оперативному ответу тов. FuzzyLogic, могу заметить, что если бы файл spisok.csv имел осмысленное (или хотя бы типа Lorem ipsum) содержимое, то вы бы заметили, что вываливается на выход не весь список, а без первых букв каждой строки начиная со второй, которые как раз и были считаны при помощи read -s -n 1.

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:59 15-09-2012 | Исправлено: ASE_DAG, 19:00 15-09-2012
    urodliv



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

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

    Это-то я заметил. Но для меня это не являлось проблемой, поэтому не стал "бить в колокола".

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

    Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 19:33 15-09-2012
    kpp77

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

    Код:
    exec 3<spisok.csv
    ...
     
    явным образом закрывать входной поток 3 ?
    Не держится ли открытым файл spisok.csv?

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    > Нужно ли, после exec 3<spisok.csv явным образом закрывать входной поток 3 ?
    Если он вам не мешает, то не нужно. Для справки могу сообщить, что закрытие входного дескриптора делается так:
    $ exec 3<&-
     
    > Не держится ли открытым файл spisok.csv?
    Держится, разумеется, все время, пока выполняется процесс, его открывший.

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:42 18-09-2012 | Исправлено: ASE_DAG, 19:43 18-09-2012
    kpp77

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

    Цитата:
    > Не держится ли открытым файл spisok.csv?  
     Держится, разумеется, все время, пока выполняется процесс, его открывший.

    Вопрос в том, файл будет держаться открытым до окончания работы скрипта или до конца выполнения цикла while ?

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    В данном случае — до конца работы скрипта. Даже если бы цикл выполнялся как пайп — в отдельном от всего скрипта процессе (что не так), то какое это значение имело бы для дескриптора, который был открыт вне цикла? А вообще, вместо того, чтоб спрашивать хрен знает кого (т. е. меня), а потом верить этому х/з кому на слово, взяли бы и проверили бы сами:
    $ exec 3< .bashrc
    $ lsof -a -p $$ -d 3
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
    bash    7661 main    3r   REG    8,5     4353 3424635 /home/main/.bashrc
    $ exec 3<&-
    $ lsof -a -p $$ -d 3
    $

    В общих чертах понятно?
     
    И еще, кстати, почему, если не тайна, вас это все вообще волнует?

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

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

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    Всё это сильно сказано. Такие знания реально остаются в голове только с опытом, man'ом сыт не будешь если нету практики (тестовые примеры слабо спасают для крепких знаний).

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:37 19-09-2012
    kpp77

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    Абсолютно с Вами согласен.
    Теория + практика - только так.
    Пишу скрипты для домашней автоматизации и для всего, что под руку попадается
    Поднадоело программировать под Винду (занимаюсь этим с 1995 года), хотя именно это меня и кормит все эти годы.
    Поставил перед собой задачу изучить на практике программирование на Шелл, Перл, ПХП, Питон.
     

    Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 10:47 19-09-2012 | Исправлено: kpp77, 10:52 19-09-2012
    DocBeen



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

    Код:
     
    echo "Введите номер начального эпизода в каталоге";
    read j;
    find *.mp3 -type f | while read f; do
    mp3="$(basename $f .mp3).mp3"
    cue="$(basename $f .mp3).cue"
    mkdir $j
    mp3splt -c $cue $mp3 -d $j
    rm $mp3 $cue
    j=`expr $(echo $j) + 1`
    done
     

     
    где j номер вводимый самостоятельно (хотелось бы его извлечь из имени файла, собственно за советом к вам и обращаюсь)
     
    Файлы имеют такой вид:
     
    Armin_van_Buuren_-_A_State_of_Trance_551-SBD_(08-03-2012).cue
    Armin_van_Buuren_-_A_State_of_Trance_551-SBD_(08-03-2012).mp3
    Armin_van_Buuren_-_A_State_of_Trance_552-SBD_(15-03-2012).cue
    Armin_van_Buuren_-_A_State_of_Trance_552-SBD_(15-03-2012).mp3
    Armin_van_Buuren_-_A_State_of_Trance_553-SBD_(22-03-2012).cue
    Armin_van_Buuren_-_A_State_of_Trance_553-SBD_(22-03-2012).mp3
     
    хочу в конце разбить их по каталогам с названием эпизода (551,552,553)  
    разбиваю с помощью mp3splt
     
    буду рад совету как сие организовать чуть проще или удобнее.

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 12:19 19-09-2012 | Исправлено: DocBeen, 12:20 19-09-2012
    kpp77

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

    Код:
    sed 's/^.*_\([0-9]*\)-.*$/\1/'

    Инкремент (exp - встроенная команда шелла, expr - внешняя утилита):

    Код:
    j=`exp $j + 1`

    или

    Код:
    j=$(($j+1))

    Неясна запись типа:

    Код:
    mp3="$(basename $f .mp3).mp3"

    Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:45 19-09-2012 | Исправлено: kpp77, 13:06 19-09-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DocBeen
    1 - точка с запятой не обязательна, перевод строки тоже отделяет команды
    2 - вы не правильно используете команду find прочтите man... — find /path/to/folder -type f -name '*.mp3'
    3 - вообще разумнее сделать вообще без find: for f in /path/to/folder/*.mp3; do
    4 - табулируйте пожалуйста код, так ужасно неудобно читать
    5 - инкриментировать значение j лучше так — let i=i+1, вроде как-то еще можно было, не помню уже
    6 - все пути лучше брать в кавычки

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 12:48 19-09-2012
    DocBeen



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    kpp77
    mp3="$(basename $f .mp3).mp3" - отделяю название файла, которое в последствии будет использоваться конвертером имя файла mp3 совпадает с именем файла разметки.
     
    не совсем понял каким образом отделить название эпизода в названии файла с помощью

    Цитата:
    sed 's/^.*_\([0-9]*\)-.*$/\1/'

     
    и как создать в цикле каталоги с этими цифрами

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 13:30 19-09-2012
    kpp77

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DocBeen
    Как предложил Alukardd, сделать лучше циклом:

    Код:
    for f in /path/to/folder/*.mp3
    do
      mp3="${f}"  
      cue="$(basename ${mp3} .mp3).cue"  
     
      j=`echo "${mp3}" | sed 's/^.*_\([0-9]*\)-.*$/\1/'`
     
      mkdir ${j}  
      mp3splt -c ${cue} ${mp3} -d ${j}  
      rm ${mp3} ${cue}
    done


    Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 13:46 19-09-2012 | Исправлено: kpp77, 13:58 19-09-2012
    DocBeen



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Alukardd
    kpp77
    Огромное вам спасибо, все получилось как нельзя лучше.

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 14:12 19-09-2012
    DocBeen



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

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 22:50 19-09-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DocBeen
    Для этого нет смысла использовать связку bash + sed + mv, поскольку есть специально предназначенная для переименования по регэкспам утилита rename.
    $ rename 's/^(.*?) - (.*?) -/$2 - $1 -/' *
     
    Комментарии нужны?

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:13 19-09-2012 | Исправлено: ASE_DAG, 23:14 19-09-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DocBeen
    Мне проще при помощи awk...
    for f in *.mp3; do dst=$(echo "$f" | awk '{print $3,$2,$1,$4,$5;}'); mv "$f" "$dst"; done
    Предварительно надо перейти в нужную директорию.
     
    Добавлено:
    ASE_DAG
    Я как всегда. Так редко мне нужно выполнять подобные действия что об утилите rename я даже не помню.
    Обычно мне всегда хватает mv /path/{old,new}

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:13 19-09-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    > print $3,$2,$1,$4,$5;
    Эм? Почему пять полей?

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Надо прокомментировать, что -n симулирует работу.
    А зачем "?" после .*
     
    Добавлено:
    ASE_DAG
    автор, номер, название и 2 дефиса :-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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:18 19-09-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    > об утилите rename я даже не помню
    Нет, вы правы, парсить регэкспами строку которую следовало бы разбивать по разделителям ф-ей типа split() не очень правильно, просто в таком простом случае — не проблема. Но что вы написали — я так и не понял — вы же не переопределили разделитель, т. е. строка бьется по пробелам, так? Все-равно не понял.

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Цитата:
    строка бьется по пробелам, так? Все-равно не понял.
    вроде среда, а не пятница... 4 пробела = 5 подстрок.

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    > 4 пробела = 5 подстрок
    Так там же их больше, причем неизвестное количество! Это не башевский read A B C D, который в $D запишет без разбиения все, что осталось до конца строки.
     
    $ for f in *.mp3; do dst=$(echo "$f" | awk '{print $3,$2,$1,$4,$5;}'); echo "SRC: $f"; echo "DEST: $dst"; done
    SRC: Автор - 01 - название композиции.mp3
    DEST: 01 - Автор - название

     
    Как видите-с ерунда выходит.

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Согласен. Хрень. Надо менять -F' - ' и оставлять только 3 поля.
    for f in *.mp3; do dst=$(echo "$f" | awk -F' - ' -v OFS=' - ' '{print $2,$1,$3;}'); mv "$f" "$dst"; done
    Всё я за rename в данной ситуации) Спать пора)

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:41 19-09-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DocBeen
    Вот на чистом Баше, без rename’а, регэкспов и других write-only приемов.
     
    $ IFS=' - '
    $ for f in *.mp3; do read A B C <<< "$f"; mv -v "$f" "$B - $A - $C"; done

     
    Добавлено:
    Alukardd
    > Надо менять -F' - ' и оставлять только 3 поля
    И получаем ограничение на отсутствие ' - ' в названии композиции. Ага. ;-)

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:46 19-09-2012
    DocBeen



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    От решений голова идет кругом, но ни одно не подходит
    Я так понимаю название файла удобнее разделить на две части: та что до номера и та что после номера (до расширения) - при том разделить как раз таки " - " {пробел дефис пробел}
     
    может поможет листинг части каталога:
     
    Alexander Popov - 04 - When The Sun (Eximinds Remix) [Tune Of The Week].mp3
    Armin van Buuren pres. Gaia - 21 - J'ai Envie De Toi.mp3
    Ashley Wallbridge & Andy Moor feat. Gabriella - 06 - World To Turn.mp3
    Ashley Wallbridge - 07 - Zorro.mp3
    Ashley Wallbridge - 08 - Mumbai Traffic.mp3

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 06:18 20-09-2012 | Исправлено: DocBeen, 06:19 20-09-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Цитата:
    получаем ограничение
    конечно получаем
    Цитата:
    $ IFS=' - '  

    Вы, кстати, мне так и не сказали, а зачем Вы использовали ленивый квантификатор, в данном случае это абсолютно всё-равно.
     
    DocBeen
    у?
    Все предложенные нами решения рабочие, кроме моего самого первого, я там не учёл один факт. Остальные 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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 09:30 20-09-2012 | Исправлено: Alukardd, 09:30 20-09-2012
    DocBeen



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

    Код:
     
    #!/bin/sh
    IFS=' - '
    for f in *.mp3; do read A B C <<< "$f"; mv -v "$f" "$B - $A - $C"; done
     

     
    при запуске ругается на синтаксическую ошибку в строке

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 09:48 20-09-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    DocBeen
    #!/bin/bash же!

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:10 20-09-2012
    kpp77

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

    Код:
    #!/bin/sh
    for f in *.mp3
    do
      fn="`echo "${f}" | sed 's/^\(.*\) - \([0-9]*\) - /\2 - \1 - /'`"
      mv "${f}" "${fn}"
    done
     

    или

    Код:
    #!/bin/sh
    for f in *.mp3
    do
      eval mv `echo "${f}" | sed 's/^\(.*\) - \([0-9]*\) - \(.*\)$/\"&\" \"\2 - \1 - \3\"/'`
    done

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



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Все прекрасно работает - Огромное спасибо!!!

    Всего записей: 147 | Зарегистр. 15-07-2005 | Отправлено: 11:42 20-09-2012 | Исправлено: DocBeen, 12:06 20-09-2012
    kpp77

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpp77
    Это совсем косячно) Если использовать regexp'ы, то rename делает это много проще, в одну команду...
     
    Добавлено:
    DocBeen
    Уберите знаки вопроса из команды rename, написанной т. 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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 11:53 20-09-2012
    kpp77

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    Почему косячно?
    Главное работает.
    Не спорю, что можно использовать более специализированные утилиты - и быстрее и код короче. Но не всегда о них помнишь\знаешь.
    Что-то мелькало в нете о проблеме с юникодом\русскими буквами в утилите rename...

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    >> получаем ограничение на отсутствие ' - ' в названии композиции
    > конечно получаем ;-)
    А не должны бы. В примере read’ом, какой я привел выше, этого ограничения нет.
     
    >> s/^(.*?) - (.*?) -/$2 - $1 -/
    > зачем Вы использовали ленивый квантификатор
    А что в этом плохого? Если вы спрашиваете, почему нельзя так:
    s/^(.*) - (.*) -/$2 - $1 -/
    , то ровно по тому же самому — получаем ограничение на дефисоминус в роли тире в названии композиции.
     
     
    >> $ IFS=' - '  
    > :lol:
    А чего тут смешного? Само сочетание ' - ' что ли?

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Цитата:
    получаем ограничение на дефисоминус в роли тире в названии композиции.
    что-то у меня с воображением плохо... А если первый оставить жадным, а второй ленивым. К тому же .* всегда можно заменить, на [^-] там где это наверняка будет правдой, например в номере.
    Смайлик читать надо было в контексте предыдущей строчки, т.е. Вы сами сказали что плохо и тут же предложили такой же вариант, только без 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.

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    > А если...
    > что-то у меня с воображением плохо
    В таком случае на помощь может придти возможность непосредственной экспериментальной проверки. Мы же ведь тут не теорию изучаем.
     
    > Вы сами сказали что плохо и тут же предложили такой же вариант, только без AWK
    О_о Господь с вами! Где я такое сказал? Напротив, я, кажется, говорил, что «вы правы, парсить регэкспами строку которую следовало бы разбивать по разделителям функцией типа split() не очень правильно».

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:30 21-09-2012 | Исправлено: ASE_DAG, 15:31 21-09-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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:37 21-09-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Alukardd
    >>> сами сказали что плохо
    >> Напротив
    > я про вот это сообщение
    А что в нем? Если вы про доп. ограничение на входные данные, то все правильно — в вашем варианте оно добавляется, а в моем таки нет. ;-)

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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:44 21-09-2012 | Исправлено: ASE_DAG, 15:46 21-09-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Это да.
    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.

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:58 21-09-2012
    LevT



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

    Полезная статейка http://habrahabr.ru/post/153785/
     
    Самому себе на заметку. Сейчас мне не до шелла, но полгода назад мне она очень пригодилась бы.

    Всего записей: 17211 | Зарегистр. 14-10-2001 | Отправлено: 13:50 08-10-2012
    drrdar

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Приветствую. Если темой ошибся, просьба тапками не забрасывать.
     
    Есть демон, который в самый неподходящий момент начинает слушать определённый порт. В логику работы демона вмешиваться нельзя, его можно только прибить, когда он начинает это делать. Собственно, его нужно прибивать в этот самый момент, и в этом задача. Зачем? Очень нужное приложение слушает тот же самый порт, сменить порт нельзя. Если оно запускается и видит, что кто-то слушает тот же самый порт, оно схлопывается. Есть идея перед запуском приложения использовать вывод netstat -tapn | grep LISTEN | grep тот-самый-порт, отсюда выявить pid, а далее что-то типа kill -9 pid. Как это в скрипте изложить с минимальным количество знаков? Или хоть примерно как оно должно быть? Спасибо.
     
    P.S. "Курить маны" - покурим, но зашиваемся конкретно. Варианты со всякого рода Selinux'ами - не варианты.

    Всего записей: 25 | Зарегистр. 06-03-2008 | Отправлено: 19:06 08-10-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    $ PORT=58781
    $ fuser $PORT/tcp --kill


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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:40 08-10-2012
    drrdar

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG,
     
    хахаха. Вот уж не думал. Спасибо, попробую.

    Всего записей: 25 | Зарегистр. 06-03-2008 | Отправлено: 20:56 08-10-2012
    urodliv



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Коллеги.
    А как в цикле запускаемую программу отправить в фон?
    Пример таков:

    Код:
    for i in 2 3 4 5; do iperf -c 192.168.8.$i &; done

    В ответ получаю это:

    Код:
    -bash: syntax error near unexpected token `;'

    Как правильно будет?

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    urodliv
    Вы, вероятно, будете удивлены. :-)
     
    for i in 2 3 4 5; do iperf -c 192.168.8.$i & done
     
    Об’яснение:
    Цитата:
    control operator
              A token that performs a control function.  It is one of the following symbols:
              || & && ; ;; ( ) | |& <newline>
    bash(1)

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

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



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

    Цитата:
    Вы, вероятно, будете удивлены. :-

    Чёрт возьми, ещё как буду!
    Преподаватель на занятиях требовал перед done ставить точку с запятой, вот и ставил... До сегодняшнего дня.

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

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



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    urodliv
    > ещё как буду
    Тем не менее, как видно из выдержки из мана, все предельно логично.
     
    > Преподаватель на занятиях
    А если не секрет, где вы учились, что вам Баш преподавали?


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

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:39 28-10-2012
    Maximus777

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

    Код:
    cp -r --preserve $Path1/Folder $Path2

    Как бы её превратить в регистронезависимую команду? В смысле, чтобы не копировались файлы, имеющие одинаковые имена, только в разных регистрах. У cp не нашёл такой опции, а find что-то не получается забороть.

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 09:08 05-11-2012 | Исправлено: Maximus777, 10:21 05-11-2012
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maximus777
    Непостредственно cp или, например, rsync заставить игнорировать разницу регистров нельзя, поскольку они не занимаются сравнением файлов по именам, просто запрашивают у системы наличие того или иного файла.
    Вы лучше об’ясните исходную задачу. И поясните, какой файл из, например, file, File, FILE надо скопировать, а какие проигнорировать.

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

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

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

    Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 13:04 05-11-2012
    Alukardd



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maximus777
    Есть вариант хранить в папке в лине всё всегда в нижнем регистре. Т.е. всегда при копировании опускать регистр.

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

    Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:58 05-11-2012
    Открыть новую тему     Написать ответ в эту тему

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