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

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



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мы в Юниксе, дружище. Найди другое средство для зеркалирования информации и не парься.
 

Всего записей: 460 | Зарегистр. 31-05-2004 | Отправлено: 14:26 17-05-2008 | Исправлено: vlader2004, 14:27 17-05-2008
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:44 17-05-2008 | Исправлено: digital422, 18:45 17-05-2008
NightSpamer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422, А если сначала создать (чем-то вроде mkdir -p `find $SOURCE_DIR -name '*.OLD*' -exec echo $TARGET_DIR{} \; | grep -o ".*\/" | sort | uniq`) папки, и вторым проходом уже перемещать файлы?
Криво, как-то, но может и заработать. Других идей пока всё равно нет...

Всего записей: 291 | Зарегистр. 28-11-2006 | Отправлено: 08:33 19-05-2008
realbrother

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ОНЛАЙН КИНОТЕАТР - ВЫСОЧАЙШЕЕ КАЧЕСТВО ПРОСМОТРА В ИНТЕРНЕТЕ! ВСЕ НОВИНКИ, АРХИВ ФИЛЬМОВ ОБНОВЛЯЕТСЯ ЕЖЕДНЕВНО! ВСЕГО ДОБРОГО!
 
www.спам.ru

Всего записей: 1 | Зарегистр. 19-05-2008 | Отправлено: 21:52 19-05-2008 | Исправлено: ShriEkeR, 14:47 25-12-2009
amorua

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
if [ -e `dirname $NEWPATH/$FILE` ]; then
 mv $FILE  $NEWPATH/$FILE
else  
 mkdir `dirname $NEWPATH/$FILE`
 mv $FILE  $NEWPATH/$FILE
fi

Всего записей: 429 | Зарегистр. 09-02-2004 | Отправлено: 23:20 20-05-2008 | Исправлено: amorua, 23:21 20-05-2008
NightSpamer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
amorua
mkdir /a/b/c/d не создаёт /a/b/c/d если есть только /a/b/. Нужно mkdir -p

Всего записей: 291 | Зарегистр. 28-11-2006 | Отправлено: 11:31 21-05-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, попробую!
Нужна помощь еще в одном скрипте, его задача - проверять 2 папки, IN и OUT.
Проверять папку OUT и если там есть файлы как в IN, то не копировать их. Если в IN папке файл появился, то копировать в папку OUT (если еще сделать проверку по контрольным суммам, будет здорово).
Вот мой вариант, но в нем неправильно сделана проверка папок, поэтому копирование не идет:
 
#!/bin/sh
PATH_IN="/backup/IN/"
PATH_OUT="/backup/OUT"
FIND_IN=`find $PATH_IN -iname *.doc -type f`
 
for i in $FIND_IN
do
echo $i
if [test -s "$i"]; then
else
cp $PATH_IN*.* $PATH_OUT
fi
done

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 09:26 04-08-2008 | Исправлено: digital422, 11:53 04-08-2008
iltmpz

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

Всего записей: 281 | Зарегистр. 05-04-2006 | Отправлено: 13:30 04-08-2008
SysCommander

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

Цитата:
Проверять папку OUT и если там есть файлы как в IN, то не копировать их.

 
посмотри в сторону rsync, тем более что обе директории локальные.

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 20:24 04-08-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хм, не знал что так просто, cp -u.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 11:25 05-08-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Снова возникла задача для скрипта. Есть какие-то проблемы с железом, в логах появляется сообщение  
NETDEV WATCHDOG: eth0: transmit timed out, железо поменяется, но неизвестно когда.
Нужен скрипт, в котором при появлении сообщения:
tail -f /var/log/syslog |grep "NETDEV WATCHDOG"
выполнялась комманда reboot. Поможете?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 13:45 16-08-2008
SysCommander

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

Цитата:
железо поменяется, но неизвестно когда

 
Гы. Так недалеко и до "зарплата будет, но неизвестно когда". Советую задуматься о смене работы.
 

Цитата:
выполнялась комманда reboot

 
А просто вариация на тему
 
ifconfig eth0 down; ifconfig eth0 up
 
или rmmod+modprobe модуля для сетевушки не помогает?
 
 

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 15:17 16-08-2008
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
ну можно примерно так через временный файл:

Код:
 
#!/bin/bash
##
 
# если временный файл существует, удаляем его
if [ -e tmpfile ]; then  
    rm tmpfile
fi
# создаём временный файл нулевого размера
touch tmpfile
 
# пока размер остаётся нулевым, перечитываем файл syslog
while [ ! -s tmpfile ]; do
    tail /var/log/syslog | grep "NETDEV WATCHDOG" > tmpfile
done
# как только файл ненулевой, перегружаемся
reboot

 
Добавлено:
SysCommander

Цитата:
ifconfig eth0 down; ifconfig eth0 up  

проще тогда через service network restart


----------
Я никогда не спорю. Я никогда не противоречу. Я иногда забываю. / © Б.Дизраэли/

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 15:23 16-08-2008 | Исправлено: albel, 15:24 16-08-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это плавающая проблема, железо может работать больше месяца, а может и один день. Мат плата в принципе новая, Nvidia чипсет, видимо из-за этого возникает проблема с доступом по сети, встроенные сетевые карты при подключении разъема вешали комп намертво, поставил Делинки 530-е.
Пока сделал самое простое:
 
if ping -q -c 2 $HOST; then
    echo "ping OK"
else
    echo "ping BAD"
    reboot
fi

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:44 16-08-2008
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
а с tail'ом вариант чем не устроил?

----------
Я никогда не спорю. Я никогда не противоречу. Я иногда забываю. / © Б.Дизраэли/

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 20:53 16-08-2008
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 11:26 17-08-2008 | Исправлено: digital422, 11:38 17-08-2008
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
Как хотите. Если по крону - то надо предусмотреть завершение работы скрипта перед следующим запуском.

----------
Я никогда не спорю. Я никогда не противоречу. Я иногда забываю. / © Б.Дизраэли/

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 12:05 17-08-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Запустил по cron, не срабатывает. завершение работы скрипта перед следующим запуском - exit 0 ?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 15:44 17-08-2008
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
гм. Ну, выход из скрипта можно и через exit сделать, да. Вопрос в том, что тогда надо ещё прописывать время в скрипт или проверять, не запущен ли уже скрипт; если запущен - не стартовать новый. Второй путь прощё. Через ps | grep...

----------
Я никогда не спорю. Я никогда не противоречу. Я иногда забываю. / © Б.Дизраэли/

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 23:19 18-08-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Запустил скрипт по cron с интервалом в 5 мин, вроде работает, а после Вашего сообщения сделал ps и немного стало плохо, сколько его было в процессах. Прописал в начале скрипта killall script-net.sh.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 11:35 19-08-2008
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
а зачем пускать скрипт каждые пять минут?
Скрипт же будет работать, пока не появится сообщение об ошибке.
Его можно в автозагрузку поставить при старте системы - и всё.

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 12:50 19-08-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как можно засунуть этот скрипт в процессы? Я его запускаю, он висит как запущенный процесс, но при Ctrl+C и выходе из сеанса в процессы он не попадает. С cron тоже непонятки: ждал 15 срабатываний (через минуту), но по ps скрипт не увидел, тогда как в прошлый раз он наплодился в процессах?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:20 20-08-2008
chu80

Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Скрипт будет висеть в процессах пока не отработает либо пока не вывалится в результате ошибки.  Если скрипта в процессах нет, значит он отработал. ps показывает текущие процессы.  
 
По Ctrl+C ты просто вручную завершаешь работу скрипта. Чтобы этого не происходило в конце добавляй через пробел &
 
Лучше всего запускать скрипт (чтобы он не вываливался когда завершает работу shell его породивший) из другого скрипта. Поправьте меня, если не прав.

Всего записей: 11 | Зарегистр. 14-05-2008 | Отправлено: 05:48 22-08-2008
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возник снова вопрос по скрипту. Есть скрипт на базе rsync, который запускается по cron каждые 10 минут. Если размер файла не успевает скачаться то запускается 2-я копия rsync (были случаи когда из висело порядка 30 штук.). Вопрос-как должна выглядеть строка, которая проверяет наличие в процессах уже запущенного rsync и не давать запускать новой копии?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:24 31-03-2009
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
добрый день. подскажите, как проверить, что входной параметр ($1) в скрипте является числом

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 07:09 30-08-2009
albel



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Jokerjar79
Чтобы проверить, является ли слово числом, попробуйте прибавить к нему любое число (например, 0) командой expr. Если expr завершится с кодом 0, то слово является числом, иначе - нет.  
 

Код:
 
#!/bin/bash
if [ -z $1 ]; then
    echo "You must provide at least one command line argument"
    exit -1;
fi
expr $1 + 0  1>>/dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "$1 is a number"
else
    echo "$1 is a string"
fi
 


----------
Я никогда не спорю. Я никогда не противоречу. Я иногда забываю. / © Б.Дизраэли/

Всего записей: 11003 | Зарегистр. 30-08-2002 | Отправлено: 11:13 30-08-2009
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, как в сделать в блоке if [ ]; then сравнение файла по размеру? Задача-есть файл, его надо проверять через определенный промежуток времени, если он 0 размера или не изменил свой размер - то выполнять комманду.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 10:27 19-11-2009
FuzzyLogic



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

Код:
 
FILENAME=zz.sh
FILESIZE=$(stat -c%s "$FILENAME")
if [ "$FILESIZE" = "0" ] ; then
  .......
fi
 

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 10:31 19-11-2009
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:38 28-11-2009 | Исправлено: digital422, 10:33 08-05-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите дописать скрипт. Есть папка с картинками, которые создаются ежедневно, надо сделать рассортировку из них по папкам.  
 
#!/bin/sh  
LS=`ls --full-time $PATH_IN |awk '{print($6)}' | uniq`  
 
for create_dir in $LS  
do  
    mkdir -p $PATH_OUT/$create_dir  
done  
 
Создаются папки, например 2010-04-21, 2010-05-01 и т.д., как теперь сделать перемещение файлов одного дня в папку с нужной датой?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 10:34 08-05-2010
ulego

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
for i in `ls -tl | awk '{print $6}' | uniq | sort`; do for f in `ls -lg | grep -e $i | awk '{print $7}'`;do mv $f ../$i ;done;done
Так например, но это такое через спину, что даже не ругайся!  
 
Добавлено:
Лучшее это сделать через find (в смысле найти файлы по времени и передвинуть), но идея понятнэ

Всего записей: 35 | Зарегистр. 16-05-2008 | Отправлено: 19:52 02-06-2010
SysCommander

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
некрофилы
 
по сабжу:
 
for i in `ls` - это известный bash pitfall, так ни в коем случае нельзя делать

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 21:53 02-06-2010
ulego

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SysCommander
А что такое питфал? И скажи как правильнее?  
digital422
 
Еще дату создания файла можно узнать так:  
date -r $files +%F
 
 
Добавлено:
for file in *; do if [[ ! -f $file ]];then date -r $file +%F; fi; done  
 
 
Добавлено:
Эх!  
Вот эта строчка делает папки и рассовывает туда файлы по дате создания  
for file in *; do if [[  -f $file ]];then dirname=$(date -r $file +%F) && [ -d $dirname ] ||  mkdir $dirname && mv $file $dirname/$file; fi; done  

Всего записей: 35 | Зарегистр. 16-05-2008 | Отправлено: 11:27 03-06-2010
SysCommander

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

Цитата:
А что такое питфал? И скажи как правильнее?

 
http://mywiki.wooledge.org/BashPitfalls

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 22:40 03-06-2010
ulego

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот спасибо, хорошо!  
Наконец-то я увидел ребят, которые думают не о том, что Столлмен говорит, а о работе!  
Никаких свобод, главное - правила!  
 
 
Добавлено:
Но вообще я неправ и прошу прощения, ибо учиться надо с верного!  
Но конструктивнее переводить термины на родной язык, а так же предлагать свои решения проблемы, и все-таки Спасибо SysCommander искренне
 
 
Добавлено:
http://bappoy.pp.ru/2008/12/13/bash-pitfalls-part01.html

Всего записей: 35 | Зарегистр. 16-05-2008 | Отправлено: 12:08 04-06-2010
SysCommander

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

Цитата:
конструктивнее переводить термины на родной язык

 
На чей родной язык?
С таким подходом был бы сейчас линукс на финском и пользовался бы им только Торвальдс.
Английский является стандартом интернета и его надо учить, это факт.
 

Цитата:
http://bappoy.pp.ru/2008/12/13/bash-pitfalls-part01.html

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

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 14:48 04-06-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ подскажите плз...
настроил прогу free-sa для анализа логов squid3... запихал скрипт в cron.daily только вот я написал только для ежедневных и ежемесячных отчётов...
ни как не могу понять как написать на еженедельный...
синтаксис вызова создания отчётов "free-sa -o $DIRECTORY -d $from-"
так сейчас вызывается для дня и месяца
Код:
# ежедневный
date1=`date +%x`
free-sa -o /var/www/free-sa-reports/daily -d $date1-
# ежемесячный
cur_m=`date +%m`
cur_g=`date +%g`
free-sa -o /var/www/free-sa-reports/monthly -d 01.$cur_m.20$cur_g-
не могу понять как определить число понедельника текущей недели... отчёты понятное дело месячные и недельные меняются каждый день, но с заменой своих аналогов за меньший период времени...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:17 04-06-2010 | Исправлено: Alukardd, 15:26 04-06-2010
H4rDc0r3

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Собсна в создании баш-скриптов я вообще ничего не понимаю, поэтому прошу помощи у пользователей этого форума,
Сабж: http://radjik.blogspot.com/2010/03/wwwpixivnet.html
может кто-нибудь объяснить, ну или даже сделать этот скрипт?
поэтапно, если можно.
Лог и пасс на тест:  
Log(pixid): scarletttt
Pass(pixpass): 666b255
 
Направили сюда, сказали, что тут могут помочь =)
 
И ещё вопросец, под Windows 7 нельзя такое сделать? или только под UNIX OS можно?
 
Заранее огромное спасибо
 

Всего записей: 10 | Зарегистр. 19-09-2010 | Отправлено: 19:48 19-09-2010
Alukardd



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

Цитата:
И ещё вопросец, под Windows 7 нельзя такое сделать?
можно, но думаю для этого вам придется скачать unix'овые утилиты под вынь, а именно pcregrep, sed, wget, curl и будет вам счастье и среди форточек...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:18 19-09-2010 | Исправлено: Alukardd, 20:19 19-09-2010
H4rDc0r3

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

Всего записей: 10 | Зарегистр. 19-09-2010 | Отправлено: 21:24 19-09-2010 | Исправлено: H4rDc0r3, 21:48 19-09-2010
Maximus777

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

Код:
if (("$a" > 30)); then

а в таком нет:

Код:
if ["$a" -gt 30]; then

Как надо правильно сравнивать?

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:13 10-10-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
сравнивать так и надо - вот статья
после [ нужен пробел! - иначе он считает что это 1 выражение, а на самом деле это начало оператора test...
 
Добавлено:
к тому же прочтите, это - там 3 части. ссылка

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

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

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

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 09:00 11-10-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mint85
точно не скажу, но в общем смысл такой
Код:
login='login'
pwd='password'
AUTH=`curl -s -F"mode=login" -F"password=${pwd}" -F"username=${login}" -F"skip=1" "http://member.21sextury.com/login" -с "cookie.txt"`
wget --load-cookies=cookie.txt "http://l.at.video.member.21sextury.com/video/movie/20/3631/v3631-499.mp4?SID=782874163209877"
SID скорее всего надо будет определять как-то... ну в общем надо его пилить под конкретный сайт.
 
А вообще у меня есть 2 предложения:
1 - заканчивайте смотреть порнуху.
2 - на кой хер вам wget сдался? качайте через аддон для FF - FVD. И будет вам счастье...

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

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

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

Цитата:
Mint85
точно не скажу, но в общем смысл такой
Код:
login='login'
pwd='password'
AUTH=`curl -s -F"mode=login" -F"password=${pwd}" -F"username=${login}" -F"skip=1" "http://member.21sextury.com/login"`
wget --load-cookies=cokie.txt "http://l.at.video.member.21sextury.com/video/movie/20/3631/v3631-499.mp4?SID=782874163209877"  

 
спасибо =) но куда это вписать ?

Всего записей: 10 | Зарегистр. 18-10-2010 | Отправлено: 22:07 18-10-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mint85
Цитата:
спасибо =) но куда это вписать ?
вы прочитали послекодовые мои коменты?
вы знаете что такое linux и откуда взялась утилита wget?
 
этот скрипт надо еще дорабатывать напильником!!! так оно не заработает - даю 99%.

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:11 18-10-2010 | Исправлено: Alukardd, 22:18 18-10-2010
mint85

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну знаюю
мне сайт надо пополнить  
а с wgetom удобнее я так делал многие сайты
просто именно этот сайт с проблемой

Всего записей: 10 | Зарегистр. 18-10-2010 | Отправлено: 22:26 18-10-2010
vlary



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


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

Всего записей: 17280 | Зарегистр. 13-06-2007 | Отправлено: 23:45 18-10-2010
mint85

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

Цитата:
Мдааа, достойное пополнение
 
гммм даа

Всего записей: 10 | Зарегистр. 18-10-2010 | Отправлено: 00:31 19-10-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Снова обращаюсь за помощью.
Надо сделать вывод файлов в каталоге в файл без имен каталогов, в которых находятся эти файлы.
Т.е нужен обычный список в котором будут имена файлов.
 
Вот что делал:
1. find /path -type f > /export.txt - такой вариант устроил бы, если бы убрать путь, при таком виде в файл записывается полный путь к файлу.
2. cd /path; ls -R > /export.txt - так вначале выводятся имена каталогов, они не нужны.

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



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

Цитата:
1. find /path -type f > /export.txt - такой вариант устроил бы, если бы убрать путь, при таком виде в файл записывается полный путь к файлу.


Код:
find /path -type f -fprintf name_of_file '%f\n'


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

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 19:46 14-12-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
а можно и поизвращаться... ^_^
Код:
ls -l /path | grep ^- | awk '{ for (i=8;i<=NF;i++) printf $i FS; print ""}'>listoffiles.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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:18 14-12-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сделал так:
find /path -type f -printf "%f\n" | sort -n > export.txt
Спасибо за помощь!

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:34 14-12-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжаем начатое 4 постами раньше.
В табличном редакторе (Excel или OO) человек формирует небольшой список из нескольких ячеек и в последней ячейке пишет начальную часть физического файла, например 0001, а сам файл - 0001_name.ext. Конечным результатом работы человека является csv файл на выходе.
Задача - заменить цифровые значения реальными именами из txt файла, который был получен в результате предыдущего поста.
Как я вижу решение:
Найти в 1 строке csv файла цифровое значение, найти это значение в export.txt и заменить его на полное. Перейти на 2 строку и повторить процедуру и так до последней строки. Реально ли такое сделать в bash ?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:06 24-12-2010
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
<Не туда>.
 
Добавлено:
digital422
Без примера плохо понятно. Киньте сюда оба файла.

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет пункта по вставке файла. Вот примерный финальный csv:
 
"дата","источник","исполнитель","имя"
"23.12.2010","hdd","asasasa","0001"
"23.12.2010","hdd","dsdsdsd","0002"
"23.12.2010","hdd","asasasa","0003"
"23.12.2010","hdd","dsdsdsd","0004"
"23.12.2010","hdd","asasasa","0005"
"23.12.2010","hdd","dsdsdsd","0006"
"23.12.2010","hdd","asasasa","0007"
 
вот реальное название файла для 2 строки: 0001_files.jpg
вот реальное название файла для 3 строки: 0002_files.jpg
вот реальное название файла для 4 строки: 0003_files.jpg
и т.д.
 
надо заменять данные в последней ячейке "имя" на реальное имя.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:55 24-12-2010 | Исправлено: digital422, 19:57 24-12-2010
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Вот вам немного быдлокода: :)
 
echo имя | cat - 422.ls | paste -d ',' 422.csv - | awk -F ',' '{print $1","$2","$3",""\""$5"\""}' -
 
А вообще, надо поискать что-нибудь для работы с csv.

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

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



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

Код:
awk -F\" 'NR!=1 {print("\""$2"\",\""$4"\",\""$6"\",\""$8"_files.jpg\"")}' 1.csv


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

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 21:43 24-12-2010
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Если 0001 всегда порождает 0001_files.jpg, то конечно. Но как я понял из прошлых постов, это не так.
 
P.S. А почему в качестве разделителя записей у вас кавычка?

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

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



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

Цитата:
А почему в качестве разделителя записей у вас кавычка?


Код:
gawk -F, 'NR!=1 {print($1","$2","$3","$4"_files.jpg")}' 1.csv

результат:

Код:
"23.12.2010","hdd","asasasa","0001"_files.jpg
"23.12.2010","hdd","dsdsdsd","0002"_files.jpg
"23.12.2010","hdd","asasasa","0003"_files.jpg
"23.12.2010","hdd","dsdsdsd","0004"_files.jpg
"23.12.2010","hdd","asasasa","0005"_files.jpg
"23.12.2010","hdd","dsdsdsd","0006"_files.jpg
"23.12.2010","hdd","asasasa","0007"_files.jpg

Последняя кавычка всё портит. Я в этом деле не силён, поэтому извращаюсь.
 
Добавлено:
Мда почитал исходную задачу. Моя "шляпа" является лишь частью решения.

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

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 22:23 24-12-2010
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, все-таки то, что я написал в прошлый раз, лучше не использовать.
Накатал куда менее быдлокодерский пример, вот:
 
awk -F ',' -v ORS='' -v OFS=',' 'NR==1{print $0"\n"}; NR!=1{print $1,$2,$3; getline < "422.ls"; print ",\""$0"\"\n"}' 422.csv
 
;)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:52 24-12-2010 | Исправлено: ASE_DAG, 22:58 24-12-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кавычка была по умолчанию при экспорте из OO, можно и табуляцию использовать.
"23.12.2010"    "hdd"    "asasasa"    "0001"
"23.12.2010"    "hdd"    "dsdsdsd"    "0002"
"23.12.2010"    "hdd"    "asasasa"    "0003"
"23.12.2010"    "hdd"    "dsdsdsd"    "0004"
Не факт, что имя файла будет называться именно 0001_files.jpg, вместо files может быть любое имя, включая знаки нижнего подчеркивания. Но одно условия неизменно-это начальный ID, он всегда в имени файла будет соответствовать последней ячейке (xls.oo,csv).

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 07:46 25-12-2010 | Исправлено: digital422, 07:49 25-12-2010
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> Кавычка была по умолчанию при экспорте из OO, можно и табуляцию использовать.  
Кавычка? Запятая, вы хотели сказать. Но это не важно.
 
 
Итак, все работает правильно? Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:03 25-12-2010
urodliv



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

Цитата:
Итак, все работает правильно?

Почти. Тут есть одна загвоздка. digital422 хочет чтобы из файла 422.ls не просто строки подставлялись, а из всего файла выбиралась нужная строка. То есть как я понял в файле 422.csv строки не сортируются по последнему полю и их число не обязательно совпадает с количеством строк в файле 422.ls
 


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

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 21:11 25-12-2010
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:16 25-12-2010 | Исправлено: ASE_DAG, 21:16 25-12-2010
urodliv



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

Цитата:
Если файлы не отсортированы, то их просто надо отсортировать.

Оно понятно, но вдруг тут важен "момент вхождения"...

Цитата:
Если их число не совпадает, то я не понял, что за задача стоит перед опом.

Мая не автор ТЗ, мая только предполагать

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

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 21:18 25-12-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Поставлю задачу еще раз.
1. есть файл с содержимым реальных файлов:
disk-files.txt:
22345_2010-12-11_145037.jpg
00001_2010-12-01_221650.jpg
63211_2010-12-20_164238.jpg
13455_2010-12-01_221718.jpg
15124_2010-12-06_221737.jpg
28764_2010-12-12_145043.jpg
14567_2010-12-03_221723.jpg
62345_2010-12-13_211723.jpg
и т.д. список большой.
 
2. есть csv файл:
25-12-2010.csv
"23.12.2010","hdd","asasasa","22345"
"23.12.2010","hdd","dsdsdsd","00001"
"23.12.2010","hdd","asasasa","63211"
"23.12.2010","hdd","dsdsdsd","13455"
"23.12.2010","hdd","asasasa","15124"
"23.12.2010","hdd","dsdsdsd","28764"
"23.12.2010","hdd","asasasa","14567"
 
надо в конечном итоге получить в формате csv:
"23.12.2010","hdd","asasasa","22345_2010-12-11_145037.jpg"
"23.12.2010","hdd","dsdsdsd","00001_2010-12-01_221650.jpg"
"23.12.2010","hdd","asasasa","63211_2010-12-20_164238.jpg"
"23.12.2010","hdd","dsdsdsd","13455_2010-12-01_221718.jpg"
"23.12.2010","hdd","asasasa","15124_2010-12-06_221737.jpg"
"23.12.2010","hdd","dsdsdsd","28764_2010-12-12_145043.jpg"
"23.12.2010","hdd","asasasa","14567_2010-12-03_221723.jpg"
 
Даные для подстановки берутся из файла disk-files.txt. С предыдущими скриптами не получилось решить задачу.
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 12:29 26-12-2010 | Исправлено: digital422, 12:31 26-12-2010
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422 Сделать это на bash скрипте - самоцель?
Просто на Перле такая задача решается много проще.


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

Всего записей: 17280 | Зарегистр. 13-06-2007 | Отправлено: 12:59 26-12-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я бы с большим удовольствием это все сделал через SQL, но не силен ни в perl, ни в SQL.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 13:40 26-12-2010
urodliv



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

Цитата:
С предыдущими скриптами не получилось решить задачу.

Только что проверил скрипт ASE_DAG: таки пашет!


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

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 14:02 26-12-2010 | Исправлено: urodliv, 14:02 26-12-2010
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
УМВР. Либо вы неправильно ставите задачу, либо не так тестируете.
Вы точно уверены, что порядок строк совпадает, как в примерах?
 
urodliv
Неужели вы думаете, что я стал бы выкладывать скрипты, не отрабатывающие на контрольном примере.
 
vlary
awk — баш в примерно той же степени, что и perl. ;)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:55 26-12-2010
urodliv



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

Цитата:
Неужели вы думаете, что я стал бы выкладывать скрипты, не отрабатывающие на контрольном примере.

А я уже давным-давно не думаю - это вредно. А вот сомневаться во всём продолжаю. Ибо "я сомневаюсь, значит я существую".

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

Всего записей: 6691 | Зарегистр. 29-04-2009 | Отправлено: 19:02 26-12-2010
ASE_DAG



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


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:06 26-12-2010 | Исправлено: ASE_DAG, 20:07 26-12-2010
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача - периодически проверять, открыт ли порт приложением (не упало ли оно).
 
#!/bin/sh
NETSTAT=`netstat -nat |grep 8081| awk '{ print $4 }'`
if [ "$NETSTAT" = "" ]
then
    действие на перезапуск
fi
 
где у меня ошибка ?

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
нигде.
p.s. а зачем awk?

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 11:26 09-02-2011 | Исправлено: FuzzyLogic, 11:28 09-02-2011
digital422

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
А вы уверены, что в том интерпретаторе, на который у вас ссылается /bin/sh есть команда [? Она, афайк, не позиксная.
Сочетание грепа с авком действительно выглядит несколько странно.
 
if test -z `netstat -nat | awk '/8081/{print $4}'`; then echo "restart"; fi
Не?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:56 09-02-2011 | Исправлено: ASE_DAG, 16:57 09-02-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
можно ли в переменную запихать несколько строк? Все мои попытки сводятся к тому, что bash просто уничтожает символы переноса строки.
 
Так вопрос перерос в чисто теоретический, т.к. свои проблемы я решил так:
Код:
1>>file cat - << EOT
строка1
строка2
 
строка4
EOT


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:07 10-02-2011 | Исправлено: Alukardd, 17:10 10-02-2011
digital422

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Присваиваются переменным любые значения без проблем:
$ test_newline=$(echo -ne "One.\nTwo.\nThree.\n")
$ set | grep test_newline
test_newline=$'One.\nTwo.\nThree.'

 
А вот при запросе значения через $test_newline все разделители выводятся одинаково.

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Небольшая проблемка, awk '/8081/{print $4}', в случае, когда несколько клиентов работают с демоном, скрипт выдает -  "ожидается использование бинарного оператора", почему?

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



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

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

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



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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:53 10-02-2011 | Исправлено: Alukardd, 22:54 10-02-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
netstat -na |grep 8081
tcp        0      0 192.168.1.1:8081       0.0.0.0:*               LISTEN
tcp        0      0 192.168.1.1:8081       192.168.21.250:42363     ESTABLISHED
 
./check-list.sh
./check-list.sh line 23: test: 192.168.1.1:8081: ожидается использование бинарного оператора
 
#!/bin/sh
NETSTAT_1=`netstat -nat | awk '/8081/{print $4}'`
 
if test -z $NETSTAT_1
then
echo "8081 restart"
/script/restart.sh
fi

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
А собстно где эта ваша 23 строка? если это if test -z $NETSTAT_1, то у меня работает... Ну попробуйте изменить её так: if test -z "$NETSTAT_1"


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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, кавычек не хватало.
Нашел еще вот такой вариант:
netstat -npl | grep -E "8081" | wc -l, выдает 1 или 0, как в этом случае будет выражение?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
 как в этом случае будет выражение?
какое еще выражение? вы про if?
 
Вот почитайте, полезно:
Часть 1
Часть 2
Часть 3
 
p.s. гык, автор темы 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:34 11-02-2011 | Исправлено: Alukardd, 15:35 11-02-2011
ASE_DAG



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> ололо
ЩИТО?
 
> что-то вы взялись за шапки во всех темах!  
И довольно давно. Это до форума «Юникс» я только добрался.  
А вы против?

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



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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> дополнил "ошибки программирования" конкретными ссылками на тот же ресурс  
А почему только три части? Их же пять. Дописал.
 
> добавил ссылку на вкусности и косметику для bash.
Ага. Спасибо.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
А почему только три части? Их же пять. Дописал.  
оО печаль(( Не заметил в свое время,а щас из избранного стащил...
 
p.s. Теперь уже и шапки с forum.ru-board.com можно в избранное добавлять.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите разобраться, уже всю голову сломал.
 
Делаю:
 
$ a=`curl -sI "ftp://ftp.debian.org/debian/ls-lR.gz" | awk '/Content-Length/{print $2}'`
$ echo $a
6160333
$ expr $a + 1
expr: нецелочисленный аргумент
$ echo $((a+1))
")syntax error: invalid arithmetic operator (error token is "

 
В чем загвоздка?
 
Добавлено:
Все! Разобрался.  
Кстати, наглядная демонстрация превосходства единой темы над множеством мелких: пролистал чуть выше, увидел свой же пост про особенности вывода служебных символов при помощи echo, сделал:
$ set | grep CONTENT_LENGTH
CONTENT_LENGTH=$'6160333\r'

 
Оказывается HTTP-заголовки отдаются с виндовым переводом строки (CR LF), кто бы мог подумать.
 
Соответственно решение:
$ CONTENT_LENGTH=`curl -sI "ftp://ftp.debian.org/debian/ls-lR.gz" | awk '/Content-Length/{gsub("[[:cntrl:]]", ""); print $2}'`

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
[[:cntrl:]]
оО это вы откуда такие маски берёте??? Я тож почитать хочу. Если ссылка красивая, то в шапку её

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:39 13-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Я тож почитать хочу.
$ man tr
 
;)

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
^_^
спс))) хех рассчитывал на списочек побольше)))
 
p.s. кстати, что ищете в файле ls-lR, даты модификации??? Но к чему? Постоянно поддерживаете локальные копии некоторых файлов в актуальном состоянии?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:54 13-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> кстати, что ищете в файле ls-lR, даты модификации???
Нет. Какие еще даты модификации?
Файл взят просто для примера.
 
-I — это запрос заголовка без содержания.
 
$ curl -sI "ftp://ftp.debian.org/debian/ls-lR.gz"
Last-Modified: Sat, 12 Mar 2011 20:36:40 GMT
Content-Length: 6171245
Accept-ranges: bytes

 
А ноги этой штуки растут вот отсюда. Я сначала быстренько набросал скриптик «вслепую», потом пришел, стал проверять... ну и засел на полчаса с этим «нецелочисленным аргументом».
 
Кстати, совершенно не уверен, что это может предотвратить фрагментирование.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
ой блин сорь))) пока думал о регулярках, про ключ I забыл)))
Цитата:
set | grep CONTENT_LENGTH  
кстати тоже полезная вещь, хотя некоторые escape последовательности нам выведет и echo, если без ключа -e использовать.

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:15 13-03-2011
alverspb



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение отсюда: Ссылка
Alukardd
Не сработало оно почему то)
Всё равно выдаёт строки а не сами выражения.
Мне нужен обход всех папок без вывода сообщений лишних (grep -s), поэтому пробовал так:

Код:
egrep -hse "[a-z]{10}" ~/logs/* | sed -n '/[a-z]\{10\}/p' > /home/log.log  

Способ не дал ожидаемых результатов.
Я не так что-то понял? =)

Всего записей: 47 | Зарегистр. 03-07-2008 | Отправлено: 21:17 22-03-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alverspb
сорь забыл про отрезать лишнее)
sed -ne 's/\(.*\([a-z]\{10\}\).*\)/\2/gp' file > /home/tofile
 
p.s. блин вам удается заставить меня наконец-то сесть за sed))) всегда об этом мечтал))) а вообще то что нашел я и состряпал я, вы тоже могли бы сделать... у меня на это ушло минут 15-20...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:21 22-03-2011 | Исправлено: Alukardd, 23:23 22-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, alverspb
> sed -ne 's/\(.*\([a-z]\{10\}\).*\)/\2/gp' file > /home/tofile
Это конечно, замечательно (хотя и выведет только первое совпадение в строке), однако специально для решения поставленной задачи у Грепа есть ключ -o (--only-matching).
 
$ egrep -ho '[A-Z]{10}' ~/logs/*
 
alverspb
Обратите внимание, что регэксп забран в строгие кавычки.

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



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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, Alukardd
Спасибо мужики =)
Странно, но ключ -o у grep не везде описан, я ведь искал специально такой. Думал полюбэ должен быть.) Как обычно в man посмотреть не догадался)
За sed тоже спасибо, раньше с этой командой дела не имел вообще!)

Всего записей: 47 | Зарегистр. 03-07-2008 | Отправлено: 18:15 23-03-2011 | Исправлено: alverspb, 18:16 23-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как сделать инкремент в tcsh ?
 
Мне надо чтобы заработало такое:
 
 
#!/usr/bin/env tcsh
 
set start = 0
set stop = 10
 
while ( $start < $stop )
    echo "Проверка"
    $start++   # не работает
    set start = $start + 1 # не работает
end

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 13:21 27-03-2011 | Исправлено: SergeyKulikov, 13:24 27-03-2011
01MDM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
А let там нет? Попробуй:

Код:
 
let "start+=1"
let "start++"
(( start+=1 ))
(( start++ ))
 



----------
Вопросы в личке останутся без ответа

Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 13:44 27-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
01MDM, спасибо большое за Ваш ответ
Сейчас попробую Ваши способы. Но пока получится башевский способ:
set start = `expr $start + 1`
 
Добавлено:

Цитата:
 
let "start+=1"  
let "start++"  
(( start+=1 ))  
(( start++ ))
 

Такое не работает. Это всё из оболочки Korn

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 14:04 27-03-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
не знаю на счет tcsh, но в любом случае после let писать операции надо слитно (без пробелов!!!)!
x=1
let x=$x+1
let x++
и т.д.
в 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:15 27-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd, спасибо большое
В баше действительно работает.
 
Я сейчас выбираю оболочку Самая популярная bash
Хотя многие хвалят Zsh, но она в последний раз обновлялась аж в 2009 году, а tcsh в 2007 году
Bash же обновлялся 13 февраля 2011 года
Выходит bash самая популярная и до сих пор разработки над ней идут.
 
Какую Вы можете посоветовать оболочку? Или всё-таки баш?

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 21:36 27-03-2011 | Исправлено: SergeyKulikov, 21:37 27-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> как сделать инкремент в tcsh?
 
> set i=0
> @ i++
> echo $i
1

 
Не?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
всё возможно, лично я ни когда с этим шелом не работал...
 
SergeyKulikov
для простоты лучше использовать bash или есть такое чудо как fish shell.
а классика и всё-такое это - sh.
 
p.s. хотя я когда пишу скрипты и автоматом ставлю #!/bin/bash, честно хз что там 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.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
Отсутствие регулярных минорных релизов у популярного продукта обычно говорит о его стабильности. Хотя за Cи-шелл я точно сказать не могу.
 
А вы собственно для чего выбираете оболочку? По-видимому, вы выбираете, что учить. Если так, то однозначно сначала Баш, а потом уже все остальное. Если надо, я разверну мысль.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:31 27-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG, работает и Ваш способ. Спасибо большое
Alukardd, большое спасибо за совет
 
Только вот не знаю, что такое @ перед i++
 

Цитата:
По-видимому, вы выбираете, что учить.

Совершенно верно. Только начал изучать FreeBSD и хожу на курсы по фре в КПИ
 
Добавлено:
А какой язык программирования лучше учить? Учитель на курсах говорит, что Perl очень медленный, а друзья советуют Python.
 
Выучить отдельно какой-то язык программирования думаю надо, так как написание сценариев под оболочки - тут много чего не сделаешь.

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 13:03 28-03-2011 | Исправлено: SergeyKulikov, 13:05 28-03-2011
Alukardd



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

Цитата:
друзья советуют Python
я тоже очень хочу его выучить. C, Java, PHP как-то не греют меня. А вообще каждый язык хорош в своём. Perl конечно не быстрый, но ряд задач на нём очень хорошо решается...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:54 28-03-2011
SergeyKulikov



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

Код:
 
#!/usr/bin/env tcsh
 
while ( `getopts a:b:cde opt` )
    switch ( $opt )
        case a:
            echo "a равно $OPTARG"
        breaksw
 
        case b:
            echo "b равно $OPTARG"
        breaksw
 
        case c:
            echo "c ключ"
        breaksw
 
        case d:
            echo "d ключ"
        breaksw
 
        case e:
            echo "e ключ"
        breaksw
 
        default:
            echo "Используйте программу: $0 с ключами -c -d -e -a \"значение\" -b \"значение\""
        breaksw
    endsw
end
 

 
 
Помогите понять, как работать с getopts в tcsh
Мой пример не работает.
 
 
 
 
 
 
Добавлено:
Создал программку RR (ReRun), которая будет запускать нужную мне программу нужное количество раз.
Вот код программы:
 

Код:
 
#!/usr/bin/env tcsh
 
set start = 1
set comnd = $1
set stop  = $2
set sleep = $3
 
if ( $stop == "" ) then
    set stop = $start
    set stop2 = "yes"
else
    set stop2 = "no"
endif
 
if ( $sleep == "" ) then
    set sleep = 1
endif
 
while ( $start <= $stop )
    printf "\f\a"
    $comnd
    echo $start
    sleep $sleep
    @ start++
 
    if ( $stop2 == "yes" ) then
        set stop = $start
    endif
end
 

 
Но очень хотелось бы подкрутить сюда и getopts, чтобы задавать параметры так:
# rr -c 10 -p 2 "ls -lhFG /usr"
 
и тогда программа RR запустит 10 раз команду "ls -lhFG /usr" с паузами 2 секунды между повторами.
Пока программа работает без ключиков вот в таком стиле:
# "ls -lhFG /usr" 10 2
 
Заранее всем спасибо за ответ

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 17:01 28-03-2011 | Исправлено: SergeyKulikov, 17:56 28-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> что такое @ перед i++
Это особая сишелловская магия. :) Как еще на такой вопрос отвечать? Могу ман процитировать:
    @
       @ name = expr
       @ name[index] = expr
       @ name++|--
       @ name[index]++|--

Подробнее...
 
> как работать с getopts в tcsh
getopts — это встроенная команда Баша. Почему вы решили, что она есть в Тенекс-шелле?
 
Однако есть внешняя утилита getopt (см. man 1 getopt и пример использования), и есть возможность распарсить строку средствами самого шелла (скрипт не мой).
 
P.S. Простите за любопытство, вы вручную разукрашиваете посты?
 
Alukardd
> вместо Си батник написал в универе для лабы по курсу ОС
Месье знает толк?
 
Добавлено:
SergeyKulikov
> RR (ReRun), которая будет запускать нужную мне программу нужное количество раз
А что, во Фре watch не работает?
 
Добавлено:
А кстати, да.

Цитата:
Оказалось что watch в Linux и watch в FreeBSD это совершенно разные команды.
<...>
Ну а если хотите такую же функциональность watch в FreeBSD как и в Linux, то portinstall cmdwatch

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:55 29-03-2011 | Исправлено: ASE_DAG, 04:43 29-03-2011
Alukardd



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

Цитата:
А что, во Фре watch не работает?
 
А кстати, да.  
оО, да бывают подставы...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:51 29-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> цикл FOR в батниках оставляет желать лучшего
Он там, если мне память не изменяет, только недавно появился. В «классических» батниках надо было использовать GOTO. И использовали ведь.
 
snikersmu (20:52 29-03-2011)
Цитата:
Доброго времени суток  
Нужна помощь. К примеру есть  
 
lease 192.168.1.70 {  
starts 2 2011/03/29 15:02:04;  
ends 4 2011/04/28 15:02:04;  
cltt 2 2011/03/29 15:02:04;  
binding state active;  
next binding state free;  
hardware ethernet 00:0c:29:70:78:9e;  
uid "\001\000\014)px\236";  
}  
 
Как сделать вывод IP адреса по мак адресу? (с помощью bash)  
К пример я задаю ему условие, что мак = 00:0c:29:70:78:9e , он мне должен выдать IP который соответствует этому маку.  
Заранее спасибо

 
Чисто на Баше, имхо, никак. А на авке (не без элемента быдлокодерства, зато коротко):
 
$ awk -v 'RS=}' '/00:0c:29:70:78:9e/{print $2}' lease.list
 
Добавлено:
Ага. Предвижу вопрос «как передать мак-адрес авку».
Если указанная строчка вписана в шелл-скрипт, то можно:
awk -v 'RS=}' '/'"$MAC"'/{print $2}'

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:02 30-03-2011 | Исправлено: ASE_DAG, 03:09 30-03-2011
snikersmu

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не работает. Выводит 2-ое слово из файла, ничего больше не делает

Всего записей: 5 | Зарегистр. 23-12-2008 | Отправлено: 03:08 30-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
snikersmu
Не надо описывать вывод словами. Надо его просто привести.
 
Должно быть:
 
$ cat lease.list
lease 192.168.1.70 {  
starts 2 2011/03/29 15:02:04;  
ends 4 2011/04/28 15:02:04;  
cltt 2 2011/03/29 15:02:04;  
binding state active;  
next binding state free;  
hardware ethernet 00:0c:29:70:78:9e;  
uid "\001\000\014)px\236";  
}

 
$ awk -v 'RS=}' '/00:0c:29:70:78:9e/{print $2}' lease.list
192.168.1.70

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как передать и т.д. это я в курсе,  ваш вариант не работает.  
Пока что я делаю это через одно место, из другого файла в котором знаю мак адрес машины делаю  
| grep "MAC" | head -1 | awk '{print $3}' | sed -e 's/,//g;s/"//g'
Потом IP=`cat /var/log/syslog | grep "to $MAC" | awk '{print $8}' | head -1`
В syslog dhcp пишет как раз строку "to нужный_мне_мак", 8-ое слово - нужный мне IP  
 
Добавлено:
root@debian:/var/lib/dhcp# awk -v 'RS=}' '/00:0c:29:70:78:9e/{print $2}' dhcpd.leases
The
Вот вывод вашей команды в случае если в файле dhcpd.leases ещё куча значений и второе слово The )

Всего записей: 5 | Зарегистр. 23-12-2008 | Отправлено: 03:12 30-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
snikersmu
> | grep "MAC" | head -1 | awk '{print $3}' | sed -e 's/,//g;s/"//g'  
Потом IP=`cat /var/log/syslog | grep "to $MAC" | awk '{print $8}' | head -1`  
Какой ужас. ;)
 
Так как он там работает вместо того, как должен?
Система, кстати, какая: ГНУ или нет?

 
Ага, вижу.
 
Добавлено:
Вы файл-то ваш (dhcpd.leases) приведите, а то вы дали за образец одно, а проверяете на другом.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:17 30-03-2011 | Исправлено: ASE_DAG, 03:26 30-03-2011
snikersmu

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.1.1-P1
 
server-duid "\000\001\000\001\025$\252\031\000\014)\230\016l";
 
lease 192.168.1.70 {
  starts 2 2011/03/29 15:02:04;
  ends 4 2011/04/28 15:02:04;
  cltt 2 2011/03/29 15:02:04;
  binding state active;
  next binding state free;
  hardware ethernet 00:0c:29:70:78:9e;
  uid "\001\000\014)px\236";
}
lease 192.168.1.74 {
  starts 2 2011/03/29 15:02:04;
  ends 4 2011/04/28 15:02:04;
  cltt 2 2011/03/29 15:02:04;
  binding state active;
  next binding state free;
  hardware ethernet 00:0c:29:70:55:44;
  uid "\001\000\014)px\236";
}
и так далее и тому подобное

Всего записей: 5 | Зарегистр. 23-12-2008 | Отправлено: 03:27 30-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
snikersmu
Ну можно, конечно написать так:
 
$ awk 'BEGIN{do getline; while (match($0,"^#|^server-duid")); getline;  RS="}"}; /00:0c:29:70:78:9e/{print $2}' dhcpd.leases
 
, но это уже крайне неопрятно.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 04:02 30-03-2011
snikersmu

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, попробую потом.  
Ну это же лучше чем через другой! сервер через ssh лезть за файлом с маком, потом по логам! dhcp читать какой IP присвоен на этот мак)))

Всего записей: 5 | Зарегистр. 23-12-2008 | Отправлено: 04:24 30-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
snikersmu
Ну, по-хорошему, наверное, имеет смысл сформировать таблицу соответствий IP — Mac:
 
$ awk '/^lease/{printf $2" "}; /[:space:]*hardware ethernet/{print $3}' dhcpd.leases
192.168.1.70 00:0c:29:70:78:9e;
192.168.1.74 00:0c:29:70:55:44;

 
; а потом по ней уже искать. ;)

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 04:42 30-03-2011 | Исправлено: ASE_DAG, 04:48 30-03-2011
SergeyKulikov



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

Цитата:
P.S. Простите за любопытство, вы вручную разукрашиваете посты?

Да, хотел, чтобы было читабельнее и красивее
 
Про watch не слышал, но потом попробую cmdwatch. Хотелось бы примерно понять, что она делает?
 
Alukardd, учитель на курсах по FreeBSD в КПИ посоветовал мне изучать Python и попробовать перейти на оболочку IPython
Говорит это типа bash + python, типа всё в одном. Не знаю вот тратить время на изучение или нет

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 23:01 04-04-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надо проверить ftp сервер на наличие обновлений с определенной даты.
Ни как не могу учесть дату...
Пытался так:
touch -d ' . . . ' tf - создаю файл с нужной временной меткой
curl -sz tf ftp:/... - получаю список файлов обновленных с периода метки tf
Только хрен он учитывает временную метку. Вываливает мне листинг всей директории, а она мне ну ни как не впёрлась.
Писать парсер с условиями мне не охота, когда есть специальная опция для этого!

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:31 08-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> curl
А никакие другие клиенты принципиально нельзя использовать?
lftp там, не? А у него хорошая команда — mirror — есть.

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

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

Код:
> zmprov csig user@org.ru main zimbraPrefMailSignatureHTML 'user@org.ru, www.org.ru<img style="border: 0pt none;" src="http://org.ru/bannerletter.gif">'
 

Работает.
Пытаюсь то же проделать в скрипте:

Код:
#!/bin/sh
# Формирую текст почтовой сигнатуры. $1 - email
SIGNATURE=$1', www.org.ru<img style="border: 0pt none;" src="http://org.ru/bannerletter.gif">'
# Готовлю команду. Сигнатуру заключаю в одинарные кавычки
SIGN_COMMAND='zmprov csig '$1' main zimbraPrefMailSignatureHTML '"'"$SIGNATURE"'"
# Проверяю, что должно выполниться
echo $SIGN_COMMAND
# Выполняю, должен получить ID новой записи в БД
echo "`$SIGN_COMMAND`"
 

Результат работы скрипта:

Код:
> . /opt/script/modify_signature.sh user@org.ru
 
zmprov csig user@org.ru main zimbraPrefMailSignatureHTML 'user@org.ru, www.org.ru<img style="border: 0pt none;" src="http://org.ru/bannerletter.gif">'
usage:  createSignature(csig) {name@domain} {signature-name} [attr1 value1 [attr2 value2...]]
.....
 

и дальше куча ошибок.
Что делаю не так? Есть идеи?

Всего записей: 6 | Зарегистр. 26-04-2006 | Отправлено: 23:41 08-04-2011 | Исправлено: Glaf, 23:42 08-04-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
спс, не знал о нём)))
если кому пригодится то вот как всё просто выглядит:
lftp -e 'mirror --newer-than="Mar 01 2011" && exit' ftp://login:pwd@server.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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:08 09-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Glaf
Так тоже выдает ошибки:
#!/bin/sh
zmprov csig "$1" main zimbraPrefMailSignatureHTML "$1"', www.org.ru<img style="border: 0pt none;" src="http://org.ru/bannerletter.gif">'

?

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



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

Цитата:
 '"'"$SIGNATURE"'"  

вы кажется тут перемудрили с кавычками...
попробуйте так: ...HTML \''"$SIGNATURE"'\''

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:15 09-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> спс, не знал о нём
Всегда пожалуйста.
 
> вы кажется тут перемудрили с кавычками
Я вообще не понимаю, зачем так мудрить с записью команды в переменную, а не сделать так, как я написал выше.
 
> echo "`$SIGN_COMMAND`"  
Вот это, кстати, замечательный костыль для замены команды command (вполне позиксной, афайк).

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

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

Цитата:
#!/bin/sh
zmprov csig "$1" main zimbraPrefMailSignatureHTML "$1"', www.org.ru<img style="border: 0pt none;" src="http://org.ru/bannerletter.gif">'

Ошибок не выдаёт. Значит, точно перемудрил с кавычками.  
Ага, вижу, переменные надо в двойные кавычки заключать.
 

Цитата:
...HTML \''"$SIGNATURE"'\''
ругается на неожиданный EOF. Попробую с кавычками в SIGNATURE разобраться, направление поиска понял  
 

Цитата:
echo "`$SIGN_COMMAND`"
изначально выглядело как
Код:
SIGN_ID="`$SIGN_COMMAND`"
. Мне эта переменная потом в скрипте нужна будет. Синтаксис стянул из какого-то скрипта. А как это будет выглядеть с командой command?
 
 
 

Всего записей: 6 | Зарегистр. 26-04-2006 | Отправлено: 11:16 09-04-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Glaf
если ругается на eof то попробуйте вместо \' написать просто "

Цитата:
А как это будет выглядеть с командой command?  
command "$SIGN_COMMAND"
 
Добавлено:

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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 11:31 09-04-2011
Glaf

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

Цитата:
попробуйте вместо \' написать просто "
 
то есть, в таком виде:

Код:
...HTML "'"$SIGNATURE"'"'  
? Номер не проходит, т.к. внутри SIGNATURE есть двойные кавычки. Или я чего не понял?
 

Цитата:
command "$SIGN_COMMAND"
А как вернуть результат в переменную SIGN_ID?
 
 
 
Добавлено:
Alukardd, ASE_DAG, благодарю!
Всё получилось.
В результате конец скрипта выглядит так:
Код:
SIGN_ID=`zmprov csig "$1" "$1" zimbraPrefMailSignatureHTML "$SIGNATURE"`
zmprov ma "$1" zimbraPrefDefaultSignatureId "$SIGN_ID"
zmprov ma "$1" zimbraPrefForwardReplySignatureId "$SIGN_ID"
 


Всего записей: 6 | Зарегистр. 26-04-2006 | Отправлено: 11:41 09-04-2011
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди добрые, посодействуйте плиз! Имеется система Kubuntu 10.10, локаль utf-8, Опера 11.01 1190. В Опере меню подрихтовано и добавлен пункт:

Код:
Item, "Вывести имя файла"="execute program,"xterm -hold -e echo","%l""

Проблема в следующем, при выборе этого пункта на ссылках с русскими символами в именах файлов, выводится всякая дрянь. Например ссылка (это копипаст из Оперы):
http://server/Живой%20Ленин.avi
принимает вид:
http://server/82>9%20=8=.avi
 
Помогите забороть этот баг.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 11:01 10-04-2011 | Исправлено: Maximus777, 11:03 10-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
Ну это, очевидно, проблема на стороне Оперы.

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ииииййяяхххуууу..... в последней версии (11.10 2087) исправили эту проблему. Хосподи! Кайф то какой!

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 17:58 12-04-2011
Maximus777

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

Код:
#!/bin/bash                                                                                                                                  
xterm -hold -e cat /home/maximus/Downloads/HDD | grep -i $1


Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:42 15-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
> найти её в файле
Вы хотите проверить наличие этой субстроки в файле?
grep -io $1 ~/Downloads/HDD
 
> #!/bin/bash
> xterm -hold -e

А зачем вам такая интересная конструкция, если не секрет?

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 03:16 16-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Очень может быть.
 
Maximus777
Так, само собой, делать не надо.
А весь файл у вас выводится потому, что сначала выполняется это ваше xterm -hold -e cat /home/maximus/Downloads/HDD, и только затем вывод этой команды передается грепу.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Так, само собой, делать не надо.  
эт точно)
можно просто read в конце написать и он будет ждать Enter...

Цитата:
только затем вывод этой команды передается грепу
Кавычки спасут pipeline...


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 03:38 16-04-2011
ASE_DAG



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 05:23 16-04-2011
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
А зачем вам такая интересная конструкция, если не секрет?

Конечно не секрет. Я брожу Оперой по сайтам с фильмами. У меня есть файл-каталог имеющихся на хардах фильмов. Т.к. их уже чёрти сколько, то в голове не все укладываются. Поэтому при сомнениях "А нет ли у меня уже этого фильма?" я лезу в файл и ищу заветную фразу. Вот решил облегчить себе задачу. Отрихтовал меню Оперы, действительно наслаждаюсь выводом шелла Таким же макаром я запрашиваю размер файла на файлообменнике, вылазит окошко с выводом wget --spider http://.... и вуаля. А почему так делать не надо? Вроде вполне прилично получается. Поэтому и хотел сделать поиск фразы в файле-каталоге, но с наскоку не получилось. Кавычки кстати всяка ставил, балалаечка. Сейчас попробую "голым" грепом.
 
Не, не получается. Вот мой скрипт (searchinhdd):

Код:
#!/bin/bash                                                                                                                                  
xterm -hold -e grep -io $1 ~/Downloads/HDD

Выводит просто искомую фразу и всё. Кстати read не помогает задержать окно, оно закрывается, так что -hold.
 
Тьфу! Тудыть иё в качель! Вот вы развели меня чуток. Опция -o лишняя, просто -i работает как с добрым утром. Спасибо за помощь.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 10:41 16-04-2011 | Исправлено: Maximus777, 12:14 16-04-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
read  это не опция, а команда...

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

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Цитата:
read  это не опция, а команда...

Я это понял изначально, вбил в конец скрипта, но такая команда ничего не меняет. А чем -hold плох?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
ну как-то это не цивильно... генерится иксовое окно не понятно зачем...
я проверял - read оставляет терминал открытым - ИБО он ждёт нажатия клавиши Enter

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

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

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

Цитата:
ну как-то это не цивильно... генерится иксовое окно не понятно зачем...

Ну я ж рассказал зачем оно у меня генерится. Считаете плохое решение?
 

Цитата:
я проверял - read оставляет терминал открытым - ИБО он ждёт нажатия клавиши Enter

А у меня окно мелькает и привет. Вот файл:

Код:
#!/bin/bash                                                                                                                                  
xterm -e grep -i "$1" ~/Downloads/HDD                                                                                                        
read

Наверное я чушь делаю, но как правильно не знаю. xterm и скрипт это же разные проги, поэтому и не получается. Но без xterm'а окна вообще нет. Наставьте на путь истинный, а!

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
уберите вообще xterm из скрипта - оставьте только grep  и read

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:10 16-04-2011
Maximus777

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

Цитата:
уберите вообще xterm из скрипта - оставьте только grep  и read

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

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 16:47 16-04-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
наверное понял что происходит))) да тогда либо как вы делали через xterm, либо в Opera как-то обрабатывать результаты...
Ну и я еще хз, что там ASE_DAG, предлагал по desctop-файлам - ни когда с ними не работал...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:13 16-04-2011
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для меня тоже десктоп-файлы непонятная вещь. Можно ещё через kdialog выдавать результаты, но я уже привык к xterm'у, с ним вполне комфортно получается. А вместо консоли у меня Yakuake, очень удобная штука. Если бы туда как-то можно было команды из Оперы отправлять, то тоже вполне рабочий вариант был бы, но я не знаю возможно ли такое колдунство или нет.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 17:56 16-04-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
у вас кеды что ли?
так можно еще тогда через dbus там виджет есть, который все уведомление выводит в едином стиле из области уведомлений" как всплывающие аплетики. (за подробностями не ко мне)

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:49 16-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
> десктоп-файлы непонятная вещь
Если бы речь шла о вызове из, например, файлового мэныджера, то это бы действительно имело смысл.
А ничего непонятного там нет, достаточно было бы заполнить ключи Exec и Terminal.
 
Но при вызове из Оперы, мне неясно, зачем вам понадобился шелл-скрипт?
«xterm -hold -e grep -i $1 ~/Downloads/HDD» прописываете прямо в конфиг Оперы — должно работать, если только разработчики Оперы какую-нибудь очередную подлянку нам не подготовили.
 
> возможно ли такое колдунство
Вполне. Как уже сказал т. Алюкард — через Ди-бас.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:05 16-04-2011 | Исправлено: ASE_DAG, 22:09 16-04-2011
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:45 16-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Алукард
ОК. :)
 
> в оригинальном переводе
А кстати, переводе чего? Просто любопытно.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:15 16-04-2011
freewood



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


Всего записей: 307 | Зарегистр. 28-12-2008 | Отправлено: 23:28 16-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
freewood
Точно? Если Википедия не врет, это имя довольно популярно среди персонажей соответствующего типажа. :)

 


Кстати, начали (уже довольно давно) публиковать перевод на русский четвертой части «Linux Fundamentals» Даниэля Роббинса.
Мало ли, кто не в курсе.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:38 16-04-2011 | Исправлено: ASE_DAG, 23:39 16-04-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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:44 16-04-2011
Maximus777

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Но при вызове из Оперы, мне неясно, зачем вам понадобился шелл-скрипт?  
 «xterm -hold -e grep -i $1 ~/Downloads/HDD» прописываете прямо в конфиг Оперы — должно работать, если только разработчики Оперы какую-нибудь очередную подлянку нам не подготовили.

Можно, раньше так и было. Но в какой-то период у Оперы был глюк, ссылка неправильно передавалась, поэтому я сделал небольшой скрипт, который срезал лишнее и подставлял как положено http://... , а иначе из Оперы передавалась ссыль http:///... Короче одна черта лишняя генерилась. Вот такой был код:

Код:
#!/bin/bash                                                                                                                                  
A=$1                                                                                                                                          
B="http://"${A:7}

А далее уже переменная $B содержала полноценную ссыль. Может и ерунда, но опыт был полюбасу полезный.
 
Вобщем теперь у мну несколько скриптов, а в Опере прописывается красиво:

Код:
Item, "Поиск в каталоге" = "Execute program, "searchinhdd", "%t""
Item, "Положить в файл загрузки"="execute program,"linkstofile", "%l""
Item, "Узнать размер файла"="execute program,"getfilesize","%l""

 
Ну не красота ли? Последний пункт правда теперь сделан так, как Вы сказали, прямо в Опере:

Код:
Item, "Узнать размер файла"="execute program,"xterm -hold -e wget --spider","%l""

 
Alukardd
Цитата:
у вас кеды что ли?  
 так можно еще тогда через dbus там виджет есть, который все уведомление выводит в едином стиле из области уведомлений" как всплывающие аплетики. (за подробностями не ко мне)

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

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 20:13 17-04-2011
ASE_DAG



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:26 17-04-2011
Maximus777

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

С удовольствием бы, она мне больше всех нравица Но я понятия не имею, как это можно сделать.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 22:59 17-04-2011
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.

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

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

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:13 17-04-2011
Alukardd



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> gnome кстати имеется tilda для такого
Тильда — не гномовская, просто гэтэкашная (кстати ее и использую, даже в Кедах). В Гноме — Guake.
 
Maximus777
> Но я понятия не имею, как это можно сделать.
Где-то видел хорошую статейку, даже на русском.
Вот! Алексеев А. D-Bus для чайников. // K Notes. — 2009.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:49 17-04-2011 | Исправлено: ASE_DAG, 23:51 17-04-2011
Maximus777

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

Цитата:
В gnome кстати имеется tilda для такого.

Ставил Тильду поглядеть как-то. Не, йаквака краше реально. Кстати вроде как-то нарыл рецепт, но есть два минуса, 1 - йаквака не всплывает сама, 2 - почему то фразы из нескольких слов не ищутся. Делаю вот так:

Код:
#!/bin/bash                                                                                                                                  
qdbus org.kde.yakuake /yakuake/sessions addSession                                                                                            
qdbus org.kde.yakuake /yakuake/sessions runCommand "grep -i "$1" ~/Downloads/HDD"

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 23:50 17-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
> qdbus org.kde.yakuake /yakuake/sessions addSession
Каждый раз открывать новую вкладку? Зачем?
 
> фразы из нескольких слов не ищутся
Вы с кавычками намудрили.
 
> йаквака не всплывает сама
А с чего ей делать то, что вы не приказываете? Покопайтесь еще в методах, должен быть таковой и на «всплытие».
 
У меня ее нет, поэтому за вас посмотреть не могу. ;)

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:56 17-04-2011
Maximus777

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

Цитата:
Каждый раз открывать новую вкладку? Зачем?

Т.к. опытным путём выяснил, если во вкладке открыт mc, то пока его не закроешь, вывод не увидишь.
 

Цитата:
Вы с кавычками намудрили.

Вот строка из скрипта:
Код:
runCommand "grep -i $1 ~/Downloads/HDD"

Вот что прилетает в консоль:
Код:
grep -i стране чудес ~/Downloads/HDD

Поиск происходит по первому слову фразы. Хз как там кавычки расставлять.
 
Всплывание нашёл.
Код:
qdbus org.kde.yakuake /yakuake/MainWindow_1 com.trolltech.Qt.QWidget.toggleWindowState

 
Добавлено:
Афигеть! Я его сделал!!! Вот так пашет превосходно:
Код:
qdbus org.kde.yakuake /yakuake/sessions runCommand "grep -i \"$1\" ~/Downloads/HDD"

Кайф то какой ...
 
Добавлено:
ASE_DAG
Цитата:
Вот! Алексеев А. D-Bus для чайников. // K Notes. — 2009.

Спасибо за ссыль. Сам бы я точно до такого не достиг.

Всего записей: 674 | Зарегистр. 27-07-2007 | Отправлено: 00:11 18-04-2011 | Исправлено: Maximus777, 00:14 18-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maximus777
> Я его сделал!
> Спасибо за ссыль
Всегда пожалуйста. :)

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хех, вот и узнал об удобной плюшке в Opera...
В FX походу придется дополнение писать что бы реализовать что-то подобное... или mozilla всё-таки что-то имеет подобное в запасе?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:53 18-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> придется дополнение писать
Наверняка оно уже написано.
Расширения для Firefox (Mozilla Firefox Extensions)

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Возможно и есть для самописных, надо глянуть, поиск по инету результатов не дал. Однако я имел ввиду новое для каждого случая (задачи/скрипта), а не что-то типа frаmework...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:23 18-04-2011 | Исправлено: Alukardd, 01:24 18-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> я имел ввиду новое для каждого случая (задачи/скрипта), а не что-то типа frаmework...
Не понял я. В любом случае, это туда. ФФ не мой основной браузер.

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



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
<a href=http://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D0%BC%D0%B1>Смотри здесь</a>

Всего записей: 3 | Зарегистр. 14-04-2011 | Отправлено: 01:59 18-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
030918
Ru.Board » Специальные » Тестирование » тест ;)

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



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
<a href="http://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D0%BC%D0%B1">Смотри здесь</a>

Всего записей: 3 | Зарегистр. 14-04-2011 | Отправлено: 02:05 18-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
030918
Ru.Board » Специальные » Тестирование » тест!

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dtXth (17:13 25-04-2011)
Цитата:
Учусь писать скрипты. возник вопрос как можно сделать такую штуку:  
1. Выводим процессы предположим питона ps -a | grep python  
2. у нас появляется список процессов.    
Мне хочется убить все процесы, чей PID больше 1335.  
Как это можно сделать??

 
Например так (это для ГНУ, если ось другая, указывайте это сразу):
 
$ kill -9 $(pgrep python | awk -v ORS=' ' '$0 > 1335')
 
P.S. А зачем, если не секрет, такая постановка задачи: «убить все процесы, чей PID больше 1335»?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ВНИМАНИЕ! Не стоит выполнять эту команду неосведомленным людям...
 
Интересная строчка...
: () { :|:& };:
Не все операторы по итогу понятны...
получается что, то типа такого
x=true;
$x () { $x or $x & }; $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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:41 26-04-2011 | Исправлено: Alukardd, 23:43 26-04-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
«:» — это имя функции, в нее нельзя «заключить». ;)
 
См. http://en.wikipedia.org/wiki/Fork_bomb#Examples
 
Добавлено:
Как вы уже поняли, самая мякотка такого представления форк-бомбы именно в том, что в таком виде она абсолютно не гуглится.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
омг... была мысль что это имя функции, но что все остальные двоеточия это её вызов... ЖЕСТЬ!
спс за ссыль)
 
p.s. да с гугленьем такого проблем много... Да и по отдельности оператор pipeline гуглить очень не удобно...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:04 27-04-2011
slech



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

Цитата:
set file=%DB11name%_backup_%Today%*.%dbprefix%.bak
%robocopydir%\robocopy.exe %source% %destination% %file% %parameters%
if not errorlevel 1 call :rbcopyerror
::
set file=%DB1name%_backup_%Today%*.trn
%robocopydir%\robocopy.exe %source% %destination% %file% %parameters%
if not errorlevel 1 call :rbcopyerror
 
goto :next
::
::
:rbcopyerror
%maildir%\blat.exe -server %mailserver% -f %mailfrom% -tf %mailto% -subject %mailsubject% -body %mailbody%
exit /B
::
:next
 

который выполняет копирование и следит за кодом выхода приложения.
если он не равен 1 то мы напрявляемся к репортированию ошибки почтой и возвращаемся далее по скрипту отрабатывать.
 
кто подскажет как такое реализовать в bash ?
1. выполняем команду
2. смотрим код выхода
3. в зависимости от кода выхода можем пойти далее по скрипту или репортировать об ошибке и пойти далее по скрипту
 
1. cp /home/user1/arc.zip /backup
2. if [ "$?" -ne "0" ]; then
  mail to admin# goto :mail)
  exit 1
fi
3. cp /home/user1/arc.zip /backup1
 if [ "$?" -ne "0" ]; then
  mail to admin# goto :mail)
  exit 1
не хочется в теле выполнения операции всегда вставлять отправку почты потому как это достаточно громоздкий код со своими переменными(например какая операция сорвалась)
в Windows это всё решалось метками.
 
Спасибо.
 
 
Alukardd подсказал:

Цитата:
А ответ прост -  функции.
Код:
mailto () {
...
}
 
...
mailto  

 
как это будет работать в моём случае ?
1. выполняем команду
2. смотрим код выхода
3. в зависимости от кода выхода выполняем функцию mailto () {
...
}
 и продолжаем выполение команд далее ?

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 16:14 30-04-2011 | Исправлено: slech, 16:14 30-04-2011
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.

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



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

Цитата:
cp /home/user1/arc.zip /backup1  
 if [ "$?" -ne "0" ]; then
  mailto(admin)
  exit 1
 fi

 
Вообще какой-то странный подход. Не надо смешивать собственно выполнение операций и постобработку ошибок.
 
#!/bin/sh
cp /home/user1/arc.zip /backup1 || echo 'Сообщение об ошибке' >&2; exit 1

 
А уже сам вышеприведенный сценарий запускаете следующим образом:
$ backup.sh |& mailme.sh
, где mailme.sh — сценарий для обработки вывода отладки.
 
 
Добавлено:
P.S. Это в том случае, если backup.sh не выдает ничего нужного на STDOUT.
Если выдает, да и вообще, может более удобным оказаться использование временного файла:
 
$ backup.sh 2> /tmp/backup.err || mailme.sh < /tmp/backup.err
 
; а если файл создавать нежелательно, то fifo.
 
Обратите внимание на еще одно отличие — здесь мы делаем проверку кода возврата до запуска mailme.sh и не запускаем его, если возвращен 0.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:54 30-04-2011 | Исправлено: ASE_DAG, 18:33 30-04-2011
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
awk '/target/{delete s; p=1} p==1{s[FNR]=$0} p==1&&/AdRiver/{exit 0} END{for (i in s) print s[i]}' king_stiven.txt  
 
Как вывести всё в одну строку?

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 22:13 06-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
Задать переменную ORS равной пробелу или табуляции (или что вы там хотите вместо перевода строки):
$ awk -v ORS=' ' '/target/{delete s; p=1} p==1{s[FNR]=$0} p==1&&/AdRiver/{exit 0} END{for (i in s) print s[i]}' king_stiven.txt
 
Добавлено:
И не дублируйте посты! Если поняли, что задали вопрос не в ту тему, то запостив в другой, в первой-то удалите («del»).
Ну вы ж не первый год на форуме, ну ей-богу. ;)

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Жесть, ни когда не видел хотя бы такой длинны awk выражений... Я не говорю уже о многострочных скриптах.
Просто интересно я правильно его прочитал или нет?
"ищем строки со словом 'target' -> удаляем эту строку, присваиваем p=1 -> проверяем, если в строке нашлось слово и p стало 1, то в массив s в позицию равную позиции слова в файле (полагаю, что это будет номер найденного 'target' по счёту) заносим первое слово. Дальше проверяем не является ли это слово 'AdRiver' и если да, то завершаем поиск и переходим к расчепятке..."
ТАК?
 
p.s. да в bat файлы это круто было занести... интересно там кто-то пользуется (знает) об awk?!

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:09 07-05-2011 | Исправлено: Alukardd, 01:11 07-05-2011
king_stiven

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

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 13:48 07-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> никогда не видел хотя бы такой длинны awk выражений
А это я завел себе правило писать на форумах все так, как будто оно предназначено для исполнения в интерактивном шелле, а это соответственно — в одну строку.
Это располагает к тому, чтобы в интерактивном шелле работоспособность кода и проверить, а не бездумно сувать его сразу же в свой скрипт, где может быть куча ошибок и несоответствий заданию. Хотя не всегда помогает.
 
> я правильно его прочитал
Не совсем. См. Задачи на bat-файлах 10:1220#3.
 
king_stiven
> язык понятней, типа пишешь программу
Да, Си-подобный.
 
> Начал читать доки по авку
А если не секрет, какие доки?  
Вы тут меня где-то спрашивали мануал обязательно русскоязычный (так, что я понял, что с языком у вас плохо), но вот хороших русскоязычных-то я по нему как раз и не встречал.

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

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

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

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 19:10 07-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
> если справа от первого target нет букв авс
Каких еще букв? Вы о буквах ничего не говорили, поэтому проверяется любое вхождение последовательности символов target в строку, в т.ч. напр. geotargeting.
Если надо задать строго слово target, то регэксп будет иметь вид [^[:alpha:]]target[^[:alpha:]], где [^[:alpha:]] — не буква (но, напр., пробел, новая строка, знак препинания, цифра).
 
> Если свой пример ещё и поясните, буду обязан.  
Пожалуйста. А что было неясно в прошлом комментарии:

Цитата:
находим первый target и начинаем записывать строки в массив; если находим еще один target, сбрасываем записанное и начинаем массив строк заново; по обнаружении AdRiver после target'а (это отличие от прошлой версии) или по концу потока (а вот этого, кстати, вы, возможно, и не желаете, уточните) выводим массив строк
?
 
P.S. Кстати, обращаю ваше внимание, что для шаблона [[:alpha:]] важно совпадение локали и кодировки потока (что на Винде может быть далеко не самоочевидной вещью).

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:38 07-05-2011
king_stiven

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

Цитата:
Каких еще букв? Вы о буквах ничего не говорили,


Цитата:
Условие поменялось

Если трудно не надо.

Цитата:
Если свой пример ещё и поясните, буду обязан.  

Имеется в виду новый пример, если он будет написан. Старый пример работает на ура и описан чётко.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
> Условие поменялось
Ну да, я как всегда читаю по диагонали.
 
> Если трудно не надо.  
Я же уже все написал и прокомментировал.

Цитата:
Если надо задать строго слово target, то регэксп будет иметь вид [^[:alpha:]]target[^[:alpha:]], где [^[:alpha:]] — не буква (но, напр., пробел, новая строка, знак препинания, цифра).

 
Если строго справа, то target[^[:alpha:]]; а если не должно быть только каких-то конкретных букв, то target[^abc].
 
$ awk -v ORS=' ' '/target[^abc]/{delete s; p=1} p==1{s[FNR]=$0} p==1&&/AdRiver/{exit 0} END{for (i in s) print s[i]}' king_stiven.txt

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
Ответ на ваш вопрос.
for A in 1 2 3; do echo $A; done
 
p.s. а вообще столь примитивный вопрос можно и не задавать - стоило лишь погуглить как описать цикл for в shell.
p.p.s. кстати записать перечисление можно и более изящно вместо 1 2 3, можно написать {1..3}

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:27 08-05-2011 | Исправлено: Alukardd, 20:32 08-05-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть файлик test.sql и в нём такой текст:
 
Что-то длинное <script тут тоже что-то>тут еще что-то</script> и снова длинный текст <script снова что-то> еще что-то </script> и закончилось.
 
 
 
 
 
 
Надо его почистить и удалить то, что я выделил красным.
Должно получится вот так: Что-то длинное и снова длинный текст и закончилось.
 
Пробовал так:
sed 's|<script[^>]*\?>.*\?</script>||g' test.sql
 
но удаляет не то, что мне надо, а вот так (выделил синим):
 
Что-то длинное <script тут тоже что-то>тут еще что-то</script> и снова длинный текст <script снова что-то> еще что-то </script> и закончилось.
В итоге остаётся: Что-то длинное  и закончилось.
 
Как управлять его жадностью? Помогите пожалуйста

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 14:41 13-05-2011 | Исправлено: SergeyKulikov, 14:55 13-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
Никак. Сед не умеет ревнивого режима. Используйте perl.
 
Добавлено:
Кстати, я бы здесь еще пустое место причесал:
$ perl -pe 's|[[:space:]]*<script.*?>.*?</script>[[:space:]]*| |g' <<< 'Что-то длинное <script тут тоже что-то>тут еще что-то</script> и снова длинный текст <script снова что-то> еще что-то </script> и закончилось.'
Что-то длинное и снова длинный текст и закончилось.

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



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG,
А Вы не могли бы показать хоть маленький пример, как это сделать на perl в командной оболочке?
 
Добавлено:
ASE_DAG, спасибо большое за помощь! Я сделал вот так:
 
perl -pe "s|<script[^>]*?>.*?</script>||g" test.sql > new.sql
и отлично работает
 
У меня на php это всегда работало вот так:
$result = preg_replace ( "'<script[^>]*?>.*?</script>'si", "", $fr );
 
 

Цитата:
Кстати, я бы здесь еще пустое место причесал:  
$ perl -pe 's|[[:space:]]*<script.*?>.*?</script>[[:space:]]*| |g' <<< 'Что-то длинное <script тут тоже что-то>тут еще что-то</script> и снова длинный текст <script снова что-то> еще что-то </script> и закончилось.'  
 Что-то длинное и снова длинный текст и закончилось.

Впервые вижу такое: [[:space:]] (надо будет почитать, что это такое)
Да и про <<< не знал, что так можно
Знаю только >, <, >>, |  
 
 
Что-то не понимаю, где можно прочитать про эти ключики -pe в мане на нашел
 
 
 
Все варианты хороши и правильные
[[:space:]]*<script.*?>.*?</script>[[:space:]]* тоже что и \s*<script.*?>.*?</script>\s* и \s*<script[^>]*?>.*?</script>\s*
Проверял тут: http://regexr.com?2tojd

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 15:35 13-05-2011 | Исправлено: SergeyKulikov, 16:22 13-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> в мане на нашел
man perlopentut можно почитать, но у Перла маны нетипичного характера — скорее учебник, чем справочник.
А именно ключи, если забыли, можно и у самого интерпретатора спросить:
$ perl --help
 
> спасибо большое
Всегда пожалуйста. :)

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:39 13-05-2011
SergeyKulikov



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

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 23:39 13-05-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
Цитата:
Впервые вижу такое: [[:space:]] (надо будет почитать, что это такое)  
такую штуку лично я читаю тут - man tr
Цитата:
man perlopentut
хм у мну такого нету((( только на opennet нашёл...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:14 14-05-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот случайно нашел в интернете: http://rsusu1.rnd.runnet.ru/develop/perl/perlrus/run.html (вдруг кому-то понадобится)

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 11:35 14-05-2011
ASE_DAG



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

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



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А вот эта статья мне понравилась еще больше: http://www.ibm.com/developerworks/ru/library/au-regexp/#list1

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 23:39 14-05-2011
kostya_rlw

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
 
Проверяю поднят ли интерфейс ppp плюс хочу глушить потоки вывода и ошибок, НО:
 
- если ppp0 еще не поднялся то ошибки не подавляются!!
# ifconfig ppp0 | grep "UP" > /dev/null 2>&1
ppp0: error fetching interface information: Device not found
 
- Однако без grep-а все нормально, ошибки подавляются (ppp0 так же еще не существует)  
# ifconfig ppp0 > /dev/null 2>&1
 
С grep-ом не судьба, получается ??

Всего записей: 57 | Зарегистр. 18-01-2006 | Отправлено: 10:32 26-05-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kostya_rlw
Кручу, верчу, запутать хочу!!!
ifconfig ppp0 2>&1 | grep -i 'UP' > /dev/null
Соответственно дальше можете анализировать переменную $?, если хотите конечно.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kostya_rlw
> 2>&1
А что такого может подавать ifconfig на STDERR, что это надо грепать?
 
Alukardd
> Соответственно дальше можете анализировать переменную $?
Или сразу:
 
# if ifconfig ppp0 | grep -q 'UP'; then do-smth; fi
 
Добавлено:
Кстати, а разве в выводе ifconfig'а может не быть слова «UP»? Если интерфейс не поднят, то ifconfig по нему вообще ничего не выдаст. Или я неправ?
 
# if ifconfig ppp0 &>/dev/null; then do-smth; fi

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:32 26-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите плз, sh скрипт для запуска tcpdump в цикле, который проверяет состояние интерфейса pdp_ip0, и когда тот поднимется, запускает tcpdump.
 
По идее можно использовать вывод ifconfig:
 
pdp_ip0: flags=8010<POINTOPOINT,MULTICAST> mtu 1450
 
и
 
pdp_ip0: flags=8010<UP,POINTOPOINT,MULTICAST> mtu 1450 соответственно.

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 14:11 27-05-2011 | Исправлено: gap5, 14:11 27-05-2011
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:23 27-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а с циклом как быть? у меня опыта маловато в unix shell

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 14:53 27-05-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
да просто в cron добавьте задачу на каждую минуту(это минимальный интервал для cron'a), например...
Открываете терминал --> пишите crontab -e --> (возможно потребуется указать через что хотите редактировать) --> туда пишите строку - * * * * * /path/to/your/script
В общем-то всё. Путь на свой только поменяйте Скрипту не забудьте дать бит исполняемости - chmod +x /path/to/your/script

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:13 27-05-2011 | Исправлено: Alukardd, 15:15 27-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
Не очень уловил, это ведь при старте системы будет выполнятся? Тогда крон ни к чему, лучше действительно условный цикл с некоторой паузой при каждой итерации сделать.
 
Alukardd
Кстати, не знаете хорошего способа инвертировать код возврата? Мне что-то в голову ничего кроме страшной строчки вида:
$ while if sudo ifconfig wlan0 | grep 'UP'; then false; else true; fi; do echo 'DOWN'; done
в голову не приходит.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:41 27-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Речь идет о IOS, там cron'a нет.
Задача разовая, по этому лучше скрипт по необходимости запущенный из шэлла...

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 17:04 27-05-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Я мысль не понял А зачем sudo? И кстати, если я правильно вас понял - то true и false вы местами перепутали... (Ну и вывод grep'а забыли подавить)
Что вы имеете в виду говоря "инвертировать код возврата"??? В двоичном смысле инвертировать или что? А если 2 вернётся, то его в двоичную систему инвертить и потом обратно?)
 
Добавлено:
gap5
Ну а вам просто цикл тогды, как уже заметили ранее. Можеет использовать конструкцию указанную ASE_DAG, с учетом моих замечаний про true,false ну и если не хотите грузить систему и для вас это не критично, то в тело цикла еще команду добавить - sleep 30; - будет засыпать на 30сек после каждой удачной проверки.
 
Добавлено:
Кстати хотите я вас обрадую - tcpdump, запущенный на работающем интерфейсе не остановится при его отключении, если он конечно совсем не удаляется, а просто переводится в DOWN. Просто в это время пакетов не будет и всё, когда интерфейс поднимется всё встанет на свои места. Сколько он будет ждать упавший интерфейс я хз - но секунд 20 я подождал... Можете проверить - а то вдруг вы тут зря изгаляетесь, да еще и получите через неделю с десяток другой работающий 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:31 27-05-2011 | Исправлено: Alukardd, 18:40 27-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
А на какой странице была эта конструкция, что-то не могу найти?
 
Может быть он и 10 минут ждет, но этого не достаточно... по моим наблюдениям, если последняя активность на интерфейсе была в 0:30, то tcpdump отключается где-то в 2:05, а когда именно интерфейс был потушен я сказать не могу...
 
Мне надо разово отловить активность, которая происходит ночью, в промежутке от 2 до 7 часов, в течении ~30-50 секунд.
 
По идее логика работы скрипта такая:
 
0 Ждать 10 секунд
1 Если интерфейс НЕактивен, идти в 0
2 Если запущен tcpdump, идти в 0
3 Запустить tcpdump, идти в 0

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 19:01 27-05-2011 | Исправлено: gap5, 19:10 27-05-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
двумя постами выше))) Ну тогда не забывайте убивать старые потоки, что бы не болтались, хотя, если вы говорите что они сами отваливаются...
Код:
while true; do
  if ! ifconfig eth0 | grep 'UP'; then tcpdump -i eth0; fi
  sleep 30
done
скрипт от рута пускать... Интерфейс вы сами переподнимаете?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:10 27-05-2011
kostya_rlw

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

Цитата:
 
 Кручу, верчу, запутать хочу!!!  
ifconfig ppp0 2>&1 | grep -i 'UP' > /dev/null  
 Соответственно дальше можете анализировать переменную $?, если хотите конечно.  

 
Да! Спасибо!
как раз и надо анализировать $?..
 
Получается сначала возможные ошибки направляются туда же куда и вывод  2>&1
потом эта смесь вывода и возможных ошибок грепается,  
и даелее при любых вариантах ггрепа (есть'UP' или или нету) а также при ошибках ifconfig -  все летит в  null
Правильно ? )
 
PS. А почему сразу запутать? )

Всего записей: 57 | Зарегистр. 18-01-2006 | Отправлено: 19:16 27-05-2011 | Исправлено: kostya_rlw, 19:18 27-05-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kostya_rlw
Ну кто же мешал вам пошаманить как мне?) Я тоже методом тыка, за принцип взяло...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:22 27-05-2011
kostya_rlw

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Я чесно говоря от неожиданности и восторга ), когда попробовал и получилось, даже воскликнул всух там что то...
...почему то в голове как догма было что конструкции типа 2>&1, > /dev/null  всегда в конце связки комманд ставить...

Всего записей: 57 | Зарегистр. 18-01-2006 | Отправлено: 19:30 27-05-2011 | Исправлено: kostya_rlw, 19:35 27-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> А зачем sudo?
ifconfig может быть запущен только рута.
 
> Я мысль не понял
> И кстати, если я правильно вас понял
:D
 
> true и false вы местами перепутали
Нет, там именно что все правильно.
 
> Что вы имеете в виду говоря "инвертировать код возврата"?
Вот это:
$ if sudo ifconfig wlan0 | grep 'UP'; then false; else true; fi
 
И вы мне даже уже почти ответили:
$ ! sudo ifconfig wlan0 | grep 'UP'
 
Я считал, что восклицательный знак — допустимый оператор только для test'а ([ и [[).
 

Цитата:
while true; do  
  if ! ifconfig eth0 | grep 'UP'; then tcpdump -i eth0; fi  
  sleep 30  
done

 
Запустить тисипи-дамп, если интерфейс не поднят — здесь написано.
 
gap5
 
#!/bin/sh
if ps -C tcpdump -o cmd | grep -q '\-i eth0'; then # не берусь судить о позиксности этой строки
 echo >&2 'tcpdump has already started'
 exit 1
fi
while ! ifconfig eth0 | grep -q 'UP'; do
 sleep 30
done
tcpdump -i eth0 &

 
А вот писать о том, что вам не для ГНУ, надо сразу.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:57 27-05-2011 | Исправлено: ASE_DAG, 19:59 27-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
ps у него нет, есть top - его нельзя заюзать?

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 19:57 27-05-2011 | Исправлено: gap5, 20:15 27-05-2011
Alukardd



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

Цитата:
ifconfig может быть запущен только рут
оО Ну не знаю как у вас, но у меня и так работает, если параметры не менять)
 
> :D
Да знаю сам, читал же свой пост, но по другому сказать не мог...  
 

Цитата:
Запустить тисипи-дамп, если интерфейс не поднят — здесь написано.  
Да, точно - но мысль просто дальше ушла - 1. упал 2. опознали падение 3. подняли 4. запустили tcpdump
Я просто выполнил без 3-го пункта)))
 
Ваш скрипт, кстати, тоже не без изъянов - если интерфейс отвалится, то tcpdump сам сразу не отрубится, и таким образом вы не узнаете, что интерфейс упал)
 
В общем уважаемый 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.

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



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

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 20:17 27-05-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
А там случаем нету чего-то подобного каталогам if-up.d, if-down.d ??? Тогда дело сильно упростится и уточнится)))

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
> ps у него нет, есть top - его нельзя заюзать?
Мне казалось, у Цисок (никогда с ними не сталкивался, да) вообще не Позикс-система, я ошибался?
Но такого (ps нет, top есть) быть не может, ну по крайней мере не должно. Вы точно уверены?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня как всегда гениальные вопросы!
А можно ли в регулярке проверить не просто на наличие 3-х цифр [0-9]{3}, а еще что бы это число было от 0 до 101 например?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:50 27-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Именно в такой постановке вопроса — нет. Регэкспы предназначены для поиска соответствия строкам и только строкам.
Но регэксп здесь, очевидно, и не нужен. Пример задачи можно?
 
P.S. Ну, конкретно от нуля до ста одного описать регуляркой-то не сложно: ([0-9]{1,2}|10[01]), но в общем случае — никак.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Нет, без примера. Как решить задачу я знаю и не 1 путём) Возможно и не самые рациональные, но костыли это практически неизбежная часть нашей работы
Волновал сам факт - просто в голову взбрело...
 
Добавлено:
ASE_DAG
Цитата:
[0-9]{1,2}|10[01]
да, башка у вас на регулярках не дурно варит... Это весьма обощенный способ вы предложили, так можно много чего формализовать... Спасибо.

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:58 27-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
В dev есть такое:
 
aes_0 io8logmt tty.gas-gauge
bpf0  klog tty.iap
bpf1  mux.spi-baseband  tty.umts
bpf2  null ttyp0
bpf3  pf   ttyp1
btreset  ptmx ttyp2
btwake   ptyp0    ttyp3
console  ptyp1    ttyp4
cu.bluetooth  ptyp2    ttyp5
cu.debug  ptyp3    ttyp6
cu.gas-gauge  ptyp4    ttyp7
cu.iap   ptyp5    ttyp8
cu.umts  ptyp6    ttyp9
disk0 ptyp7    ttypa
disk0s1  ptyp8    ttypb
disk0s2  ptyp9    ttypc
disk0s2s1     ptypa    ttypd
dlci.spi-baseband.call ptypb    ttype
dlci.spi-baseband.chatty   ptypc    ttypf
dlci.spi-baseband.cl1  ptypd    ttys000
dlci.spi-baseband.extra_0  ptype    ttys001
dlci.spi-baseband.iq   ptypf    uart.bluetooth
dlci.spi-baseband.low  random   uart.debug
dlci.spi-baseband.pdp_0    rdisk0   uart.gas-gauge
dlci.spi-baseband.pdp_1    rdisk0s1 uart.iap
dlci.spi-baseband.pdp_2    rdisk0s2 uart.umts
dlci.spi-baseband.pdp_3    rdisk0s2s1    urandom
dlci.spi-baseband.pdp_ctl  sha1_0   vn0
dlci.spi-baseband.reg  tty  vn1
dlci.spi-baseband.sms  tty.bluetooth zero
io8log   tty.debug
 
ASE_DAG
Под IOS я имел ввиду не цисковский софт, а IphoneOS Top я отдельно накатывал, сейчас нашел пак adv-cmds там ps md finger.
 
В итоге при запуске:

Цитата:
#!/bin/sh
if ps -C tcpdump -o cmd | grep -q '\-i pdp_ip0'; then
 echo >&2 'tcpdump has already started'
 exit 1
fi
while ! ifconfig pdp_ip0 | grep -q 'UP'; do
 sleep 30
done
tcpdump -i pdp_ip0 -s 1450 -w /var/mobile/27.txt  
&
 

 
ругается ps:

Цитата:
root# ./tcp.sh
ps: illegal argument: tcpdump
usage: ps [-AaCcEefhjlMmrSTvwXx] [-O fmt | -o fmt] [-G gid[,gid...]]
          [-g grp[,grp...]] [-u [uid,uid...]]
          [-p pid[,pid...]] [-t tty[,tty...]] [-U user[,user...]]
       ps [-L]
root# tcpdump: WARNING: pdp_ip0: no IPv4 address assigned
tcpdump: listening on pdp_ip0, link-type NULL (BSD loopback), capture size 1450 bytes
 

 
p.s. подскажите, чтобы вывод tcpdump'a был в файл с названием текущей даты как должна команда выглядеть?
что-то вроде  
 
tcpdump -i pdp_ip0 -s 1450 -w /var/mobile/%DD-%MM.txt ?

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 00:20 28-05-2011 | Исправлено: gap5, 00:29 28-05-2011
Alukardd



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

Цитата:
Под IOS я имел ввиду не цисковский софт, а IphoneOS
OMG! Вас покарать мало!!! Я всё еще гадал откуда у вас обычная командная оболочка и где там скрипты никсовые можно юзать... Там конечно есть tclsh, но синтаксис у него совсем другой. И как с ним общаться я тоже хз.
 
А почему нету IPv4 адреса назначенного интерфейсу?
/var/mobile/`date +%x`.log, если date есть... %x можно менять по вкусу на что желаете. (курить man 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:47 28-05-2011 | Исправлено: Alukardd, 00:51 28-05-2011
gap5



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Поиском (find / -name if*) нашелся только /sbin/ifconfig
 
Видимо специфика GPRS интернета, сначала поднимается интерфейс, потом получается IP...
 

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 12:32 28-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
> специфика GPRS интернета, сначала поднимается интерфейс, потом получается IP
DHCP это называется.
 
> IphoneOS
iPhone. iOS и IOS — разница небольшая, но есть.
 
> Поиском (find / -name if*) нашелся только /sbin/ifconfig  
Вы это к чему?
Плюс звездочки и знаки вопроса, если хотите их передать к.-либо программе, надо экранировать или закавычивать — иначе начинается угадайка: если в текущей директории будет соответствие паттерну if*, он раскроется шеллом, если не будет — повезло.
 
> ругается ps
Судя по выводу с описанием синтаксиса это фряшный ps. Ну что ж, переложим и фильтрацию по имени команды на греп:
ps -U root -o command | grep -q 'tcpdump.* \-i pdp_ip0'
а если процесс внезапно не принадлежит руту, то  
ps -a -o command | grep -q 'tcpdump.* \-i pdp_ip0'

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:45 28-05-2011 | Исправлено: ASE_DAG, 03:46 29-05-2011
gap5



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

Цитата:
#!/bin/sh
if ps -U root -o command | grep -q 'tcpdump.*\-i pdp_ip0'; then
 echo >&2 'tcpdump has already started'
 exit 1
fi
while ! ifconfig pdp_ip0 | grep -q 'UP'; do
 sleep 30
done
tcpdump -i pdp_ip0 -s 1450 -w /var/mobile/'date +%m-%d'.txt &
 

 
Запускаю скрипт, если tcpdump запущен, то сообщает об этом и выходит, если нет, то запускает tcpdump и ждет.  
 
Для теста вручную убиваю пид tcpdump'а, после этого перезапуска tcpdump'а не происходит, интерфейс поднят. Или перезапуск произойдет только после изменения статуса интерфейса?
 
 
 

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 21:34 28-05-2011 | Исправлено: gap5, 21:35 28-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
А где здесь вообще что-то про перезапуск? Это для запуска при старте системы, на случай если интерфейс еще не поднялся.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:42 28-05-2011 | Исправлено: ASE_DAG, 22:42 28-05-2011
gap5



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

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 22:44 28-05-2011 | Исправлено: gap5, 22:55 28-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А для реализации респаўна «на коленке» достаточно просто не уводить процесс в фон (&) и загнать все это в бесконечный цикл:
 
#!/bin/sh  
if ps -U root -o command | grep -q 'tcpdump.* \-i pdp_ip0'; then  
 echo >&2 'tcpdump has already started'  
 exit 1  
fi  
while true; do
 while ! ifconfig pdp_ip0 | grep -q 'UP'; do  
  sleep 30  
 done  
 tcpdump -i pdp_ip0 -s 1450 -w /var/mobile/`date +%m-%d`.txt # вот здесь при копировании у вас обратные кавычки внезапно стали прямыми
done

 
Добавлено:

Цитата:
while ! ifconfig pdp_ip0 | grep -q 'UP'; do  
  sleep 30  
done  
tcpdump -i pdp_ip0

А вообще мне вот это не очень нравится, мы проверяем одно, а делаем другое. Нас в конце концов интересует не поднят ли интерфейс, а можем ли мы запустить tcpdump:
 
#!/bin/sh  
if ps -U root -o command | grep -q 'tcpdump.* \-i pdp_ip0'; then  
 echo >&2 'tcpdump has already started'  
 exit 1  
fi  
while true; do  
 until tcpdump -i pdp_ip0 -s 1450 -w /var/mobile/`date +%m-%d`.txt; do  
  sleep 30  
 done  
done


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:57 28-05-2011 | Исправлено: ASE_DAG, 03:46 29-05-2011
gap5



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

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 23:37 28-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gap5
$ nohup script.sh &
, хотя переводить в фон (&), собственно, не обязательно.
 
Во Фре эта штука есть. Есть ли в вашей айоси — проверьте.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:51 28-05-2011
gap5



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

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 00:39 29-05-2011
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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:46 29-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
А я, и учитывая опыт этого обсуждения и некоторых предыдущих, повесил вверху шапки объявление:
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:39 29-05-2011 | Исправлено: ASE_DAG, 02:46 29-05-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Блин! В ps -U root -o command | grep -q 'tcpdump.* \-i pdp_ip0' и подобных конструкциях выше перед \-i должен стоять пробел. Иначе Греп находит сам себя, что логично — \ тоже попадает под .*.

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

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Все душераздирающие подробности были описаны еще на 11 странице.
 
ASE_DAG
Насчет GNU, было бы еще более ценным наличие небольшого HOWTO по идентификации...
Насчет пробела перед \-i, глюк возможен, если запущено несколько tcpdump'ов с разными параметрами?
 

Всего записей: 1034 | Зарегистр. 30-05-2006 | Отправлено: 11:45 29-05-2011 | Исправлено: gap5, 11:47 29-05-2011
king_stiven

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

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 08:49 02-06-2011 | Исправлено: king_stiven, 08:59 02-06-2011
Alukardd



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

Код:
for line in "`grep -n '[[:space:]]*УДК' "$src"`"; do
  ln="`echo "$line" | awk -F\: '{print $1}' | tr -d '\n'`"
  echo "$ln q "
done
штука в том, что как только я ставлю кавычки вокруг grep'а в for'е так он заходит внтурь цикла только 1 раз!!! Если кавчки снять вокргу ``, то тогда он не правильно работает и выходит хрень несусветная (видимо for сам берет после последнего пробела... или все по очереди гонит - в общем не то, что надо делает).
Подскажите как записать правильно? Пытался заменить `` на ${}, но лезут синтаксические ошибки - не умею я второй конструкцией пользоваться(((

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:52 06-06-2011 | Исправлено: Alukardd, 23:55 06-06-2011
ASE_DAG



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

Цитата:
for line in "`grep -n '[[:space:]]*УДК' "$src"`"; do  
  ln="`echo "$line" | awk -F\: '{print $1}' | tr -d '\n'`"  
  echo "$ln q "  
done

 
ОМГ! О_о Что эта конструкция должна делать? Выводить в одну строку номера строк, удовл. '[[:space:]]*УДК', плюс " q " из файла?
 
$ awk -v ORS=" " '/[[:space:]]*УДК/{print NR, "q"}' "$src"

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Надо получить содержимое предыдущей строки, если в данная совпадает с регуляркой.
Цикл должен был дать нам номера всех строк совпавших и далее хотел через sed -n "$lnp" получить содержимое предыдущих, где let ln--. Кстати как в sed поместить эту $ln тоже вопрос)))
 
Добавлено:
awk '/[[:space:]]*УДК/{print NR-1}' "$src"
вот собственно номера но как получить теперь содержимое этих строк?
Кстати спс, а то у меня туго с awk
 
Добавлено:
Получил желаемое так
    for ln in `awk '/[[:space:]]*УДК/{print NR-1}' "$src"`; do
     awk "{if (NR==$ln) print \$1}" "$src"
    done
 
Добавлено:
А-а-а вы меня совсем с мысли сбили)))
НЕТ
Можно ли что-то сделать с моим старым выражением? Мне все равно нужно полное содержимое и найденной и предыдущей строк...
Запускать как это сделал я поиск по документу внутри цикла это жёстко долго, а если сделать таких поисков несколько... Так это вообще ппц будет.

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:56 07-06-2011 | Исправлено: Alukardd, 01:36 07-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Надо получить содержимое предыдущей строки, если в данная совпадает с регуляркой.
Ну, наиболее кратко это можно записать, если дважды перевернуть порядок строк:
$ tac "$src" | awk '/[[:space:]]*УДК/{getline; print}' | tac
, но это, понятно, не рационально.
 
Лучше, все-таки, будет в два прохода:
$ awk '/[[:space:]]*УДК/{ln[i]=NR; i++} END{close(FILENAME); NR=1; while (getline < FILENAME) {if (NR==ln[j]-1) {print; j++}; NR++}}' "$src"
 
P.S. Вы, случаем, не в курсе, как по-нормальному запустить второй проход в авке?
 
 
Добавлено:
> нужно полное содержимое и найденной и предыдущей строк
Тогда, как не трудно догадаться:
$ awk '/[[:space:]]*УДК/{ln[i]=NR; i++} END{close(FILENAME); NR=1; while (getline < FILENAME) {if (NR==ln[j]-1) print; if (NR==ln[j]) {print; j++}; NR++}}' "$src"

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
вы мне просто вынесли мозг - можно немного комментариев по поводу while...
А счетчики i,j они типа по дефолту 1?
А getline что ли счетчик NR не трогает? Зачем мы его сами ++, да еще и не каждый раз, а только если наткнулись на строку с УДК???

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем, авк не поощряет работу в несколько проходов. И правильно делает! Ибо если «задняя память» у нас всего в одну строку, то ее всяко лучше просто удерживать в памяти:
 
$ awk '/[[:space:]]*УДК/{print s; print} {s=$0}' "$src"
 
Вот!
 
P.S. Итого, меня на ночь лучше ни о чем не спрашивать — я сразу начинаю все переусложнять. ;-)
 


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:14 07-06-2011 | Исправлено: ASE_DAG, 02:18 07-06-2011
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.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> getline что ли счетчик NR не трогает?
getline — трогает, getline < file — нет.
 
> мы его сами ++, да еще и не каждый раз, а только если наткнулись на строку с УДК?
Нет, каждый раз. Если это переписать нормально, а не в одну строку, то будет хорошо видно:
while (getline < FILENAME) {
   if (NR==ln[j]-1) {
      print;
      j++;
   }
   NR++;
}

 
> счетчики i,j они типа по дефолту 1?
Нет, ноль.
$ awk 'BEGIN{i++; print i}'
1


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:28 07-06-2011 | Исправлено: ASE_DAG, 02:29 07-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Если это переписать нормально
А-а вторая закрывающая скобка это от END.
Цитата:
Нет, ноль.  
Я почему 1 написал, а не ноль собственно... Из-за ln[j]-1 - куда оно обращается при первом проходе?
 
Добавлено:
У меня на завтра есть продолжение геморроя)))
Надо будет получить не предыдущую строку, а на 2 выше (т.е. через строку)...

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> ln[j]-1 - куда оно обращается при первом проходе?
Эээ... ЩИТО? ln[j] (при первом проходе ln[0]) — номер первой строки, удовл. регэкспу. Соотв. ln[j]-1 — номер строки, предшествующей первой строке, удовл. регэкспу.
 
P.S. Это не логарифм, а имя массива. Лол. :-)

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Это не логарифм, а имя массива. Лол.
спс, кэп! ))) :rofl:
Я идиот, но по другой причине) Я читал это как ln[j-1] и думал что мы выйдем за границы массива)))
 
 
Добавлено:
awk 'BEGIN {j=2} /[[:space:]]*УДК/{print s; print} {if (j%=2) {s=$0} else {a=$0}; j++}' "$src"
Вот для получения на 2 строки выше... Только меня это не устроит((( Иногда надо на 2 иногда на 1((( Надо еще проверки ставить...

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Надо будет получить не предыдущую строку, а на 2 выше (т.е. через строку)...
> Только меня это не устроит((( Иногда надо на 2 иногда на 1
Ну, вот в общем виде — искомая плюс n строк выше:
'/regex/{for (j=0; j<n; j++) print s[(i+j)%n]; print} {i%=n; s[i]=$0; i++}'

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кстати, о проверках. Если n строк выше нету (начало файла), то будут выводиться пустые, что не очень хорошо, поэтому проверка перед выводом не помещает, да:
 
'/regex/{for (j=0; j<3; j++) {t=(i+j)%3; if (s[t]) print s[t]}; print} {i%=3; s[i]=$0; i++}'

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А можно в проверку еще regexp как-то упихать?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> А можно в проверку еще regexp как-то упихать?
Не понял.
 
P.S. Но думаю, что можно.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:50 07-06-2011 | Исправлено: ASE_DAG, 22:00 07-06-2011
Alukardd



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

Цитата:
if (s[t]) print s[t]
печатаем, если не пустая строка, а можно тут печатаем если содержит АБВ?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> тут печатаем если содержит АБВ?
Почему нет?
if (s[t] ~ /АБВ/) print s[t]

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Во новый для меня способ сравнения x ~ /regexp/
Спасибо.
 
Добавлено:
Хм... Такое у меня не проканало...
awk 'BEGIN{n=2} /ВАК/{for (j=0; j<n; j++) {t=(i+j)%n; if (s[t] ~ /^[[:digit:]]\{2\}\(\.\|[[:space:]]\)/) print s[t]}; print} {i%=n; s[i]=$0; i++}' "$src"
Выводит только искомую строку и ни каких строк до, пробовал с n=1,2,3
 
Либо я плохо изъясняю, либо вы меня плохо понимаете
Цитата:
Иногда надо на 2 иногда на 1(((
Структура документа следующая:
Код:
regexp1
  regexp2
  regexp3
Нужно! Найти все regexp3 и соответствующие им regexp1. При этом строки с regexp2 может вообще не быть. И regexp3 есть не у каждого regexp1, т.е. нельзя исходить от обратного.
В итоге надо получить соответствие regexp1 и regexp3.
 
p.s. Надеюсь понятно мысль изложил...

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Выводит только искомую строку и ни каких строк до
Значит этот ваш регэксп /^[[:digit:]]\{2\}\(\.\|[[:space:]]\)/ неправильно составлен.
Можете убедиться, что без него работает.
 
P.S. А вообще таблицу соответствий классификаторов ГРНТИ, УДК и ВАК можно было бы давно найти в более машиночитаемом формате.
 
Добавлено:
> Значит этот ваш регэксп /^[[:digit:]]\{2\}\(\.\|[[:space:]]\)/ неправильно составлен.  
Я даже скажу как правильно:
/^[[:digit:]]{2}(\.|[[:space:]])/
 
и укажите авку ключ --re-interval, а то он их не очень любит.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Этот регэксп работает в grep замечательно - все проверялось - и в скрипте и в просто в терминале.
 
По поводу PS - взял doc с оф сайта ГРНТИ - там есть sql версия, но она платная... Решил по другим сайтам не искать - что бы херь не скачать... Тут точно свежее и корректное. К тому же опыт и знания об awk очень хочется получить...
А вообще да мне все в итоге надо в postgres будет слить...
 
оО  
awk --re-interval 'BEGIN{n=2} /ВАК/{for (j=0; j<n; j++) {t=(i+j)%n; if (s[t] ~ /^[[:digit:]]{2}(\.|[[:space:]])/) print s[t]}; print} {i%=n; s[i]=$0; i++}' grnti.txt|less
неужто правильно все выдал....
 
П****ц...
Разложил код как положено - я не вкуриваю, что реально происходит... Почему для каждой строки мы заново считаем i%=n и i++ или я не правильно читаю порядок действий awk?
Код:
    awk --re-interval '
        BEGIN{n=2}
        /ВАК/{
                        for (j=0; j<n; j++)  
                        {
                            t=(i+j)%n;
                            if (s[t] ~ /^[[:digit:]]{2}(\.|[[:space:]])/) print s[t]
                        };
                        print
        }  
        {
                        i%=n;
                        s[i]=$0;
                        i++
        }'  


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:41 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Этот регэксп работает в grep замечательно - все проверялось - и в скрипте и в просто в терминале.
Почему вы думаете, что у Грепа (у к-рого, кстати, три разных режима с разным синтаксисом) и у Гавка надо экранировать одни и те же синтаксические эл-ты?
 
> неужто правильно все выдал
Должен. ;-) Я его, по крайней мере, на нескольких реальных тройках ГРНТИ—УДК—ВАК проверял.
 
> Почему для каждой строки мы заново считаем i%=n и i++
Я даже не знаю, как объяснить... То, что i в бесконечном цикле вида { i%=n; i++ } принимает значения: 0, 1, 2, ..., n-2, n-1, 0, 1, ..., n-1, 0, ... — понятно?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
То, что i в бесконечном цикле вида { i%=n; i++ } принимает значения: 0, 1, 2, ..., n-2, n-1, 0, 1, ..., n-1, 0, ... — понятно?
не совсем))) До какого числа будет расти i? до n??? Т.е. в нашем конкретном случае это выливается в 0,1,2,1,0,1,2,1,0...??? Типа хитрый способ вместо if (i==2) i=0 else i++???
Вопрос был более обширный) Я не понимаю мы что ли для каждой строки с ВАК просматриваем n строк выше для поиска строки с номером ГРНТИ?
Ваще мне интересно откуда у вас такие идеи с t=(i+j)%n; возникают???

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> 0,1,2,1,0,1,2,1,0
Да.
 
> типа хитрый способ вместо if (i==2) i=0 else i++???  
Нет, это вот это с если-то-иначе — «способ через хитрое место», к тому же совершенно нерасширяемый (строго n=2).
 
> мы что ли для каждой строки с ВАК просматриваем n строк выше для поиска строки с номером ГРНТИ?  
Ну да, вы же сказали, что УДК у темы может не быть (и действительно, а никогда бы не подумал), поэтому просто взять энную назад от ваковского номера строку мы не можем, поэтому проверяем регэкспом.
 
Добавлено:
i здесь, кстати — лишняя сущность.
(a%n)%n == a%n жеж, поэтому можно просто номер строки использовать.
 
'/bar/{for (j=0; j<n; j++) {t=(NR+j)%n; if (s[t] ~ /foo/) print s[t]}; print} {s[NR%n]=$0}'

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:21 08-06-2011 | Исправлено: ASE_DAG, 16:39 08-06-2011
Alukardd



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

Цитата:
'/bar/{for (j=0; j<n; j++) {t=(NR+j)%n; if (s[t] ~ /foo/) print s[t]}; print} {s[NR%n]=$0}'

Цитата:
Ваще мне интересно откуда у вас такие идеи  
С каждым разом всё больше прусь... Прочитать готовый скрипт не большая проблема (если синтаксис знаешь), но как допереть до такого с нуля я хз...

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
мб вы снимите завесу тайны с моего самого первого вопроса? Как в цикле for организовать нормальное построчное чтение?
 
Добавлено:
Мучения продолжаются) Можно как-то оптимизировать мать что я придумал?
awk '{gsub(/\./,"0",$1); print}' grnti/grnti.txt | sed 's/\([[:digit:]]\{2,8\}\)[[:space:]]*\(.*\)/(0\1,"\2"),/g; $s/\(.*\),$/\1;/g' >> "$dstfolder/grnti.sql"

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:21 08-06-2011 | Исправлено: Alukardd, 20:34 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> мб вы снимите завесу тайны с моего самого первого вопроса?
> Как в цикле for организовать нормальное построчное чтение?  
На Баше?
 
> Можно как-то оптимизировать мать что я придумал?  
> awk '{gsub(/\./,"0",$1); print}' grnti/grnti.txt | sed 's/\([[:digit:]]\{2,8\}\)[[:space:]]*\(.*\)/(0\1,"\2"),/g; $s/\(.*\),$/\1;/g' >> "$dstfolder/grnti.sql"
Не думаю. Связки вида Гавк + Сед через пайп мало поддаются оптимизации, бо представляют собой разновидность write-only кода. ;-) Только переписыванию заново.
 
Что это штука должна делать?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
На Баше?  
ну bash или zsh - судя по всему я и так и так пробовал... т.к. скрипт #!/bin/bash а терминал у меня zsh...
Цитата:
Что это штука должна делать?
добавляет 0 в начало строки
заменяет точки между цифрами (в номере) на 0
превращает в sql удобоваримую форму - (номер, "текст"),
и в последней строке меняет запятую на точку с запятой
 
awk тут только потому, что я не знаю как на sed заменить точку только в первом столбце... Точнее смутновато представляю - но извращаться так не хочется (когда на awk это в пол действия)

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:56 08-06-2011 | Исправлено: Alukardd, 20:58 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> добавляет <...> с запятой
И все это работает? А от меня требуется переписать это более читабельно?
Тогда без алгоритма: какой формат на входе и какой на выходе? На примере.
 
> Как в цикле for организовать нормальное построчное чтение?  
> ну bash или zsh
А что в итоге требуется-то? Обойтись без Авка — это более чем странная цель. Авк скорее будет на машине, чем Баш.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
А что в итоге требуется-то? Обойтись без Авка — это более чем странная цель. Авк скорее будет на машине, чем Баш.
таких задач не ставилось - уже спортивный интерес просто))) мб дело в том, что я скрипт запускаю из под zsh? Надо будет без него проверить... (пока руки не дошли)
Цитата:
И все это работает? А от меня требуется переписать это более читабельно?
Тогда без алгоритма: какой формат на входе и какой на выходе? На примере.  
угу работает) Вход:
00.08 Общественные науки и идеология
Выход:
(000008,"Общественные науки и идеология"), - в последней строке в конце ; вместо ,
 
И я тут еще одно чудо написал - тоже работает)))
awk --re-interval '/УДК/{gsub($1." ",""); gsub(";",""); for(i=1;i<=NF;i++){ print "("s", \""$i"\"),"}} {gsub(/\./,"0",$1); s="0"$1}' grnti/grnti-udk.txt | sed '$s/\(.*\),$/\1;/g'
Вход:
00.08 Общественные науки и идеология
УДК 3; 32.019.52

Выход:
(000008, "3"),
(000008, "32.019.52"),
последняя строчка так же должна иметь ; вместо ,
 
p.s. Я уже скоро буду смущаться Вас что-то спрашивать))) 3-е сутки мучаю галиматьей....

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:18 08-06-2011 | Исправлено: Alukardd, 22:19 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> угу работает)
Тут едва ли можно более красиво написать. Разве что чуточку:
 
$ gawk '{
    match ($0, /([.0-9]*)[[:space:]]*([[:alnum:] ]*)/, s);
    gsub (/\./,"0",s[1]);            
    printf ("%s0%s %s", NR==1 ? "" : ",\n", s[1], s[2]);
    }  
    END{ print ";" }' grnti/grnti.txt

 
Основная проблема — с точкой с запятой. Определить, что текущая запись в потоке последняя не забегая вперед же принципиально невозможно. Если в Седе это «забегание» реализовали и имеется псевдономер $, то в Авке такого нет.  
В общем, сами все видите, что пришлось сделать.
 
> добавляет 0 в начало строки  
А зачем это, если не секрет?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
добавляет 0 в начало строки  
А зачем это, если не секрет?
Нам нужно превратить "сотичную систему рубрикатора в "тысячную" таким образом добавляем 0 ко всем разделам. Так мы сможем добавлять свои подпункты и деления за счет старшего разряда - ставя например туда 1 и при этом все точно будем знать что из это "самопал"...
Вы же заметили, что разделительные точки мы тоже не удаляли, а на 0 меняли...
 
Хм... Кажется вы не привели это к sql виду... Скобки и разделитель запятая...
 
Ладно оставим как есть, с комбинацией awk и sed.
 
У меня щас косяк и хз пока как решить. С ВАК'ами есть заморочка Надо либо отрезать в строке с ВАК если находим См. до ближайшей точки с запятой, либо реально "смотреть", т.е. искать пункт на который ссылается и брать номера и от туда и так возможна и рекурсия.
2-ой вариант реально запарный так что пока надо просто отрезать См., но как это сделать в awk я хз - а получается так, что надо сделать посреди сценария...
 
p.s. с рекурсией надо будет на досуге подумать)))

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:37 08-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Кажется вы не привели это к sql виду... Скобки и разделитель запятая...  
Блин, нашли проблему — пять символов (плюс две экранир. черты) дописать в нужное место:
 
$ gawk '{
    match ($0, /([.0-9]*)[[:space:]]*([[:alnum:] ]*)/, s);
    gsub (/\./,"0",s[1]);            
    printf ("%s(0%s, \"%s\")", NR==1 ? "" : ",\n", s[1], s[2]);
    }  
    END{ print ";" }' grnti/grnti.txt

 
Добавлено:
> отрезать в строке с ВАК если находим См. до ближайшей точки с запятой
Пример? Это вообще к чему относится? К прошлой задачке?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:47 08-06-2011 | Исправлено: ASE_DAG, 23:57 08-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Блин, нашли проблему
я так, к слову...
Цитата:
Пример?
ок, ок... ЗабылЪ
ВАК См. 00; 10.02.19
ВАК 01.01.09, 07.00.00/24.00.00
ВАК 09.00.00
ВАК 05.25.00,09.00.00
ВАК 09.00.01; +09.00.04; +09.00.05; 09.00.11; 09.00.13
ВАК См. 02.31
ВАК См.05
ВАК См.05, 05.13.01

Вроде представил вам все возможные вариант засад.
Вид надо получить всё тот же... Есть еще тут косяк, но его можно решить заранее - у этих дегенератов иногда в Cм - С в латинице!!! Ну и как видите не везде есть пробелы... И кое где запятая а не ;, хотя См. не было - такой вариант наверное рассматриваем как обычный (как и ;).
 
p.s. вообще в рубрикаторе есть еще и уточняющая галимотья, но не имеет четкого формата представления и занимает жалкие доли процента общего документа, так что в неё мы точно не полезем.

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

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



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Да, как я уже сказал обрабатывать см. как ссылку щас не будем. Как нибудь в другой раз
 
Поэтому надо удалить См (напоминаю про подставу с языком) и пункты к нему относящиеся. Будем считать, что к нему относится все до ближайшей ;. Собственно тут и вопрос, я хз как так удалить на awk... А в середину выражения sed не воткнёшь....
 
Добавлено:
Долбаные мудаки делали этот документ! Щас проверял как УДК сформировалось нашёл десяток строк со слитным написание или с ; там где её быть не должно... Что б их всех!!!
Если щас вы мне покажите как в awk со строками работать, то наверное можно будет обобщить проблему с УДК примерно таким способом sed 's/^УД.{1,2}([[digit:]].*)/\1/g', вместо gsub($1." ","") - который был рассчитан именно на УДК .
 
p.s. оО почитал немного man vi - я всё больше прусь с возможностей этого редактора - он блин и шифровать документы умеет! Ключик -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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:18 09-06-2011 | Исправлено: Alukardd, 00:19 09-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> я хз как так удалить на awk...  
> А в середину выражения sed не воткнёшь
Да точно так же, как и на Седе:
sub(/[CС]м[^;]*; */, "")
регистронезависимость я бы для такой задачи глобально включил.
 
Добавлено:
> примерно таким способом
> sed
Да забудьте пока вы про Сед. Не мешайте все в кучу.
 
P.S. В Гавке функция замены, поддерживающая обратные ссылки, — gensub(r, s, h [, t]), если вы не в курсе.
 


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Так gensub написано, что строку не меняет и результат возвращает как функция...
 
Ваш sub ровным счётом ни чего не дал - так же пробовал в нём менять regexp, тоже безрезультатно.
awk --re-interval '/ВАК/{gsub($1." ",""); sub(/[CС]м[^;]*; */, ""); gsub(";",""); for(i=1;i<=NF;i++){print "("s", \""$i"\"),"}} {gsub(/\./,"0",$1); s="0"$1}' grnti/grnti-vak.txt | sed '$s/\(.*\),$/\1;/g' | less
 
Пробовал менять [CС] на .
 
Добавлено:
Для УДК вышло - sub(/УД[^[:digit:]]{1,2}/,"");

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:52 09-06-2011 | Исправлено: Alukardd, 00:53 09-06-2011
olegpronin



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужна помощь!
 
Вот структура каталогов:
/FLAC/Artist {Genre 1, Genre 2}/Artist - Album (Year) [FLAC]
 
shell скрипт кидаю во FLAC
 
в списке list.txt должны появиться только папки Artist - Album (Year) [FLAC]  
 
решение для bat-файла винды
@echo off
for /r c:\flac /d %%i in (*[FLAC]*) do echo %%~nxi >> list.txt  
 
кто-нибудь может помочь сделать тоже самое на unix?
спасибо!

Всего записей: 5365 | Зарегистр. 31-01-2007 | Отправлено: 18:20 16-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
olegpronin
find /FLAC/ -type d -name '*\[FLAC\]*' -exec basename {} \; > list.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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:57 16-06-2011
olegpronin



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

Всего записей: 5365 | Зарегистр. 31-01-2007 | Отправлено: 23:08 16-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> find /FLAC/
FLAC в корне? О_о
FLAC/ (или ./FLAC/) вы, наверное, хотели сказать?
 
Добавлено:
> -exec basename {} \;
А вызывать при каждой находке внешнюю утилиту — ой как не рационально, при условии, что вывод файнда настраивается куда гибче:
 
$ find FLAC/ -type d -name '*\[FLAC\]*' -printf '%f\n' > list.txt
 
Но это уже придирки. ;-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:43 16-06-2011 | Исправлено: ASE_DAG, 23:44 16-06-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
FLAC в корне? О_о
FLAC/ (или ./FLAC/) вы, наверное, хотели сказать?  
что просили то и написал...
Цитата:
find FLAC/ -type d -name '*\[FLAC\]*' -printf '%f\n' > list.txt
к своему сожалению я не знаю утилиту printf ну совсем и не могу найти где можно толково прочитать про неё... А Си в своё время я очень плохо учил и всегда юзал std::cout

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> я не знаю утилиту printf ну совсем
Ну это не утилита, а именно что одна из самых интересных сишных функций.
 
> где можно толково прочитать про неё
C http://ru.wikipedia.org/wiki/printf вполне можно начать. ;-)
 
Но в данном-то случае собственно к принтэфу это отношения не имеет — просто принтэф-подобный синтаксис описания формата вывода уже давно стандарт де-факто. Не может быть, чтоб вы не пользовались там stat'ом или date'ом — у find'а то же самое.  
А «типы» (ну эти %f, %S и т.д.) — они все-равно у каждой утилиты свои — не упомнить — надо открывать ман и смотреть.
 
> всегда юзал std::cout
Жжете. А на самом деле — много времени на этом потеряли, имхо.

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

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



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

Цитата:
Жжете. А на самом деле — много времени на этом потеряли, имхо.
я не программист (хотя образование говорит об обратном), и искренне не люблю писать программы и делаю это ужасно криво и в основном процедурное программирование. Вот скрипты - другое дело и то именно bash(не php или cgi ) на худой конец batch...
Цитата:
Не может быть, чтоб вы не пользовались там stat'ом или date'ом
Ну date'ом разумеется пользовался... Ёмаё!!! Шикарная тулза - stat!!! Спс)))
Эх пожалуй надо будет покурить инфу по printf, а то вот мы с вами с awk ***лись и в какой-то момент вы поюзали 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:42 17-06-2011 | Исправлено: Alukardd, 01:43 17-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> я не программист
А я и тем паче не он. ;-)
 
> Спс
Всгд пжлст.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:01 17-06-2011
slech



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

Цитата:
echo $HOSTNAME

 из консоли возвращяет имя узла,  

Цитата:
#!/bin/bash
echo $HOSTNAME

а то же самое из скрипта нет
это вроде встроенная переменная BASH.

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 22:04 21-06-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
slech
> это вроде встроенная переменная BASH.
Нет (хотя это смотря что считать «встроенным»). Эта переменная инициализирована только в интерактивном режиме (bash -i).
Используйте $(uname -n) для получения имени хоста.
 
P.S. Хм... А у меня и в неинтерактивном режиме тоже определена.  
В общем, не суть, важно то, что эти переменные где-либо ранее должны быть установлены, что имеет место не всегда. Вызов внешней утилиты в момент выполнения скрипта всегда надежней в плане кроссплатформенности.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:10 21-06-2011 | Исправлено: ASE_DAG, 22:19 21-06-2011
slech



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

Цитата:
P.S. Хм... А у меня и в неинтерактивном режиме тоже определена.

и у меня на некоторрых серверах, а вот тут возьми и перестань работать.
 

Цитата:
Используйте $(uname -n) для получения имени хоста.  

я неребрался на  

Цитата:
hostname=$(hostname)

 

Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 18:53 22-06-2011
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нужно выполнить определенную последовательность команд, зависящую от счетчика, над результатом find:
export a=0; find . -exec echo {} \; -exec echo $a \; -exec a=$[$a+1] \;
вот здесь и возникает проблема  - find -exec не умеет выполнять внутренние команды баша, соответственно счетчик не увеличивается
 
как можно реализовать счетчик в командах обработки результатов find ?

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 20:27 01-07-2011 | Исправлено: DrakonHaSh, 20:33 01-07-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
> find -exec не умеет выполнять внутренние команды баша
Так запустите Баш.
$ find -exec bash -c "echo $a; a=$(($a+1))" \;

 
P.S. Но это крайне неэффективно, обрисуйте задачу, мне кажется, ее можно решить иначе.
P.P.S. $[expression] — устаревшая конструкция, пишите $((expression)).
 
Нет, прощу прощения, переменная родительского процесса так не меняется.
В общем, опишите задачу.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
Да уж такое не пашет...
 
В общем как сказал ASE_DAG - опишите задачу
 
Хотя если попробовать додумать за вас , то выйдет нечто такое - find . | grep -n ''

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:29 01-07-2011 | Исправлено: Alukardd, 23:31 01-07-2011
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
задача:  
 
получить список файлов выданный по find {file1, file2, ... fileN}
var=1234
для каждого файла из результата выполнить последовательность команд
echo fileName; echo $var; var=$(($var + $RANDOM%32))
 
пример того, что должно получится в результате:
file1 1234
file2 1241  
file3 1263
...

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 14:55 02-07-2011 | Исправлено: DrakonHaSh, 14:59 02-07-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
> задача:
А где здесь зависимость от номера файла? Это же просто надо два списка склеить: файлов и случайных чисел.
 
Вот например, если хотите обойтись Башем (я бы заюзал АВК — нравится он мне):
 
$ find | while read F; do echo -e "$F\n$VAR\n$((VAR+RANDOM%32))"; done

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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
или, что алгоритмически тоже самое, перенести нижеследующий алгоритм
 
a=16; for i in {1..100}; do b=$(($a%256)) ;c=`printf "%s %03d" $i $b`; echo $c;a=$(($a+$RANDOM%48)); done
 
с for i in {1..100}; do ... done
на результат выданный find

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 15:15 02-07-2011
ASE_DAG



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

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

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



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

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 15:22 02-07-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
> СПАСИБО
Всегда пожалуйста. Обращайтесь. ;-)

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Farewill
> По крону / анакрону ежедневно запускается скрипт, который: а) убирает вчерашнюю картинку; б) выводит сегодняшнюю.
 
Этот скрипт вполне может выглядеть вот так:

Код:
#!/bin/bash
for PIDFILE in /run/lock/feh:[0-9].pid; do
    read PID < "$PIDFILE" && \
    kill $PID
done
cd "~/pictures/"
TODAY="$(date '+%m/%d')"
for DISPLAY in [0-9]; do
    DISPLAY=":$DISPLAY" feh --borderless --geometry 600x768 --auto-zoom "$DISPLAY/$TODAY"/* &
    echo $! > "/run/lock/feh:$DISPLAY.pid"
done

 
В качестве вьюера здесь feh, а не display, как я говорил изначально, его, скорее всего, придется установить. Ну или приспособить иное средство просмотра.
 
По-хорошему, конечно, надо иметь типа-демон-скрипт, который будет запускать feh'и и утягивать их за собой по завершению; и инит-скрипт, который можно пинать кроном. Но для начала и так сойдет.
 
Еще комментарии нужны?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
THE_IG0R
Вопрос
 
Ошибка говорит о том, что нету каталога /DATA/IVANOV... Внимание - РеГиСтР вАжЕн.
 
Парочка советов:
Во первых, не зачем делать 2 операции... tar сам умеет пропускать архив через gzip. Надо добавить в вызов ключ -z.
Во вторых, скорее всего надо использовать строгие кавычки (одинарные а не двойные)

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:16 02-08-2011
THE_IG0R



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

Цитата:
Ошибка говорит о том, что нету каталога /DATA/IVANOV... Внимание - РеГиСтР вАжЕн.  
 
Парочка советов:  
Во первых, не зачем делать 2 операции... tar сам умеет пропускать архив через gzip. Надо добавить в вызов ключ -z.  
Во вторых, скорее всего надо использовать строгие кавычки (одинарные а не двойные)

 
Каталог есть.
Регистр выдержан. Замена кавычек ничего ни изменила.  
 

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:48 02-08-2011
THE_IG0R



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

Цитата:
THE_IG0R  
Дайте результаты выполнения команды сюда пожалуйста...  
задача кстати от чьего имени выполняется? Права на чтения каталога есть?

 
Права на /DATA/IVANOV      40775
Права на /BACKUP/BACKUP/ 40777
 
Результат tar: failed to open /BACKUP/BACKUP/IVANOV_20110802.tar
 
пользователь: root

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
THE_IG0R
Ну скажите где лежит задача cron... Если через crontab была создана, то от текущего пользователя... Хотя при таких правах это не важно.
Цитата:
tar: failed to open /BACKUP/BACKUP/IVANOV_20110802.tar  
откуда вообще такой файл? У вас там дефисы должны быть в дате...
 
Добавлено:
THE_IG0R
А и это - вы же из скрипта это все выполняете... Уберите вообще кавычки или экранируйте их (обратный слэш).

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:20 02-08-2011
THE_IG0R



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В дате действительно дефисы, виноват.
 
cron настроен как-то хитро - в crontab есть какое-то расписание, но без комманд, но есть еще один файлики с коммандами и с расписанием, но как и откуда он запускается?
 
какие кавычки - в дате?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
THE_IG0R
давайте сюда полностью - не вашими руками перепечатанный а копипаст содержание crontab -l, и какого-то файла из /etc/cron.d/ судя по всему, с подходящим названием...
 
В скрипте у команды 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:43 02-08-2011
THE_IG0R



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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
THE_IG0R
Цитата:
получаю инфу по тел
труба... Об ssh не слышали?
Даже хз что и думать... Так вы у себя скрипт проверяете (если да, то у вас-то есть все эти каталоги?)?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:07 02-08-2011
THE_IG0R



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
фирма 10 машин 1 freebsd, удаленно подключиться нельзя
это оригинальное решение передано без объяснений без всего...
скрипт запускается там, на машине с существующими каталогами, подключаясь c помощью putty

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
THE_IG0R
При такой инфе мне не понятно такое поведение tar'а. Попробуйте скопировать tar команду из архива и просто выполнить её...
Я щас фритюрницу заведу гляну как в ней...
 
Добавлено:
THE_IG0R
А вообще думаю мы играем в испорченный телефон...
Если вы там работает от root'а, то измените строку на
tar -cf /root/IVANOV_`date "+%Y-%m-%d"`.tar /DATA/IVANOV

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:16 02-08-2011
THE_IG0R



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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:05 02-08-2011
THE_IG0R



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

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

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:17 02-08-2011
THE_IG0R



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

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



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

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



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

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

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



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

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



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

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:53 01-09-2011
ASE_DAG



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

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



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

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

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

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



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

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

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

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:12 04-09-2011
digital422

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:18 04-09-2011
digital422

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:06 04-09-2011 | Исправлено: Alukardd, 16:06 04-09-2011
ASE_DAG



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

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

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

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

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

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

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



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

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


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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Найден виновник, когда копировал с помощью WinSCP файл, то в нем появились ^M символы.  
ASE_DAG - насчет gawk это для меня пока темный лес.
Alukardd - если в конце строки сделать одну ячейку и добавлять найденные значения, не заменяя ID номер - быстрее работать не будет?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
быстрее работать не будет?
нет, все равно надо искать строку и вставлять текст - сама по себе замена нагрузки не несёт...
Воспользуйтесь лучше AWK скриптом - он должен чуть ли не на порядок ускорить дело.
 
ASE_DAG
Цитата:
/^.*\t.*\t.*\t.*\t.*\t[0-9]+$/  
мусье знает толк в извращениях...
Цитата:
in files ? files[$6]
Этот финт мне не совсем понятен. Что тут происходит? Что за if? Я понял $6 in files это читается)))
И кстати всё это свалится в stdout разумеется?
 
Добавлено:
У меня что-то совсем мозги атрофировались - я не смог ваш сценарий выполнить))) Поисковый шаблон не находит таких строк...

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

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

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

Цитата:
Воспользуйтесь лучше AWK скриптом

Не могу понять как он работает. Можно вдогонку попросить объяснить, как сделать добавление еще одной ячейки, чтобы сохранить ID колонку, чтобы было вот так:
 
09:30    1    Ролик1    без. даты 2011    10    123456789      123456789_deti.mp3

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Я щас его перепилю... У меня он в таком виде не пашет и вполне понятно по чему... (Что бы геморроя этого не было - разделитель должен быть точка с запятой, так что если можно изменить то лучше наверное изменить...)
 
Добавлено:
ASE_DAG
field separator там не табуляция потому что, а пробелы... В общем я уже все сказал по этому поводу. Нужен нормальный разделитель.
 
Добавлено:
Я чутка допилил ваш скрипт
Код:
#!/usr/bin/gawk -f
BEGIN {
    FILELIST="/home/alukardd/script/src"
    RS=",\n";
    FS="_";
    while (getline < FILELIST) {
        files[$1]=$0;
    }
    RS="\n";
    FS="[[:space:]]";
    OFS="\t";
}
/[[:digit:]]{6,9}/{  
    print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
}
Вызывать так: gawk --re-interval -f script.awk file.csv

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:41 04-09-2011 | Исправлено: Alukardd, 23:10 04-09-2011
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wget "http://torrent.abook-club.ru/browse.php?page=1" -O -| awk -v ORS=" " "{print( $0 );}">>1.txt
Почему с этой страницы awk не выводит всё в одну строку а с других выводит? Как вывести в одну строку?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
king_stiven
В таком виде как вы дали у меня вообще почти ни чего не пишет. Так думаю то, что надо:
wget "http://torrent.abook-club.ru/browse.php?page=1" -O - | awk -v ORS=" " '{print;}' >> 1.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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:33 04-09-2011 | Исправлено: Alukardd, 23:34 04-09-2011
king_stiven

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

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 23:47 04-09-2011
Alukardd



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

Цитата:
Да, винда у меня.
тяжёлый случай) Так заработало? Мб лучше cygwin поставить?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:49 04-09-2011
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нет, то же самое. Мне кажется дело в символе перевода каретки.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 23:58 04-09-2011
Alukardd



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:24 05-09-2011
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В общем выход с wget В ФАЙЛ даёт в конце строк CR LF а при выводе AWK в файл оставляет CR , который текстовые редакторы воспринимают как конец строкм

----------
Игры зло.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 00:51 05-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");  
> $NF
Что это? $6!
 
> /^.*\t.*\t.*\t.*\t.*\t[0-9]+$/  
> мусье знает толк в извращениях...
Не-не-не. Это вы, мсьё, знаете толк, с вашим «sed -i '/ИТОГО/d;» и пр. фильтрами на невалидные строки, когда, совершенно очевидно, корректно выбирать только валидные.
 
> И кстати всё это свалится в stdout разумеется?
А не перезапишет исходник. :-) Разумеется.
 
> field separator там не табуляция потому что, а пробелы...
digital422 (14:55 04-09-2011)
Цитата:
Разделитель - можно все что угодно, в данном примере табуляция

 
> разделитель должен быть точка с запятой
Табуляция ничем не хуже.
 
> я не смог ваш сценарий выполнить))) Поисковый шаблон не находит таких строк...
Потому что мы, по-видимому, привели контрольный пример к разному виду. Тов. Digital'у могу повторить в третий раз, что надо приводить оригинальные файлы и таким образом, чтобы символы (зд. табуляция) не терялись.

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

 
> gawk --re-interval -f script.awk file.csv
В хэшбанге действительно нельзя указывать несколько ключей (#!/usr/bin/gawk --re-interval -f), поэтому, чтобы сохранить исполняемость скрипта ($ script.awk file.csv), я выше, как видно, вообще отказался от проверки на количество цифр в шестом поле, полагаю, что так лучше.
 
digital422
> как сделать добавление еще одной ячейки, чтобы сохранить ID колонку, чтобы было вот так:
 09:30    1    Ролик1    без. даты 2011    10    123456789      123456789_deti.mp3
 
Очевидно, что так:
 
print ($1, $2, $3, $4, $5, $6, $6 in files ? files[$6] : "E: FILE " $6 " NOT FOUND");
 
, что в свою очередь (как и написал выше т. Алукард) становится эквивалентным
 
print ($0, $6 in files ? files[$6] : "E: FILE " $6 " NOT FOUND");
 
king_stiven
> Мб лучше cygwin поставить?
+1. Это на самом деле удобнее.
 
> выход с wget В ФАЙЛ даёт в конце строк CR LF а при выводе AWK в файл оставляет CR , который текстовые редакторы воспринимают как конец строкм
Правильно. Дефолный RS в Гавке — \n (LF, как вы его назвали). Установите его в виндовый \r\n (awk -v RS="\r\n" blah-blah-blah).

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот пример с нормальным разделителем.
09:30;" ";"Ролик4";"промо";10;123456789
надо получить:
09:30;" ";"Ролик4";"промо";10;123456789;123456789_s_14_sent.mp3
 
Alukardd
Запускаю так: gawk --re-interval -f script.awk file.csv выдает список из file.csv и в конце дописывает "E: FILE  NOT FOUND". Пробовал на файлах с табуляцией и с разделителем ;.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Табуляция ничем не хуже.  
это если там табуляция... Которая часто оказывается пробелами - как у меня вышло, например. И тогда сидим и нервно курим в сторонке от непоняток что не так...
Зачем вы так привязываетесь к своей $6??? Почему не использовать более универсальное $NF?
 
digital422
Ну так мой пример ориентирован как и т. ASE_DAG на табуляцию (пробелы, в моём случае)
Если всё-таки использовать ; , то в мой пример достаточно изменить FS="[[:space:]]"; на FS=";"; и OFS="\t"; на OFS=";";

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

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

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

NOT FOUND23456Ролик4";"промо";10;123456
NOT FOUND23456789Ролик5";"промо2";10;123456789

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
ну хз что там такое... Домой приду вечером - проверю.
Скиньте тогда как вас уже давно просит ASE_DAG файлы примеры, можно не полные, но именно файлы, а не копипаст. Файлопомоек куча в сети.

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://hddfiles.ru/download/8979/
там 2 файла исходников (xls и csv) 2 файла (xls и csv) что должно быть в финале (csv), xls для наглядности и небольшой файл с именами файлов.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AWK выел мне весь мозг, я не понимаю что у него творит print...
print $0, $6; выводит полную хрень, он $6 впихивает в начало, ставит сначала ; до всей строки, затирает начало от $0. Короче полный 3,14здец. Тоже самое если писать вместо $0 полностью $1,$2,$3,$4,$5,$6.
Если добавить к этому полному выводу в начало еще $6, то ровным счетом ни чего не добавится к выводу!!!
 
Дальше хрень с массивом files. print files[123456] вполне себе дает результат но если пытаться получить его через переменную то ни хрена не выйдет!!!
Я просто сижу и туплю в экран.
 
Еще я не понял что произошло когда я перед поисковым шаблоном убрал строку RS="\n" (вроде и так по умолчанию оно) - он вывалил мне все строки!!! И те что должны были отфильтроваться. Что вообще происходит???
 

 
Добавлено:
Это жесть!!!
Все работает!
Изменил формат файла с dos на unix. Все прекрасно пашет...

Код:
#!/usr/bin/gawk -f
BEGIN {
    FILELIST="/home/alukardd/script/8975/base.txt"
    RS=",\n";
    FS="_";
    while (getline < FILELIST) {
        files[$1]=$0;
    }
    RS="\n";
    FS=";";
    OFS=";";
}
/[[:digit:]]{6,9}/{
      print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
}
Если конец строки виндовый всё-таки ставить щас попробую с RS поиграться...
 
Добавлено:
Если оставить format=dos, то тогда в RS надо изменить \n на \r\n
 
p.s. почему только \r\n, а не \n\r я не понимаю, всю жизнь считал что сначала newline, а потом уже carriage return.

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уф, после некоторого мучения у меня тоже заработало, вот с такими строками:
RS=",\n";
RS="\r\n";
Alukardd Большое спасибо за работу от меня и от "радийщиков", теперь время на сборку плей-листа у них будет уходить намного меньше.

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И снова очередная задача.
Есть у меня удаленный роутер на котором периодически исправляю таблицы iptables и бывает что при возникновении ошибки в скрипте iptables теряю к нему доступ, т.к. по умолчанию правила в таблицах стоит DROP. На локальной консоли что-то пишется об ошибке, но понятно что я ее не вижу. Хочу сделать резервную копию скрипта iptables и засунуть его на проверку в cron, чтобы если правила первого скрипта загрузились с ошибкой он через некоторое время запустился и можно было получить удаленный доступ.
 
Первое что приходит в голову, сделать ping до любой локальной станции.

Код:
 
if ping -q -c 2 $HOST; then
echo "HOST OK"
else
script-iptables.sh
fi
 

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:05 07-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> Есть еще более разумные предложения?
«Еще»? ;-)
 
Вообще, в роли ожидаемого сигнала сброса может выступать только вручную установленный флаг (TXT запись на NS-сервере хорошо подходит, например); в особых случаях — невозможность состояние этого флага получить; доверять машине самостоятельно принимать подобные решение никак нельзя.
 
А в вашем случае обычно делают проще. При каждом редактировании цепочек помимо iptables-restore (или iptables, если вы по одному правилу редактируете, что хуже) выполняете еще и запись отложенного задания:
# iptables-restore < iptables.rules.new && at now + 3 minutes <<< '\iptables-restore < /etc/default/iptables'
; имеет смысл вообще переопределить iptables-restore через алиас (именно для этого отложенная команда начинается с экранирующей черты).
А в течение трех минут, если доступ не потерян, т.е. все ОК, просто отменяете сброс:
# atrm 1 # ну или не «1»
 
Странно что вы не нагуглили, задача очень распространенная.
 
P.S. /etc/default/iptables — файл, в которым вами заранее сохранена заведомо рабочая конфигурация. ;-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:36 07-09-2011 | Исправлено: ASE_DAG, 23:42 07-09-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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:59 07-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Э... Извините, не понял.

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 00:16 08-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Вы через at предложили через 3 минуты возвращать все в норму
Да это, вроде-бы, многие так делают, не только я. Можно использовать не шелл + at, а что-нибудь специально для этого написанное, например (не пробовал, первая ссылка в гугле; Digital422, если хотите попробовать: $ hg clone http://infra-iptables.ivans-playground.googlecode.com/hg/ infra-iptables и мэйк+мэйкинсталл).

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попробую перенести правила, относящиеся к ssh в начало скрипта. Есть подозрение в случае ошибки (в основном редактируются FORWARD таблицы) скрипт не доходит до OUTPUT, т.к. после ошибок ping до машины не доходит.
 
Вопрос 2.
Решил почистить базу с файлами, за 10 лет там набралось более 10000 файлов, часть из них уже не надо, часть надо оставить. Чтобы найти файлы по дате хочу вывести их в файл и по нему уже делать удаление.
1 вариант:

Код:
 
ls -lR --full-time $PATH_BASE | awk '{print $6,$9}' | sort -n  
 

все хорошо, но выводятся каталоги, они не нужны.
 
2 вариант:

Код:
 
find $PATH_BASE -type f -exec ls -lR --full-time {} \; | awk '{print $6,$9}'  
 

так выводится полный путь, а надо только имя файла и не сортирует.

Код:
 
find $PATH_BASE -type f -exec ls -lR --full-time {} \; | awk '{print $6,$9}' | sort -n  
 

так вообще ничего не выводит.

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



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

Цитата:
"<\?.*?\?>"  
это еще что за ужас?..
Цитата:
Ключ -regex меня почему-то не слушает или не понимает
find вообще во внутрь не смотрит это ключ тоже для имени...
 
А как вы вообще собрались grep'ать бинарный файл??? В общем могу предложить вам несколько вариантов:
1 - сказать grep'у работать с файлом пытаясь его в ASCII превратить - find /путь/uploads -type f -name '*.jpg' -exec egrep -ai 'pattern' {} \;
2 - глянуть на утилиту hexgrep (ни когда её не видел и не юзал)
3 - если хотите всё-таки искать 16-тиричные данные, то тогда так: find /путь/uploads -type f -name '*.jpg' -exec od -x {} \; | egrep -i '7b'
 
Добавлено:
digital422
Цитата:
Попробую перенести правила, относящиеся к ssh в начало скрипта. Есть подозрение в случае ошибки (в основном редактируются FORWARD таблицы) скрипт не доходит до OUTPUT, т.к. после ошибок ping до машины не доходит.  
что там у вас и как в скрипте я не знаю. Помните только, что порядок правил имеет значение!
 
По второму вопросу - :rofl:
find $PATH_BASE -type f -mtime +90 - выведет все файлы дата модификации которых старше 90дней
 
Что бы ls вывел только файлы надо примерно такое: ls -l ~/ | awk '/^-/{print $NF}'

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:26 08-09-2011 | Исправлено: Alukardd, 15:27 08-09-2011
digital422

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

Код:
 
ls -lR --full-time $PATH_BASE | awk '/^-/{print $6,$9}' | sort -n
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
зачем вам секунды и миллисекунды (--full-time)??? long format у ls и так показывает дату и время модификации, к тому же вы взяли только дату без времени ($6)...
 
ИМХО, если вы потом после сортировки собрались удалять основываясь на дате, так проще сразу отобрать старше чего-то (find -mtime)...

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2005-08-30 rolik-7.avi - мне так достаточно, чтобы понять дату создания. А как сделать чтобы в данном скрипте был виндовый перенос строк?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
надеюсь вы избавились от ненужного вам ключа (--full-time)
ls -lR $PATH_BASE | awk -v ORS="\r\n" '/^-/{print $6,$8}' | sort -n

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:31 08-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Парсить вывод ls — извращение. Читайте в man find описание ключа -printf.
 
> в данном скрипте был виндовый перенос строк?
... awk -v ORS='\r\n' ..., не? А зачем вам это?
 
 
Добавлено:
SergeyKulikov

Цитата:
Задача:
1) В папке uploads найти все файлы с расширением jpg
2) В найденных файлах из пункта 1) найти все вхождения: <? любой код ?>
3) Вывести на экран название файлов с путями, где были найдены вхождения из пункта 2)
 
Вот тут пример, какие вхождения должно находить: http://regexr.com?2uklt
 
Пробовал так:
1) find /путь/uploads -name "*.jpg" | xargs grep -Eoi "<\?.*?\?>"
 
Но я не знаю, как egrep-у дать понять, чтобы он искал не только: <? что-то ?> но также, чтобы искал и:
<?
что-то
?>

 
То-есть я не знаю, как ему передать ключики gs
 
2) find /путь/uploads -name "*.jpg" | xargs perl -pe "m|<\?.*?\?>|gis"
 
В этом примере тоже что-то не так сработало. Ключик -p просто выводит на экран все, где был поиск.
Без ключа -p вообще никогда ничего не выводит :( Очень надеялся на этот способ. Всё-таки напрямую через perl делается поиск.
 
Очень прошу! Помогите решить эту проблему.

 
Ну если отвлечься от того, что вы собрались грепать бинарный файл, то find здесь и не нужен:
$ grep 'pattern' -R ~/uploads/ --include='*.jpg'
 
Теперь о паттерне. <\?.*?\?> — верно, здесь нужна нежадная квантификация, но grep -E ее не умеет, нужен grep -P.
 
А теперь, собственно, объясните, что вам таки нужно, что вам потребовалось грепать жипеги.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
find описание ключа -printf
забываю я вечно об этом printf в любом его представлении...
Цитата:
grep -E ее не умеет
всегда можно обмануть и исключить границы шаблона из жадного шаблона...
Цитата:
Ну если отвлечься от того, что вы собрались грепать бинарный файл
ключил -a всё же добавить стоит иначе совсем печаль...


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

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



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
А вот это, афайк, никак. Нету у ГНУ Грепа опции, переопределяющей RS.
всегда можно сделать через тот же awk. Ну или более по человечески: | tr -d '\n'

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG - спасибо за совет.
find $PATH_BASE -type f -printf "%TY-%Tm-%Td \t %TH:%TM \t\t %f \n" | sort

Цитата:
А зачем вам это?

Человек, который будет делать чистку использует блокнот винды, чтобы txt файл открылся читаемо хочу поставить символы ^M, не спорю-можно открыть и Wordpadом. В любом случае в свою копилку положил этот пример.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
не спорю-можно открыть и Wordpadом
я открою вам глаза, на замечательнейшую программу, даже две - на ваш выбор:
1 - notepad++
2 - gvim - я не мог его обойти

Цитата:
%f \n"
эм... так сразу поставьте в printf \r\n...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:47 08-09-2011
SergeyKulikov



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

Цитата:
Alukardd, это еще что за ужас?..
Это называется регулярные выражения. Можете почитать в Википедии.
Можно было бы вместо <\?.*?\?> написать так: <\?[^>]*\?>
Оба варианта будут делать одно и тоже.
 

Цитата:
Alukardd, а как вы вообще собрались grep'ать бинарный файл???
А какая собственно разница? Я ищу любые вхождения <? что-то ?>
Можете открыть любой jpg файл и прописать в нем в самом конце код <?php echo "что-то"; ?> и этот код не будет бинарным. И именно его мне надо находить.
 

Цитата:
Alukardd, 1 - сказать grep'у работать с файлом пытаясь его в ASCII превратить
Зачем это делать?
 
Alukardd, в Ваших примерах я не понял, где именно происходит многострочный поиск, а именно как было бы с ключём s
 
 

Цитата:
ASE_DAG, но grep -E ее не умеет, нужен grep -P.
к сожалнию в FreeBSD ключ -P не поддерживается. Это указано в man к grep
 

Цитата:
ASE_DAG, а теперь, собственно, объясните, что вам таки нужно, что вам потребовалось грепать жипеги.
Я уже много лет занимаюсь разработкой сайтов и часто мои клиенты пишут, что их сайты взламывают и просят меня почистить сайт от вирусни.
Когда я начинаю делать поиск, то часто нахожу код php шелов в файлах любых расширений.
Пользователь загружает аватарку на сайт, а в аватарке в любом месте картинки прописан php код.
Остаётся лишь подинклюдить эту картинку в исполняемый php файл и можно юзать код из этой картинки. Моя задача находить подобные картинки и удалять их. Файлов на больших сайтах обычно около 200 000 и больше и вручную не очень хочется делать такой поиск.
 
 
 
 
Подобный скрипт можно написать на php и будет отлично работать, вот пример:

Код:
 
<?php
// Открываемый файл.
$file = "test.sql";
 
// Открываем файл в режиме только чтения.
$fopen = fopen ( $file, "r" ) or die ( "Не могу открыть файл" );
 
// Читаем открытый файл.
$fread = fread ( $fopen, filesize ( $file ) );
 
// Закрываем файл
fclose ( $fopen );
 
// Ищем
$result = preg_match_all ( "|<\?.*?\?>|smi", $fread, $result2 );
 
 
 
 
echo "Найдено вхождений: " . $result;
 
echo "\n\n<pre>\n";
print_r ($result2);
echo "</pre>";
?>
 

 
НО у php тоже будет несколько ограничений, например, preg_match_all будет выдавать ошибку, если будет больше 100 000 символов. Для этого надо будет заходить в php.ini и править раздел связанный с PCRE, а также для php надо будет выделять огромное количество оперативной памяти.
Ведь файлы могут весить 2 и более Гб.
 
 

Цитата:
ASE_DAG, а вот это, афайк, никак. Нету у ГНУ Грепа опции, переопределяющей RS.
Это я кажется уже понял
Мне нужна возможность, которую бы давал ключ s
 
 
 
 
 
 
 
Ребята, иногда стоит задача сделать бэкап базы данных MySQL весом 1-2 гб и произвести поиск и замену.

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 20:46 08-09-2011 | Исправлено: SergeyKulikov, 20:56 08-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
Цитата:
Можно было бы вместо <\?.*?\?> написать так: <\?[^>]*\?>
Ни когда не использовал ленивые квантификаторы, поэтому мне знаком только 2-ой вариант. Теперь учту и извращения с ? и +.
 
По поводу многострочности вроде уже все уяснили, что gnu grep такого не могёт... Чем вам его заменить  - я хз. По прежнему как костыль должно работать следующее:
Код:
for file in `find /путь/uploads -type f -name '*.jpg'`; do cat "$file" | tr -d '\r\n' | egrep -qa '<\?[^>]*\?>'; if [ $? -eq 0 ]; then echo "$file"; fi done
Выведет имена файлов в которых найдено совпадение.
Костыли - наше всё.

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:32 08-09-2011 | Исправлено: Alukardd, 21:33 08-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как-то долго разбирать залежи старых файлов руками, надо применить автоматизацию:
find $PATH_BASE -mtime 3650 -exec cp -pv {} $OUT \;
и вот тут снова проблема. База содержит папки с файлами, а скрипт копирует все в одну. Как сделать чтобы файл копировался с его верхней папкой (cp -R начинает копировать от корня-не подходит) ?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
можно извратится и заняться парсингом - что я очень люблю)))
можно проще -
Код:
tar -cf - `find $PATH_BASE -type f -mtime -3650` > /tmp/arch.tar && tar -C $OUT -xf /tmp/arch.tar && rm -f /tmp/arch.tar

Скажите а откуда такое число - 3650? Это 152,08(3)дня...
 
Можно еще чисто tar'ом обойтись...
Код:
tar -cN 2011-08-30 -C $PATH_BASE ./ > /tmp/arch.tar && tar -C $OUT -xf /tmp/arch.tar && rm -f /tmp/arch.tar
тут один косяк есть в том, что пустые каталоги накопирует... Ну и дата указывается в виде прямой даты, а не прошедшем с того момента времени, что не всегда удобно, но как вариант более чем сойдет. Зато без использования find обошлось...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:25 08-09-2011 | Исправлено: Alukardd, 10:31 09-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> <\?.*?\?> написать так: <\?[^>]*\?>
> Оба варианта будут делать одно и тоже.
Ну, далеко не одно и то же. И если речь о PHP-коде, то <\?[^>]*\?> вам никак не подходит, здесь нужна именно нежадная квантификация (ну или отрицание строки), ни то, ни другое egrep не умеет.
 
> к сожалнию в FreeBSD ключ -P не поддерживается
Да, увы. Я, между прочим, не случайно повесил в шапку объявление с просьбой указывать тот факт, что вы желаете обойтись дефолтным функционалом вашей системы, если она — не ГНУ. ;-)
 
Так что, будем использовать Перл.
 
Я, ко всему прочему, не вполне уловил, зачем вам выводить найденные последовательности. Вам же их, судя по описанной задаче, вырезать надо. Это и сделаем. В том, что вы попытались исполнить (perl -pe "m|<\?.*?\?>|gis", а зачем, кстати, игнорировать регистр?), вообще не хватает ключа -n, поэтому он вообще и читать ничего не будет. Однако и корректный (по идее) вариант:
$ perl -npe 's/<\?.*?\?>//gs' file
здесь не сработает (а ХЗ почему, была там какая-то багофича, погуглите, если интересно), поэтому распишем содержание ключей -n и -p:
$ perl -e 'undef $/; $_=<>; s/<\?.*?\?>//gs; print;' file
вот это, как ни парадоксально, работает.
 
Вот так. Для начала можете использовать это и в связке с файндом, но потом лучше отказаться от шелла и переложить рекурсивный обход каталогов тоже на Перл — будет быстрее (возможно даже весьма быстрее). ;-)

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
perl -e 'undef $/; $_=<>; s/<\?.*\?>//gs; print;' 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.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> А что дает $_=<>?
То же, что ключ -n, который в данном случае по неизвестной мне причине не катит.
 
> выглядит покрасивше
Дело не в «красивше», а в:
а) нежадных операторах, которые здесь нужны, ибо <\?[^>]*\?> здесь не подходит;
б) том, что ваше tr -d '\r\n' потенциально портит бинарный файл, можно только найти завирусованные бинарники, но не обрабатывать их.
 
digital422
> $ find $PATH_BASE -mtime 3650 -exec cp -pv {} $OUT \;
> База содержит папки с файлами, а скрипт копирует все в одну. Как сделать чтобы файл копировался с его верхней папкой
У cp есть ключ --parents. You've RTFM, haven't?
А вообще, подход к задаче Таром, что предложил т. Алукард, хорош, используйте его.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:39 09-09-2011 | Исправлено: ASE_DAG, 19:40 09-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
ваше tr -d '\r\n' потенциально портит бинарный файл
ну не мой, а gnu coreutiles, к тому же он работает не с файлом. а со входным потоком данных и испортить ни чего не могёт.
Цитата:
У cp есть ключ --parents. You've RTFM, haven't?
жесть) я его вчера 2 раза прочел Но каждый раз когда читал "use full source file name under DIRECTORY" не расценивал это как то, что требуется в задаче...
 
Добавлено:

Цитата:
То же, что ключ -n
ну я просто не совсем понял что и он делает))) Заставляет тело программы бесконечно крутится? Т.е. организует построчное чтение? Так строки вроде только что убрали... Или только сказали не считать его за разделитель, но читать все равно будет построчно?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:15 09-09-2011
digital422

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

Цитата:
tar -cf - `find $PATH_BASE -type f -mtime -3650` > /tmp/arch.tar && tar -C $OUT -xf /tmp/arch.tar && rm -f /tmp/arch.tar

делает аналогично моему скрипту, копирует (в конечном итоге будет перемещать) файлы со всеми верхними папками от корня, а надо чтобы была только первая папка, в которой лежит файл.
-mtime 3650 - это не 10 лет?
 
Вот так создается структура папок, как во входящей папке:

Код:
 
cd "$PATH_IN"
find ./ -type d | awk '{system ("mkdir -p \"/tmp/test-out/"$0"\"")}'
 

осталось найти файлы из этих папок и скопировать их в /tmp/test-out/"$0"

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:29 09-09-2011 | Исправлено: digital422, 22:20 09-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> он работает не с файлом а со входным потоком данных и испортить ни чего не могёт
Он могет испортить поток данных. ;-) Если вырезать эту бяку задачи стоять не будет, то можно его и покорежить.
То, что я привел, кстати, тоже не с файлом работает (ключа -i там нет).
 
> организует построчное чтение?  
Совершенно верно.  
 
> Или только сказали не считать его за разделитель
Сказали (флагом s) включать \n в . (точку — множество любых символов).
 
Добавлено:
digital422
> -mtime 3650 - это не 10 лет?
Да, примерно (не забываем про високосные года) десять.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
все верно - у меня уже тупняк - я еще раз на 24часа разделил)))
Цитата:
надо чтобы была только первая папка, в которой лежит файл
так первая или в которой непосредственно лежит?
 
Короче, порыл там сям - ни чего путного не нашёл. Либо писать полноценный скрипт либо довольствоваться тем, что есть. Можете еще поизощьраться с опцией tar'а --strip-components, ей можно передать число, например 2, и тогда первая 2 уровня каталогов отстегнуться и не будут создаваться в конечной директории, но как варьировать это число в зависимости от глубины я хз.
 
А зачем вам полная структура? Сами же от неё отказались... Или я последнюю мысль не уловил.

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:08 09-09-2011 | Исправлено: Alukardd, 23:08 09-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> со всеми верхними папками от корня
Ну значит у вас $PATH_BASE задан от корня. А файнд в каком виде путь получил, в таком и выдает. Вы, я смотрю, пошли по правильному пути — сменили текущую директорию, а вот дальше (извините) какая-то ерунда.
 
> а надо чтобы была только первая папка, в которой лежит файл
Более чем странный подход. Может быть, все-таки вам нужно все дерево вниз, начиная с какой-либо директории, а?
Делаете в нее cd, а затем $ find -type f -mtime 3650 cp -pv --parents {} $DEST \; (это если хотите файндом и копи).

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG - то, что надо было !!!
cd "$PATH_IN"
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \;
find -type f -mtime 3650 -exec rm -v -r {} \;
 

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



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

Цитата:
ASE_DAG, Ну, далеко не одно и то же. И если речь о PHP-коде, то <\?[^>]*\?> вам никак не подходит, здесь нужна именно нежадная квантификация

Совершенно одно и тоже
<\?.*?\?>
и
<\?[^>]*\?>
 
 

Цитата:
ASE_DAG, Я, между прочим, не случайно повесил в шапку объявление с просьбой указывать тот факт, что вы желаете обойтись дефолтным функционалом вашей системы, если она — не ГНУ.

Меня не интересует только дефолтный функционал. Для этих целей на машине с FreeBSD был установлен Perl, php и Midnight Commander, на машине с Windows установлены notepad++ и FAR (фаром пользуюсь уже очень давно)
 

Цитата:
ASE_DAG, Я, ко всему прочему, не вполне уловил, зачем вам выводить найденные последовательности. Вам же их, судя по описанной задаче, вырезать надо. Это и сделаем.

Для начала надо найти, а удалить или заменить можно всегда. Если сразу заменять не видя, что именно я заменяю, то можно поудалять очень важные данные.
 
 
Поиск и замену я всегда производил так:
1. perl -pe "s|\s*<script.*?>.*?</script>\s*||gi" old.sql > new.sql
2. perl -pe "s|\s*<script[^>]*>.*?</script>\s*||gi" old.sql > new.sql
оба способа 100% одинаковые.
 
 
 
 
 

Цитата:
ASE_DAG, В том, что вы попытались исполнить (perl -pe "m|<\?.*?\?>|gis", а зачем, кстати, игнорировать регистр?)

Игнорировать регистр надо, например, для того, чтобы найти <script что-то> и <sСrIpT что-то> или <?PHP что-то ?> и <?php что-то ?>
 
 
 
 

Цитата:
ASE_DAG, $ perl -e 'undef $/; $_=<>; s/<\?.*\?>//gs; print;' file  вот это, как ни парадоксально, работает.

Выводит 1 в 1 тоже, что и мой пример с ключём -p
Выводит не найденное, а все строки, в которых производился поиск. В Вашем примере не отменена жадность.
 
 
 
 
 
Пока ни один способ не работает! Мне нужное решение, как вот тут: http://regexr.com?2ule3
Если Вы зайдете по ссылке, то увидите пример файла и как я в нём нашел нужные мне вещи.

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 09:07 10-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \;
find -type f -mtime 3650 -exec rm -v -r {} \;  
честно, вы очень странно объясняете... СПРАВКА: команде find можно передать несколько ключей -exec
Код:
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \; -exec rm -v -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.

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



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

Цитата:
cd "$PATH_IN"
find -type f -mtime 3650 -exec cp -pv --parents {} $PATH_OUT/ \;
find -type f -mtime 3650 -exec rm -v -r {} \;

Зачем вы два раза ищете одно и то же? О_о Файнду можно указывать несколько ключей -exec. А, что, кстати, если копирование завершилось неудачно, о таком варианте не думали? И зачем удалять один файл рекурсивно?
 
$ find -type f -mtime 3650 -exec sh -c 'cp -pv --parents {} $PATH_OUT/ && rm -v {}' \;
 
Да и вообще, даже если сейчас вы перемещаете файл между файловыми системами, все-равно расписывать перемещение как копирование+удаление не стоило.


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

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



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

Цитата:
все-равно расписывать перемещение как копирование+удаление не стоило.  
это кстати да... всегда есть mv.

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:51 10-09-2011 | Исправлено: Alukardd, 14:52 10-09-2011
digital422

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

Цитата:
честно, вы очень странно объясняете...  

Человек индивидуален, у каждого есть недостатки и особенности изложения задач.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> Совершенно одно и тоже :smoke:
> <\?.*?\?> и <\?[^>]*\?>
Ошибаетесь.
 

Код:
<!DOCTYPE html>
<html>
  <head>
   <meta charset="utf-8" />
   <title>Greedy regex vs lazy regex</title>
 </head>
  <body>
  <?php
  echo '<p>Hello World!</p>';
  ?>
  </body>
</html>

 
 
> не интересует только дефолтный функционал
Ну и что тогда ссылаетесь на отсутствие ГНУ Грепа, поставили бы. Но сейчас-то это уже не нужно.
 
> Для начала надо найти
> можно поудалять очень важные данные
Резервное копирование никто не отменял. Но, да это ваше дело.
 
> $ perl -e 'undef $/; $_=<>; s/<\?.*?\?>//gs; print;' file
> Выводит не найденное, а все строки, в которых производился поиск.
А с какого перепуга он будет выводить php-вставки, если его задача — их вырезать. Он их успешно вырезает. Знак вопроса, указывающий на нежадность, конечно, был просто пропущен, исправил. ;-)

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

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



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

Цитата:
ASE_DAG, Ошибаетесь.
Огромное спасибо за этот пример! Я действительно был неправ и всегда не понимал почему оба способа делают одно и тоже. Но теперь понял! Спасибо!!! :beer:
 

Цитата:
ASE_DAG, Резервное копирование никто не отменял. Но, да это ваше дело.

Но я ведь не буду делать поиск и замену по 200 000 файлов и потом искать в каких произошла замена.
Мне лучше найти и вручную удалить. Из этих 200 000 файлов вхождения могут быть найдены, например, в 10-и файлах.
 
 
 

Цитата:
А с какого перепуга он будет выводить php-вставки, если его задача — их вырезать.

Я делал не s///, а m// :shuffle: мне нужно найти, а не заменить.
Попробовал Ваш способ с заменой и у меня на экран вывелось из файла всё, кроме найденных вхождений, причём файл не был изменён. Но мне надо не показывать всё кроме вхождений, а наоборот показывать только найденное и отображать путь к файлу, так как в папке, где я буду производить поиск огромное количество папок и подпапок.
 
А поиск и замену я всегда делал так и отлично работало:
perl -pe "s|<\?.*?\?>||gis" old.sql > new.sql
 
 
Пока же я не знаю, как решить мою проблему! Но за Ваш пример еще раз огромное спасибо!
 
Добавлено:
ASE_DAG, http://regexr.com?2ulfa и http://regexr.com?2ulfd
Если бы Вы мне не показали этот пример, то вот такой кусок кода <?php echo "<p>ст текст текст</p>" ?> всегда оставался бы незамеченным. :jump:

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 16:39 10-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> причём файл не был изменён
Если хотите, чтобы изменялся оригинальный файл, укажите perl'у ключ -i.
 
$ perl -i~ -e 'undef $/; $_=<>; s/<\?.*?\?>//gs; print;' file
— файл file будет перезаписан, а резервная копия сохранена в файле file~.
 
> Огромное спасибо за этот пример!
Всегда пожалуйста. :-)
 
> мне нужно найти, а не заменить
 Да пожалуйста, держите. Ну хоть имя файла еще что-ли выведите, а то что вы потом с этими кусками злокода делать-то станете. ;-)
$ perl -e 'undef $/; $_=<>; @M = m/<\?.*?\?>/gs; $,="\n"; print ($ARGV, @M, "") if @M;' file
 
> http://regexr.com
Надо этот ресурс в шапку что-ли добавить...
 
Добавлено:
> А поиск и замену я всегда делал так и отлично работало:
> perl -pe "s|<\?.*?\?>||gis" old.sql > new.sql
Ну либо у нас разный Перл, либо в SQL-дампах нет перевода строк внутри <? ?>.
 
Да, конструкцию undef $/; $_=<>; (т.е. загрузку всего файла в память), если Перл будет таки вызываться из шелла, вполне можно заменить ключами -0n.
$ perl -0ne '@M = m/<\?.*?\?>/gs; $,="\n"; print ($ARGV, @M, "") if @M;' file
 
В вашем случае, это, кстати, не тождественная замена. -0 — это не undef $/, а $/="\0", а оный нулевой байт в бинарных файлах-то есть и много его есть, лучше undef.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:51 10-09-2011 | Исправлено: ASE_DAG, 18:37 10-09-2011
SergeyKulikov



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

Цитата:
ASE_DAG, Ну либо у нас разный Перл, либо в SQL-дампах нет перевода строк внутри <? ?>.
Вы меня убили
Оказывается мой пример не удаляет, если есть перевод строк. Вы правы в MySQL-дампе нет перевода строк внутри <? ?> и по этому я всегда думал, что это работает.
 
 
 
 
Но почему же оно не работает, ведь ключ s описан в документации perl. Вот, например, http://www.opennet.ru/base/dev/pcre_perl_intro.txt.html

Цитата:
 
   Как правило все эти операторы имеют схожие опции такие как:
 
     * i - не различать строчные и заглавные буквы;
     * m - считать строку многострочной;
     * s - однострочная строка;
     * x   -   расширенный   синтаксис   (   использование   пробелов   и
       комментариев).
 

 
 
Если честно, то мне не понятен код, который Вы пишите. С perl ничего общего не имел, кроме регулярок.
Может можно написать код проще и понятнее, если не использовать командную строку, а написать скрипт в файле и запускать уже готовый файл?
 
 
ASE_DAG, Ваш пример работает отлично
Но когда я пишу такой код на php, то понимаю его, а тут не совсем

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 20:07 10-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> ключ s
Ключ s расширяет диапазон удовлетворяющих точке символов на перевод строки, не более.
$ perl -e '$_ = "A\nB\n"; print if /A.B/'
$
$ perl -e '$_ = "A\nB\n"; print if /A.B/s'
A
B
$

 
> Но почему же оно не работает
Потому, что при ключе -n файл читается в анализируемую переменную $_ построчно.
 
> пример работает отлично :-)
Вот и славно. :-)
 
> а тут не совсем :-(
А что именно не понятно?

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

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

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

Код:
 

Цитата:
 
#!/usr/bin/gawk -f  
 BEGIN {  
     FILELIST="/home/alukardd/script/8975/base.txt"  
     RS=",\n";  
     FS="_";  
     while (getline < FILELIST) {  
         files[$1]=$0;  
     }  
     RS="\n";  
     FS=";";  
     OFS=";";  
 }  
 /[[:digit:]]{6,9}/{  
       print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");  
 }
 

 

 
Поставил xls2csv, чтобы он сразу из xls делал csv, так он каждую ячейку заключил в кавычки и все, скрипт не работает. В каком месте исправить?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
#!/usr/bin/gawk -f  
 BEGIN {  
     FILELIST="/home/alukardd/script/8975/base.txt"  
     RS=",\n";  
     FS="_";  
     while (getline < FILELIST) {  
         files[$1]=$0;  
     }  
     RS="\n";  
     FS=";";  
     OFS=";";  
 }  
 /[[:digit:]]{6,9}/{
       last=gsub(/\"/,"",$NF);
       print ($0, last in files ? files[last] : "E: FILE " last " NOT FOUND");  
 }

 
Не проверял, но как вариант, так должно работать...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:40 12-09-2011 | Исправлено: Alukardd, 23:41 12-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не хочет. в последнем варианте не убирает лишние строки (верхние и ненужные ;;;"ИТОГО";"10";).
xls2csv делает вот так:

Код:
 
"10:10";" ";"ролик";"природа";"30";"123456"
 

Интересно, кто делает неправильные csv, ОО или xls2csv. OO слова без пробелов при экспорте не заключает в кавычки.
Появилась еще одна проблема: программа, которая импортирует конечный csv хочет чтобы первая колонка, в которой указанно время содержалось только в первой строке, остальные строки, где время дублируется были пустыми. Вот так:

Код:
 
"10:10";" ";"ролик";"природа";"30";"123456"
"";" ";"ролик2";"природа2";"10";"123457"
"";" ";"ролик3";"природа3";"20";"123458"
"18:00";" ";"ролик";"природа";"30";"123456"
"";" ";"ролик2";"природа2";"10";"123457"
"";" ";"ролик3";"природа3";"20";"123458"
 


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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
Не хочет. в последнем варианте не убирает лишние строки (верхние и ненужные ;;;"ИТОГО";"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.

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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да понял уже. Я криво написал... И вообще хз зачем их отрабатывать - и так пашет - ему побоку на них:
Код:
#!/usr/bin/gawk -f
BEGIN {
    FILELIST="/home/alukardd/script/8975/base.txt"
    RS=",\r\n";
    FS="_";
    while (getline < FILELIST) {
        files[$1]=$0;
    }
    RS="\r\n";
    FS=";";
    OFS=";";
}
/[[:digit:]]{6,9}/{
      if ($1 == time)
          print ("",$2,$3,$4,$5,$6, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
      else {
          print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
        time = $1;
      }
}
у меня это работает с csv у которого последнее поле(номер) в кавычках... если очень хотите то можете добавить строку gsub(/"/,"",$NF); перед 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:18 13-09-2011 | Исправлено: Alukardd, 12:19 13-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день
Подскажите пожалуйста, может кто сталкивался (понимаю, что не совсем по теме но более подходящую не нашел)
Sed 4.2.1 (и 4.2) при попытке запуска в WinXP, WinXP+MSYS, иногда Win98 строкой вида  
sed -e '/regexp/d' filename.txt  
выдает ошибку  
-e expression #1 char 2: extra characters after command
При этом нормально работает если пробовать запускать тот же скрипт через
1) '-f' (но для .configure не годится)
2) sed -e '\/regexp/d' filename.txt (но вручную править configure и makefile.in перед компиляцией долго и не всегда удобно).  
Это блажь системы или Sed?
Заранее благодарю.
 
 
 

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 12:24 13-09-2011
Alukardd



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:37 13-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
Спасибо за ответ и совет, но, к сожалению, в приведенной ниже последовательности команд это помогает мало (кусок makefile из Wget).

Код:
 
    $(AM_V_GEN)rm -f $@-t $@ && \
    { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
      sed -e 's|@''GUARD_PREFIX''@|GL|g' \
          -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
          -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
          -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
          -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
          -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
          -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
          -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
          -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
          -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
          -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
          -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
          -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
          -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
          -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
          -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
          -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
          < $(srcdir)/fcntl.in.h; \
    } > $@-t && \
    mv $@-t $@
 


Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 13:06 13-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - 3 строчки кода, а сколько времени экономится. У меня тоже работает, отдаю на тестирование.
 
Что надо сделать чтобы добавлять строки и изменять в них значение ?
так есть:

Код:
 
"10:10";"ролик";"природа";"30";"123456"  
"";" ";"ролик2";"природа2";"10";"123457"
 

надо сделать так:

Код:
 
"10:10";" ";"";"";"";""  
"";" ";"ролик";"природа";"30";"123456"  
"";" ";"ролик2";"природа2";"10";"123457"
 

 
И еще одна проблема нарисовалась. При импорте csv в программу запускается механизм поиска локальных файлов в папках и происходит он очень долго. Поэтому файл базы я привел к реальному виду:
h:\sound\rolik1\123122769_rolik1_july-10.mp3

Код:
 
find $PATH_BASE -type f -printf "%p\n" | sed -e 's/\/data\/home\/sound-base\/efir/h:\/sound/g' | sed -e 's/\//\\/g' | sort -n
 

и само собой скрипт не видит этих имен. Подозреваю что надо исправить в FS="_"; ?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Ну еще если вы запускаете это в винде, я не уверен что в качестве разделителя можно использовать прямой слеш (/), тильду (~), двоеточие (:), подчерк (_) и думаю еще кучу всего.


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:34 13-09-2011 | Исправлено: Alukardd, 16:38 13-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
> Win
> sed -e '/regexp/d' filename.txt
А что в виндовом коминтерпретаторе означает одиночная кавычка? Я под Виндой как-то всегда использовал двойные:
 
>sed -e "/regexp/d" filename.txt
 
> makefile
Мэйкфайл же завязан не только на Сед, что вы еще установили? Не проще было взять Цигвин и не мучаться?
 
Alukardd
> ключик-то -e уберите... Он для вызова скрипта

Цитата:
      -e script, --expression=script
 
              add the script to the commands to be executed
 
      -f script-file, --file=script-file
 
              add the contents of script-file to the commands to be executed

Откуда цитата, догадываетесь? ;-)
 
 
> я не уверен что в качестве разделителя можно использовать прямой слеш (/), тильду (~), двоеточие (:), подчерк (_) и думаю еще кучу всего
Почему?

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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:22 13-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Спасибо
ASE_DAG
>А что в виндовом коминтерпретаторе означает одиночная кавычка?
I'm sorry. В cmd.exe не используется одинарная кавычка. Набрал на автомате. С двойной та же беда. (А в bash, который из MSYS, одинарные используются)
 
 >>makefile  
 >Мэйкфайл же завязан не только на Сед, что вы еще установили? Не проще было взять Цигвин и не мучаться?
Когда-то я думал, что поставлю себе MinGW32+MSYS и не буду мучатся... Считал, что MSYS и Cygwin - аналоги. Ошибался?
И самое неприятное  
1) после "sed -i -e "s|-e '\/|-e '\\\/|g" Makefile.in" 90% что заработает ( правда, может еще нужно будет поискать пропущенные.)
2) на ноуте на Viste и XP все работает нормально.
 
Alukardd
Прошу прощения, привычка ремонтника - для диагностики находить минимальное состояние, при котором проявляется ошибка. В одной строке действительно другие разделители использовать можно. А я пытаюсь добится состояния "скачал и собрал" - в смысле, что бы по "tar xvzf program.tar.gz&&cd program&&./configure&&make" получать готовый бинарник.
Кстати, ради интереса проверил - со всеми перечисленными Вами разделителями sed работает правильно.

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 18:53 13-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
> С двойной та же беда.
Без конкретных примеров, скорее всего, ничего более сказать не смогу. Может быть у вас там все регэкспы с циркумфлекса (^) начинаются, например, а я этого не вижу.
 
> что MSYS и Cygwin - аналоги
Безусловно, аналоги.
 
> я пытаюсь добится состояния "скачал и собрал" - в смысле, что бы по "tar xvzf program.tar.gz&&cd program&&./configure&&make" получать готовый бинарник
Поставьте Цигвин и собирайте под него. ;-)

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

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

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
> Без конкретных примеров, скорее всего, ничего более сказать не смогу. Может быть у вас там все регэкспы с циркумфлекса (^) начинаются, например, а я этого не вижу.
Вроде как уже приводил (на пару постов выше)?. Выдает ошибку "-e expression #15 char 2: extra characters after command". Если надо, завтра сброшу лог configure и make -debug от Wget 1.13.3.
Скорее всего буду или Cygwin ставить или MinGW обновлять.
 
Спасибо Вам и Alukardd за участие.
P.S. А кстати, при чем здесь "^"? Сколько помню, он и без двойных кавычек нормально обрабатывается...
 

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 20:43 13-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Данный скрипт берез из файла (/home/alukardd/script/8975/base.txt) значение в виде:
123456789_rolik1_0-10.mp3,
132456789_rolik2_3-15.mp3 и т.д.

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

Как его изменить, чтобы он понимал строки в таком виде:
h:\sound\rolik1\123122769_rolik1_july-10.mp3,
h:\sound\rolik2\123122769_rolik2_july-15.mp3 и т.д.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Да видел я ваш вопрос с первого раза... только вот без дополнительных приблуд я хз как это сделать в awk.
 
Добавлено:
Хотя вот решил:
Код:
    while (getline < FILELIST) {
        var=$0;
        gsub(/.*\\/,"",$1);
        files[$1]=var;
    }
замените тот while что у вас есть на этот...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:30 14-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Целый день сегодня пытался вникнуть в awk, безуспешно ).
Не получается с заменой while, строка выдается (после ID):
"123475796";E: FILE "123475796" NOT FOUND
Файл с базой на месте.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:52 14-09-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.

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://hddfiles.ru/download/9157/

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Все работает... Вы просто изменили конец строки в файле base.txt он у вас стал unix (т.е. \n, а не \r\n)
На всякий случай вот полный скрипт, который я запустил с вашими файлами (путь мой прописан...)
Код:
#!/usr/bin/gawk -f
BEGIN {
    FILELIST="/home/alukardd/script/9175/base.txt"
    RS=",\n";
    FS="_";
    while (getline < FILELIST) {
        var=$0;
        gsub(/.*\\/,"",$1);
        files[$1]=var;
    }
    RS="\n";
    FS=";";
    OFS=";";
}
/[[:digit:]]{6,9}/{
        gsub(/"/,"",$NF);  
      if ($1 == time)
          print ("",$2,$3,$4,$5,$6, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
      else {
          print ($0, $NF in files ? files[$NF] : "E: FILE " $NF " NOT FOUND");
        time = $1;
      }
}


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:18 15-09-2011 | Исправлено: Alukardd, 12:19 15-09-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня тоже частично заработал. Есть проблема, если есть папка, содержащая символ нижнего подчеркивания, например:
v:\sound\brand1_brand1\123456_1111_25-5.mp3,
то путь не подставляется - NOT FOUND.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
ну вы блин... щас придумаю регулярку...
 
Добавлено:
Вот очередной костыль:
    while (getline < FILELIST) {
        var=$0;
        gsub(/.*\\/,"");
        gsub(/_.*/,"");
        files[$0]=var;
    }
 
p.s. может меня к вам на работу возьмут?)
 
В таком случае, кстати, строку FS="_"; можно удалять - она больше не нужна...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 13:42 15-09-2011 | Исправлено: Alukardd, 13:47 15-09-2011
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:47 15-09-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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:52 15-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всю голову себе сломал - не понимаю как выполнить условие (на вложенные if'ы принципиально бить не хочу)
Вот то, что накорябал: if ! [ -n "$OU" -o "$buf" =~ ".txt" ]; then
Написано для bash
 
Условие в теории должно выполнится, когда переменная OU пустая (="") И переменная buf не содержит .txt.
 
При такой записи у меня вообще вываливается ошибка: line 105: [: too many arguments и при этом заходит в тело 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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:42 15-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, Alukardd
А что должно значить/делать  if [ "$buf" =~ ".txt" ] ? У меня выдается ошибка "Ожидается бинарный оператор".  
Вроде как рабочий монстрик if ! [ -n "$OU" ]  && ! echo "$buf" | grep -q "\.txt" ; then

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 21:32 15-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Цитата:
что должно значить
должен искать совпадения.
Всё работает. Я допер разбить на 2 куска тест, но не допер к двум по отдельности НЕТ прилепить, все пытался их как-то объединить. Вы меня на мысль натолкнули!!!) Спасибо.
Вот рабочая строка: if ! [ -n "$OU" ] && ! [[ "$buf" =~ ".txt" ]]; then
Или что бы не отрицать лишний раз, то так: if [ -z "$OU" ] && ! [[ "$buf" =~ ".txt" ]]; then

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:37 15-09-2011 | Исправлено: Alukardd, 21:41 15-09-2011
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
Рад, что смог помочь.
PS Может таки [[ "$buf" =~ "\.txt" ]] (регекспы...)? Или так и надо?
PPS Понял.   if [[ "$buf" =~ ".txt" ]] работает, а if [ "$buf" =~ ".txt" ] выдает ошибку.

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 22:09 15-09-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Цитата:
(регекспы...)?
да вот хз - сам гадал, пока мучил эту строку... Пришёл к выводу что ничего не надо...

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 22:13 15-09-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> (регекспы...)?  
> вот хз - сам гадал

Цитата:
An additional binary operator, =~, is available, with the same precedence as == and !=.  When it is used, the string to the right of  the  operator  is considered  an  extended  regular  expression and matched accordingly (as in regex(3)).
bash(1), раздел «Compound Commands»

 
Да и зачем вам здесь вообще регэксп?
 
[[ !$OU && $buf != *.txt ]] — что может быть проще?


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
та хз) ну по поводу !$OU - я привык пользоваться функциями test. а что до != даже как-то в глову не пришло использовать wildcards (и самое главное что так будет работать)...
Думаю менять уже ни чего не буду, но как вариант спасибо, постараюсь запомнить.

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

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

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

Код:
 
### Чистим папку /make
$FIND $kanal1/make -type f -exec $RM {} \;
 
### После конвертера получаем файл с расширением xls.csv
file_list_kanal1=`$FIND $kanal1 -type f -name "*.xls" -printf "%f\n" | sort`
for a in $file_list_kanal1; do
    if [ -n "$a" ] ;
then
    $XLS2CSV $INPUT_PATH_kanal1/$a -c ";" > "$OUTPUT_PATH_kanal1/$a.csv"
    fi
done
 
### Убираем расширение xls.csv (получаемое от $a)
file_list_kanal1_out=`$FIND $kanal1/make -type f -name "*.xls.csv" -printf "%f\n" | sort`
for b in $file_list_kanal1_out; do
    if [ -n "$b" ] ;
then
    mv $OUTPUT_PATH_kanal1/$b $OUTPUT_PATH_kanal1/${b%%.xls.csv}
    fi
done
 
### Делаем финальный csv файл
file_list_kanal1_out1=`$FIND $kanal1/make -type f -printf "%f\n" | sort`
for c in $file_list_kanal1_out1; do
    if [ -n "$c" ] ;
then
    $GAWK --re-interval -f $CONVERTER $OUTPUT_PATH_kanal1/$c > $OUTPUT_PATH_kanal1/$c.txt
    $ICONV -f UTF-8 -t CP1251 $OUTPUT_PATH_kanal1/$c.txt > $OUTPUT_PATH_kanal1/$c.csv
    $RM $OUTPUT_PATH_kanal1/$c
    $RM $OUTPUT_PATH_kanal1/$c.txt
    fi
done
 
### Делаем отчет об отсутствующих файлах
$RM $PATH_LIST/error.txt
ERROR=$PATH_LIST/error.txt
 
$FIND $kanal1/make/ -type f -name "*.csv" -exec grep "NOT FOUND" {} \; | uniq >> $ERROR
 
echo "Convert OK" ......
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Уверены, что пути будут без пробелов?

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

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

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

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



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


Цитата:
Добрый день.
Для одного скрипта требуется отправка сообщений в твитер, как форма уведомления. Можно ли это реализовать через Bash? или возможно есть отдельная консольная софтинка?
 
Раньше использовался следующий скрипт:
 
curl --basic --user "user:pass" --data-ascii "status=This Twitter update brought to you by curl on the command line" "http://twitter.com/statuses/update.json"
 
а теперь у него проблема с авторизацией, они закрыли обычную авторизацию и что делать дальше я не в курсе, т.к. линуксом не так давно занимаюсь.


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SoftLord
 
Получать почту — очевидно, fetchmail. А дальше есть варианты: либо передавать их какому-нибудь MTA и идти курить по нему маны, либо обойтись без него и вытаскивать аттачи из RAW-потока.
Последнее нисколько не сложно, аттачи же — простое base64 представление.
 
Вот как можно это (загрузить письма и извлечь из них все аттачи) сделать без MTA:
 
$ fetchmail -s --nosyslog --bsmtp - | gawk -v RS='\r\n\\.\r\n' '{print > "message-" NR}'
$ munpack message-*

 
1. Здесь подразумевается, что fetchmail сконфигурен для доступа к нужному аккаунту, т.е. в .fetchmailrc прописано что-то вроде:
poll pop.mail.example.org protocol POP3 user "myusername" there with password "mypassword" nofetchall keep
2. Не понятно, зачем резать поток на отдельные сообщения, хотите сказать? Я тоже не понял почему, но факт, что с цельным bstmp-файлом munpack корректно работать отказывается.
3. munpack обычно поставляется вместе со своим «прямым» коллегой в пакете mpack.
 



Цитата:
Доброго времени суток, уважаемые форумчане!
 
Есть следующая задача: нужно получать e-mail'ы через pop3, вытаскивать из них вложения и складывать в определенную папку. Причем это надо делать в автоматическом режиме по крону на машине под управлением Linux. С помощью какой программы (пакета программ) это можно осуществить?
 
Заранее спасибо.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:32 25-09-2011 | Исправлено: ASE_DAG, 20:45 25-09-2011
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
ASE_DAG
Большое спасибо, камрады! Почерпнул много мудрости
 
Могу, если интересно, поделится нашими костыльками - я так слету скрипты писать не могу, приходится документировать.
Там наверху был совет с nohup - лучше IMHO # disown -a && exit иначе после закрытия терминала процесс грохнется.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 19:55 29-09-2011 | Исправлено: CrownRU, 20:01 29-09-2011
digital422

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

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

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

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

 

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

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

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



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

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

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

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

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

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

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

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



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

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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:17 01-10-2011 | Исправлено: Alukardd, 14:18 01-10-2011
digital422

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

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

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

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

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:55 01-10-2011
digital422

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

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

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

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



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


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

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



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

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

 

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


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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:54 01-10-2011 | Исправлено: Alukardd, 20:56 01-10-2011
ASE_DAG



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

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:30 01-10-2011 | Исправлено: Alukardd, 21:36 01-10-2011
ASE_DAG



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

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

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

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:57 01-10-2011
digital422

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

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

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

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



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

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

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

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



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

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

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



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

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

Угу.

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

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

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

Спасибо.

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



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

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 22:04 02-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> Я понимаю, что это grep и split
Не понимаете :-) Грепом это не реализовать — ему IRS нельзя указывать произвольно.
 
Вот как-то так:
 
$ find -exec 'awk -v RS=\n\n\n\n -v ORS=\n\n\n\n /mypattern/{ print >> myoutput.txt } {}' \;
$ find -exec awk -v RS='\n\n\n\n' '/mypattern/{ print >> "myoutput.txt" }' {} \;
 
Ключи файнду задать по надобности; и ORS — по вкусу.
 
P.S. Примера вы не дали, так что написано «вслепую» и не проверено; могут быть ошибки вплоть до синтаксических.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:19 02-10-2011 | Исправлено: ASE_DAG, 00:30 03-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Thx за оперативность. Пробую, find пишет: "No such file or directory".
 
Пример готов дать. Залил пять типичных файлов: http://zalil.ru/31796981 Ищу слово "Jaybe1310"

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 23:04 02-10-2011 | Исправлено: Frank Fox, 23:05 02-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> Пробую
Что вы пробуете?
 
> find пишет: "No such file or directory"
И больше ничего не пишет?
 
Конкретно в данном случае, это, конечно, придирки, но надо, наверное, уже в шапке красными буквами написать: «не надо давать косвенных описаний ввода и вывода, их надо приводить дословно».
 


> пять типичных файлов
Ага. Ну, во-первых, там параграфы разделены странной последовательностью \r\n\n\r\n (было бы \r\n\r\n\r\n — было бы понятно). А во-вторых, как я и говорил «могут быть ошибки вплоть до синтаксических» — так и есть. ;-)
 
$ find -exec awk -v RS='\r\n\n\r\n' '/Jaybe1310/{ print >> "myoutput.txt" }' {} \;

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:13 03-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
root@vm7002:~/FindTest# find -exec awk -v RS='\r\n\n\r\n' '/Jaybe1310/{ print >> "myoutput.txt" }' {} \;
awk: read error (Is a directory)
 
Команда отрабатывает, но что за ошибки чтения?  
Про не сидеть под root'ом я знаю =)
 
Big thx.  

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 00:16 03-10-2011 | Исправлено: Frank Fox, 00:27 03-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
И? Все, как я вижу, отработало корректно. См. что у вас в myoutput.txt.
 
А awk: read error (Is a directory) — это вы файнд ничем не ограничили, он первое что выдал — была . (текущая директория). Я же написал: «ключи файнду задать по надобности». Если нужны все файлы из иерархии текущей директории, то -type f укажите.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:27 03-10-2011 | Исправлено: ASE_DAG, 00:27 03-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А как  теперь сделать, что бы он делил этот файл на части по, скажем, сто абзацев?

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 20:20 04-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> на части по, скажем, сто абзацев?
Сразу или можно после?
 
Если после, то:
$ awk -v RS='\r\n\n\r\n' -v i=0 '{ print > "myouput." i }  0==NR%100{ i++ }' myoutput.txt
 
Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:34 04-10-2011 | Исправлено: ASE_DAG, 20:35 04-10-2011
lilitaibolit

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите решить такую задачу:
есть n интерфейсов, которые получают адрес, маску, шлюз и днс по дхцп.
надо:
- потушить все интерфейсы

Код:
#!/bin/sh
ifconfig n1 down
ifconfig n2 down

- по-очереди включить каждый и для верности запустить получение адреса по дхцп

Цитата:
ifconfig n1 up
dhclient n1

- парсить вывод netstat -rn на предмет дефолтного шлюза

Код:
 netstat -rn | grep default
default            1.1.1.1     UGS       12 73504426     -     8 fxp1
 

- или, если система смогла получить два значения параметра default, то парсим эти два адреса            

Код:
netstat -rn | grep default
default            1.1.1.1     UGS       11 73406860     -     8 fxp1
default            2.2.2.2     UGS       11 73406860     -     8 fxp2

- если не смогла получить два шлюза, то выключаем n1, включаем n2 и находим значение другого шлюза

Цитата:
ifconfig n1 down
ifconfig n2 up
dhclient n2
netstat -rn | grep default
default            2.2.2.2     UGS       11 73406860     -     8 fxp2

- смотрим файл и вносим значение шлюза1 в первую попавшуюся строку $ext_gw1 = "сюда",
а шлюза2 в строку $ext_gw2 = ""

Цитата:
cat /etc/pf.conf | grep ext_gw1
ext_gw1 = "3.3.3.3"
 

- заносим значение любого из найденных шлюзов в файлик

Код:
echo '1.1.1.1' > /etc/mygate

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

Цитата:
pfctl -f /etc/pf.conf

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

Всего записей: 15 | Зарегистр. 30-11-2009 | Отправлено: 00:04 05-10-2011
Frank Fox



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
На небольших файлах отрабатывает адекватно.  
На больших (около 300 мегабайт) очень долго грузит процессор и винт, но создания самих файлов дождаться не получалось.  
 
А если сразу, а не после, то как?

Всего записей: 18 | Зарегистр. 13-08-2007 | Отправлено: 12:43 05-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Frank Fox
> А если сразу, а не после, то как?
А у вас там вообще, я смотрю, все разбираемые файлы в одной директории, так? И так всегда будет? Их вообще сколько? Если в одной и если их счетное количество (ну, до пары сотен), то файнд здесь вообще и не нужен — обходимся одним процессом:
 
$ awk -v RS='\r\n\n\r\n' -v i=0 -v j=0 '/Jaybe1310/{ print >> "myoutput." i; j++ } 0==j%100{ i++ }' *.txt
 
маску (*.txt) задать по надобности; i (т.е. номер после имени файла) здесь будет номером параграфа во входном потоке, если не хотите сбивать лексикографическую сортировку выходных файлов, то:
$ awk -v RS='\r\n\n\r\n' -v i=0 -v j=0 '/Jaybe1310/{ print >> "myoutput." sprintf("%04d", i); j++ } 0==j%100{ i++ }' *.txt
, 04 можно, понятное дело, и увеличить.
 
Комментарии нужны?

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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попрошу тоже помощи уважаемых аксакалов
Дано:
Две дирректории - "источник" и "цель". Дирректория "цель" должна быть синхронизована с "источник". Причем файлы в "цель" не должны быть просто перезаписаны - файлы, подлежащие замене, должны быть перенесены в дирректорию, которую мы задаем в командной строке скрипта, например Ch67483 и за tarz-ены. При необходимости, при помощи соответствующего ключа, должна быть возможность откатить изменение назад. Может есть уже у кого такой скрипт?
 
Парочка заготовок:
Так я гоняю файлы по сети:
Код:
# rsync --partial --progress --rsh=ssh  $source $user@$host:$destination

Так можно перекинуть определенные файлы, если их много, нет МНОГО:
Код:
# tar cpfP - $(find <somedir> -type f -name *.php) | ssh user@host | tar xpfP -

Так можно копировать файлы если машины не видят друг друга - в обход:
Код:
# ssh root@host1source "cd /somedir/tocopy/ && tar -cf - ." | ssh root@host2destination "cd /samedir/tocopyto/ && tar -xf -"

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:50 06-10-2011 | Исправлено: CrownRU, 10:58 06-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lilitaibolit
Вы бы всё-таки сами скрипт бы написали, а непонятные моменты мы бы вам прояснили, а то писать за вас с нуля, да еще и не имея возможности протестировать (шлюз у меня лично один) совсем нет желания.
 
CrownRU
Я сам тоже не внимательный и это с завидной периодичностью мне показывает т.ASE_DAG
Но на этот раз я вам покажу
Цитата:
Читаю мануалы — 10$
Читаю мануалы с акцентом и ударениями — 50$
man rsync
Цитата:
-b, --backup
              With  this option, preexisting destination files are renamed as each file is transferred or deleted.  You can control where the backup file
              goes and what (if any) suffix gets appended using the --backup-dir and --suffix options.
 
              Note that if you don’t specify --backup-dir, (1) the --omit-dir-times option will be implied, and (2) if --delete is also in effect  (with&#8208;
              out  --delete-excluded),  rsync will add a "protect" filter-rule for the backup suffix to the end of all your existing excludes (e.g. -f "P
              *~").  This will prevent previously backed-up files from being deleted.  Note that if you are supplying your own filter rules, you may need
              to  manually  insert  your  own  exclude/protect rule somewhere higher up in the list so that it has a high enough priority to be effective
              (e.g., if your rules specify a trailing inclusion/exclusion of ’*’, the auto-added rule would never be reached).
 
       --backup-dir=DIR
              In combination with the --backup option, this tells rsync to store all backups in the specified directory on the receiving side.  This  can
              be  used for incremental backups.  You can additionally specify a backup suffix using the --suffix option (otherwise the files backed up in
              the specified directory will keep their original filenames).
 
       --suffix=SUFFIX
              This option allows you to override the default backup suffix used with the --backup (-b) option. The default suffix is a ~ if no  --backup-
              dir was specified, otherwise it is an empty string.


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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то не могу разобраться с uniq. Все тот же csv:

Код:
 
"09:38";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
"";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
"";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
 

надо удалить строки, где идет совпадения по ID номеру, делаю
cat $NAME | sort -u
строка
"09:38";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3
остается, т.к. она отличается от нижних.
Как сделать uniq по 6 ячейке ?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Для этого надо, очевидно, либо сортировать по шестой ячейке, либо держать всю шестую колонку в памяти. Файл, как я помню, вполне конечный, так что последнее проблемы не составляет:
$ awk -v FS=';' '!a[$6]++' "$NAME"

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

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

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

Код:
 
if ping -q -c 2 $HOST; then
echo "ping OK"
else
echo "ping Bad"
/script2.sh
fi
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> Работает )  
Удивлены? :-)
 
> cкрипт срабатывает каждую минуту, если в течении 5 мин. результат одинаковый-запускаем скрипт2
Если временные интервалы нестрогие, то:

Код:
#!/bin/bash
HOST='example.org'
while :; do
    if ping -qc 2 "$HOST"; then
        echo >&2 "ping $HOST: OK"
        ((C=0))
    else
        echo >&2 "ping $HOST: FAIL"
        ((C++))
        ((C >= 5)) && hostisunreachable.sh
    fi
    sleep 1m
done

 
Комментарии нужны?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:40 07-10-2011 | Исправлено: ASE_DAG, 17:45 07-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Комментарии нужны?
Разумеется! Ппц, сколько тут можно узнать пока читаешь ваши скрипты))) т.е. (( )) заменяет let?

Цитата:
Удивлены?  
И етому удивлён) Не думал что конструкция !var++ сработает как if not exist var then var=0; var++...

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> т.е. (( )) заменяет let?

Цитата:
      ((expression))
              The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION.  If the value of the expression is non-zero, the return
              status is 0; otherwise the return status is 1.  This is exactly equivalent to let "expression".

 
 
> Не думал что конструкция !var++ сработает как if not exist var then var=0; var++...
А это и не так.
Если расписать '!a[$6]++' будет что-то такое:
'{ if (a[$6] == 0) print $0; a[$6]++ }'.

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

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



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

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:29 07-10-2011
digital422

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

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



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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:23 07-10-2011
digital422

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

Код:
 
#!/bin/bash
aa=`cat /tmp/counter`
counter=`expr $aa + 1`
 
if fping $HOST; then
        echo >&2 "$HOST is alive"
    else
        echo >&2 "$HOST is unreachable"
        echo $counter > /tmp/counter
        echo $counter
    fi
 
if [ "$aa" = "5" ]; then
        echo "$aa"
        echo "remove /tmp/counter"
        rm /tmp/counter
        script-ppp.sh
    else
        echo "$aa"
    fi
exit
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
Этот скрипт висит в процессах, что не совсем хорошо, и с каждой новой минутой появляется новый процесс не убивая старый.  
вы что скрипт т.ASE_DAG в крон засунули?) Он самостоятельный!!! Сам крутится, сам минуты мерит))) Его просто запустить надо... Если хотите в фон убрать, то так ./script.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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:00 08-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, в крон ). А то я смотрю он плодится начал.
Если он как самостоятельный процесс, то можно его и демоном сделать через start-stop-daemon с соответствующим контролем.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 15:02 08-10-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.

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - вопрос возник по поводу последнего скрипта с 23 страницы (с mencoder). Хотел туда сам добавить строки, не получается, не дается gawk.
Надо после строки COMMAND вставить еще одну переменную (параметры будут указанны после BEGIN ) и в конце строки без символа ^ такую же переменную, соотв. та последняя строчка, которая сейчас без символа ^ становится в конце с символом, а переменная (последняя строка блока) без символа. Можно это сделать одной строкой или все переделывать?
Пример:

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Граждане добрый день!
Подскажите как можно проверить все файлы которые пользователь будет заливать на сервер ?
Сейчас у меня ситуация когда наёмный человек будет проводить работы на сервере, как можно продублировать весь софт который он будет заливать через pscp ? И можно ли сразу прицепить логгирование всех его действий ?

Всего записей: 319 | Зарегистр. 03-10-2006 | Отправлено: 15:29 09-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Могу порекомендовать пакет incron - при любых действиях с файловой системой (запись,изменение, удаление и т.д.) он может запустить скрипт, например поиск новых фйлов через тот же find с записью с файл, помеченный датой. Дублировать софт - лучше rsync вряд ли кто сделает лучше. Что имеется ввиду под проверкой файлов, если проверить целостность при копировании по каналу связи - надо на передающей стороне делать контрольные суммы файлов, перемещать их на сервер и уже сервер будет проверять файлы по этим значениям.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 16:46 09-10-2011 | Исправлено: digital422, 16:50 09-10-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sterh84
Не совсем понимаю задачи.
Надо просто найти все файлы, что будут загружены вашим «наемником»? Что может быть проще чем
$ find /var/www -user ivanov
 
> И можно ли сразу прицепить логгирование всех его действий?
Суть SSH в том, что все действия после собственно логина неотличимы от локальных. Т. о. образом никакого особого логирования, как для FTP, NFS или Самбы здесь не настроить. Однако применимы методы мониторинга локальной ФС — auditd или тот же inotify (incron, iwatch).
 
А вообще, может быть лучше воспользоваться специально предназначенным для обмена файлами SFTP, а не прибедняться с SCP?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:39 09-10-2011 | Исправлено: ASE_DAG, 20:09 09-10-2011
Sterh84

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я хочу удостовериться что на сервер не будет залито никаких подозрительных программ. Человек должен залить файлы которые будут обслуживать веб-сервис. Я хочу сделать локальные копии файлов которые он залил. Те залил он по scp тар файл в свою хоум диресторию, а SSH сервер или некий скрипт положил его копию в мою директорию.
я так понимаю что это можно настроить на основе incron, как только создали новый файл он выполнил скрипт

Всего записей: 319 | Зарегистр. 03-10-2006 | Отправлено: 12:06 10-10-2011 | Исправлено: Sterh84, 12:07 10-10-2011
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd - а куда пропадает первая строка, скрипт вставляет текст со 2 строки? (скрипт по mencoder).
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 16:31 20-10-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.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:49 20-10-2011
digital422

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

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

 
Вашим скриптом он приводится к виду:
rem 09:38
"e:\mencoder.exe" -forceidx -ovc copy -oac copy -o c:\path\name-09-38.mp3 ^    
c:\path\123456789-01.mp3 ^    
c:\path\123456789-02.mp3
rem 11:58
"e:\mencoder.exe" -forceidx -ovc copy -oac copy -o c:\path\name-11-58.mp3 ^    
и т.д.
 

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

 
1. Начал сегодня им заниматься, на выходе теряется первая строчка, в которой в первом столбце указанно время.
2. Можно ли после строки COMMAND вставить еще одну переменную (параметры будут указанны после BEGIN ) и в конце строки без символа ^ (перед rem XX:XX )такую же переменную, соотв. та последняя строчка, которая сейчас без символа ^ становится в конце с символом ^, а переменная (последняя строка блока) без символа. Пример:

Код:
 
rem 09:38  
"e:\mencoder.exe" -forceidx -ovc copy -oac copy -o c:\path\name-09-38.mp3 ^    
$COMMAND2 ^  
c:\path\123456789-01.mp3 ^    
c:\path\123456789-02.mp3  ^  
$COMMAND2
rem 11:58
 

 
P.S. Лёне привет передам (так зовут моего боса).

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:59 20-10-2011 | Исправлено: digital422, 08:48 21-10-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
так зовут моего боса
/dev/random рулит)
Цитата:
 теряется первая строчка
хз у меня ни чего не теряется... Мб там символ переноса строки другой закрался?
Я понял где косяк - у вас первая строка пустая, скрипт это не обрабатывает, уберите её руками, т.к. скрипт завязан на первой строке...
Цитата:
2.

Код:
#!/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:]]/) {  
        gsub(/\"/,"",$1);
        NM=$1;
        gsub(/:/,"-",NM);
        gsub(/\\.*/,"",$NF);
        if (NR == 1) {
            print "rem "$1,COMMAND$NF"\\name-"NM" ^";
        } else {
            print s"^",COMMAND2,"rem "$1,COMMAND$NF"\\name-"NM" ^";
        }
        i=1;
    } else {
        if (i == 1) {
            i=0;
        } else {
           print s" ^";
        }
        s=$NF;
  };  
}  
END {
    print $NF"^",COMMAND2;
}
оно?

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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:57 20-10-2011 | Исправлено: Alukardd, 21:00 20-10-2011
digital422

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

Код:
 
"09:38";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3  
  ;" ";"text";"text";"15";123456789;c:\path\123456789-02.mp3  
 

Так сделать:

Код:
 
"09:38";" ";"";"";"";"";""
"";" ";"text";"text";"5";123456789;c:\path\123456789-01.mp3  
  ;" ";"text";"text";"15";123456789;c:\path\123456789-02.mp3  
 

По п.2. в конце блока Command2 вставляется, в начале не хочет.
 
так, вроде получилось:

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Про вначале проморгал)))
По поводу времени и первой строки - У МЕНЯ РАБОТАЕТ КОРРЕКТНО. (если дело дойдёт до драки могу скринкаст записать...)
 
Добавлено:
У меня последний рабочий вариант выглядит так:
Код:
#!/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:]]/) {  
        gsub(/\"/,"",$1);
        NM=$1;
        gsub(/:/,"-",NM);
        gsub(/\\.*/,"",$NF);
        if (NR == 1) {
            print "rem "$1,COMMAND$NF"\\name-"NM" ^",COMMAND2"^";
        } else {
            print s"^",COMMAND2,"rem "$1,COMMAND$NF"\\name-"NM" ^",COMMAND2"^";
        }
        i=1;
    } else {
        if (i == 1) {
            i=0;
        } else {
           print s" ^";
        }
        s=$NF;
  };  
}  
END {
    print $NF"^",COMMAND2;
}


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:23 20-10-2011 | Исправлено: Alukardd, 23:50 20-10-2011
digital422

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

Код:
 
rem 09:38
"e:\mencoder\mencoder.exe" ......-o path\09-38.mp3^
some command ^
c:\path\123456789-01.mp3 ^
c:\path\123456789-02.mp3 ^
c:\path\123456789-03.mp3 ^
c:\path\123456789-04.mp3 ^
some command
 

тогда странно, что у меня вот так (с последним вариантом):

Код:
 
rem 09:38
"e:\mencoder\mencoder.exe" ...... -o path\09-38.mp3^
some command ^
c:\path\123456789-02.mp3 ^
c:\path\123456789-03.mp3 ^
c:\path\123456789-04.mp3 ^
some command
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Ок, попзжа проверю - мб и глотается, я не так до этого вас понял, выкладывайте всегда с примерами, пожалуйста.
Действительно первая запись не учитывается. Будем минутка свободная - поправлю.
 
Добавлено:
Проверяй
Код:
#!/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 {
            print s"^",COMMAND2,"rem "$1,COMMAND$NF"\\name-"NM" ^",COMMAND2"^",LN"^";
        }
        i=1;
    } else {
        if (i == 1) {
            i=0;
        } else {
           print s" ^";
        }
        s=$NF;
  };  
}  
END {
    print $NF"^",COMMAND2;
}


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 08:56 21-10-2011 | Исправлено: Alukardd, 09:00 21-10-2011
digital422

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

Код:
 
"00:01";" ";"text";"text";"5";123456789;c:\path\file-01.mp3
"";" ";"text";"text";"5";123456789;c:\path\file-02.mp3
"00:02";" ";"text";"text";"5";123456789;c:\path\file-03.mp3
"00:03";" ";"text";"text";"5";123456789;c:\path\file-04.mp3
"";" ";"text";"text";"5";123456789;c:\path\file-05.mp3
 

На выходе скрипта почему-то вставляется строка из предыдущего блока.

Код:
 
rem 00:01
"e:\mencoder\... -o "c:\render\file-00-01.avi" ^
some command ^
c:\path\file-01.mp3 ^
c:\path\file-02.mp3 ^
some command
rem 00:02
"e:\mencoder\... -o "c:\render\file-00-02.avi ^
some command ^
c:\path\file-03.mp3 ^
c:\path\file-02.mp3 ^
some command
rem 00:03
"e:\mencoder\... -o "c:\render\file-00-03.avi ^
some command ^
c:\path\file-04.mp3 ^
c:\path\file-05.mp3 ^
some command
 

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
оО
через часик-полтора освобожусь - протестирую...
 
Добавлено:
Так вроде исправил
Код:
#!/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;
}


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

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:22 21-10-2011
Открыть новую тему     Написать ответ в эту тему

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