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

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

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

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

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

digital422

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


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

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

 

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

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



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
У меня urxvt и screen'ом, и да, действительно они ни чего не ломают.  Пошёл по всей цепочке и понял что ломается всё в последний момент — в vim'е expandtab отрабатывает и на вставляемый из буфера текст...

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то у меня тупняк с sed'ом.
Нужно удалить из файла все строки содержащие паттерн и добавить в конец новую строку.
Код:
sed '/restart/d; $ a restart 1/7' /some/file
Данное выражение не работает как надо. Оно даёт сбой если последняя строка файла подходит под шаблон удаления. Хочется понять как это сделать именно sed'ом.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:12 06-08-2016 | Исправлено: Alukardd, 13:14 06-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> Хочется понять как это сделать именно sed'ом.
 
Боюсь спросить, но нафига?  Тем не менее, очевидно, что переставить выражения в программе:
 
$ sed -e '$abar' -e '/foo/d'
 


#

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Хм, это удивительно. Я честно полагал что если сначада произведу добавление новой строки, то при удалении строк, моя только что добавленная строка так же будет удалена... Почему же этого не происходит?
 
p.s. sed'ом потому что можно одной командой изменить множество файлов in-place.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
 
> sed'ом потому что можно одной командой изменить множество файлов in-place
 
ORLY?  Вы ничего не путаете? sed’ом невозможно изменять файлы in-place, вообще. И более того, он вовсе не работает в файлами, это (как прямо следует из названия — stream editor) поточный редактор.
 
Братский ему файловый редактор, как нетрудно догадаться, называется ed’ом.
 

$ ed -s "$file" << 'EOF'
,g/foo/d
$a
bar
.
wq
EOF

 
> Я честно полагал что если сначада произведу добавление новой строки, то при удалении строк, моя только что добавленная строка так же будет удалена. Почему же этого не происходит?
 
Именно по вышеописанной причине: sed не работает с файлом, он работает с потоком, а во входной поток взять и добавить строку просто нельзя.  А вот поменяй вы выражения в программе на ed’е (или любом другом полноценном файловом редакторе) — так бы и было.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Да нет, ни чего не путаю.
GNU Sed
 -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)

 
И самая прелесть данного ключа что я могу писать так
Код:
sed -i -e '$ a restart 1/7' -e '/restart/d' /some/file /some/file2 /some/file3

 
p.s. собственно это прямой аналог Perl'ового ключа -i (aka variable $^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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:04 07-08-2016 | Исправлено: Alukardd, 14:07 07-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd>> Да нет, ни чего не путаю.
> GNU Sed
> -i[SUFFIX], --in-place[=SUFFIX]
>                edit files in place (makes backup if SUFFIX supplied)
 
Да нет, путаете.  Это не более чем sed < file > tmp && mv -f tmp file со всеми вытекающими.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
 Да нет, путаете.  Это не более чем sed < file > tmp && mv -f tmp file со всеми вытекающими.
эм, ну а мне какая разница что он его перемещает? Ну да, меняется inode, т.е. по сути это новый файл.
Честного in-place я вообще не знаю. Кроме как у текстовых редакторов. Для таких утилит как sed, менять файл in-place это дорогое удовольствие, т.к. придётся либо хранить много текста в памяти, либо заниматься двойным переписывнием информации.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:44 07-08-2016 | Исправлено: Alukardd, 14:46 07-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> эм, ну а мне какая разница что он его перемещает?
 
Откуда мне знать, есть вам разница, редактируется файл или заменятся на другой, или нет?  Просто надо понимать, что sed файлы не редактирует.
 
> Честного in-place я вообще не знаю. Кроме как у текстовых редакторов.
 
Ну так вам и нужен текстовый редактор файлов — вы же именно текстовые файлы редактируете.  И выше уже даже посоветовал, какой, и написал, как им пользоваться.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
ed ещё и ставить надо и, на сколько я знаю, он только по одному файлу умеет обрабатывать, т.е. его в цикл придётся заворачивать.
Можно и vim'ом всё сделать и сразу для нескльких файлов
Код:
vim '+bufdo g/bad/d | w' '+bufdo $s/$/\new rbad line/ | w' +qa /tmp/file_test /tmp/file_test2


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:47 07-08-2016 | Исправлено: Alukardd, 21:48 07-08-2016
stupom



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как в потоке/файле найти "пару байт"? Средствами sh найти смещение от начала, допустим два бипа '\a\a'.
 
Спасибо

Всего записей: 182 | Зарегистр. 04-07-2015 | Отправлено: 04:49 15-08-2016 | Исправлено: stupom, 04:51 15-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stupom> Как в потоке/файле найти "пару байт"? Средствами sh найти смещение от начала, допустим два бипа '\a\a'.  
 
Втупую, не?
 

#!/bin/bash
 
while read -r -N 1; do
    (( c++ ))
    case "$REPLY" in
        $'\a')
            (( ++i == 2 )) \
                && printf '%d\n' $(( c - 2 ))
            ;;
        *)
            (( i = 0 ))
            ;;
    esac
done

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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 05:59 15-08-2016 | Исправлено: ASE_DAG, 06:01 15-08-2016
stupom



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

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

Изначально, задача была разобрать HTML-форму обратной связи для пересылки enctype="multipart/form-data". Как пропускать через sed я не понимаю, там есть две проблемы - (1) конец строки и (2) файлы м.б. бинарными. От этого и получилось, что проще было бы найти адрес разделителя заголовка и boundary,  а далее просто скопировать кусок файла утилитой dd. Сейчас это сделано с использованием grep, но как-то всё колхозно получается. Вот и возник вопрос, есть ли утилиты типа grep/sed/awk но ориентированные на работу с байтами.
 

Всего записей: 182 | Зарегистр. 04-07-2015 | Отправлено: 01:27 16-08-2016 | Исправлено: stupom, 13:33 31-10-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stupom> спасибо, думал есть ли что проще.
 
Куда уж проще??  Повторюсь — это настолько простой алгоритм, что его на Си переписать можно почти слово в слово.
 
> Изначально, задача была разобрать HTML-форму enctype="multipart/form-data"
 
ОМГ.  Ознакомьтесь с http://mywiki.wooledge.org/XyProblem и опишите настоящую задачу (разобрать форму — это не она) целиком на конкретном примере.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:45 16-08-2016 | Исправлено: ASE_DAG, 03:46 16-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа аксакалы, помогите написать скриптик в (лучше)bash или zsh(тоже пойдет). Не соображаю уже
Есть куча директорий со следующей структурой:
 
Я в zsh сейчас, поэтому не удивляйтесь синтаксису
 

Код:
 
/archive/obj/bastore # ls */
F/:
FQP_RA/  FSP_BA_YA/  FSP_YE/  ZGP_BA_F/  exchange/
 
N/:
NQP_RA_DBARCH/  NSP_BA_AU/  NSP_BA_YA/  NSP_BA_YX/  NSP_F3/  NSP_MDP/  NSP_Y/  NSP_YD/  ZGP_BA_N/
 

 
Под каждой директорией находится вот это:

Код:
 
/archive/obj/bastore # ls N/NSP_F3/
Backup/  active/  bin/  config/  failed/  import/  log/  system/

 
В каждой директории находятся файлы с конфигурацией:
 
Пример:

Код:
/archive/obj/bastore # ls F/*/config/*.xml
F/FQP_RA/config/F_FQP_RA.xml*  F/FSP_BA_YA/config/F_FSP_BA_YA.xml*  F/FSP_YE/config/F_FSP_YE.xml*  F/ZGP_BA_F/config/F_ZGP_BA_F.xml*

 
Каждая директория - это инстанция, которая ловит файловый поток и перенаправляет на другой сервер или архив или еще куда.  
Столкнулся с проблемкой. Иногда эти инстанции виснут и тогда файлы не перенаправляются дальше, а сливаются в директорию failed, например:
 

Код:
/archive/obj/bastore/N/NSP_F3/failed/

 
Тогда надо остановить инстанцию, переместить файлы из /failed директории в importPath директорию, прописанную в файле конфигурации:

Код:
/archive/obj/bastore/N/NSP_F3/config/N_NSP_F3.xml
 
и стартануть инстанцию заново.
 
Я тут начал химичить:
 

Код:
/archive/obj/bastore/N # awk -F'[<>]' '/placeholder name = "importPath"/ && !/Change/ && !/\$\{/ { print $3 }' /archive/obj/bastore/*/*/config/*.xml
/DTASAP/NSP/050/INPUT/DMS/AOKHB/egk
/DTASAP/NSP/050/INPUT/DMS/AOKHB/BPRU
/archive/obj/bastore/F/ZGP_BA_F/import/index
/DTASAP/NSP/050/INPUT/DMS/AOKHB/AU
/DTASAP/NSP/050/INPUT/DMS/AOKNDS/egk
/DTASAP/NSP/050/INPUT/DMS/AOKHB/MDK/
/DTASAP/NSP/050/INPUT/DMS/AOKNDS/AU/
/DTASAP/NSP/050/INPUT/DMS/AOKNDS/MDP/
/DTASAP/NSP/050/INPUT/DMS/AOKNDS/MDK/
/DTASAP/NSP/050/INPUT/DMS/AOKNDS/BPRU
/archive/obj/bastore/N/ZGP_BA_N/import/index
 

 
Вот кусок из конфига:
...
    <placeholder name = "basePath">/archive/obj/bastore/N/NSP_F3</placeholder>
    <placeholder name = "importPath">/DTASAP/NSP/050/INPUT/DMS/AOKNDS/AU/</placeholder>
 
    <!--
    Spell:
    <placeholder name = "basePath">/usr/projects/p0193_AOK_NDS_AU</placeholder>
    <placeholder name = "importPath">${basePath}/index</placeholder>
    -->
    <placeholder name = "activePath">${basePath}/active</placeholder>
...

 
Останавливается и запускается инстанция соответствующим скриптом:
 

Код:
/archive/obj/bastore/N/NSP_F3/bin/N_NSP_F3.sh stop|start

 
Хотелось бы автоматизировать это дело через cron. Проводится проверка:
1. Сканировать директории /failed и если в них что-то есть, то
2. Остановить инстанцию
Код:
/archive/obj/bastore/N/NSP_F3/bin/N_NSP_F3.sh stop

3. Стереть содержимое директории /archive/obj/bastore/N/NSP_F3/system  
4. Переписать файлы в importPath директорию.  
5. А после этого уже стартануть инстанцию
Код:
/archive/obj/bastore/N/NSP_F3/bin/N_NSP_F3.sh start

 
Извините за многословие, постарался описать как можно подробнее.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:34 23-08-2016
arto

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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
Это не важно куда - лишняя информация. На данной машине это IBM Content Collector.
Идет поток файлов (в данном случае электронные документы), перерабатываются и пернаправляются для дальнейшей обработки.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:45 23-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
> Я тут начал химичить:  
> # awk -F'[<>]' '/placeholder name = "importPath"/ && !/Change/ && !/\$\{/ { print $3 }' /archive/obj/bastore/*/*/config/*.xml
 
Бр-р...  Я аж поежился.  Как вам не стремно с такими наборами черточек и скобочек под рутом на боевой машине экспериментировать.
 
Вообще, рискну напомнить:
 

 
Так что есть предложение не преумножать печали.  xmlstarlet(1) есть (= поставить можно)?  Или xmllint(1)?
 


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 13:48 23-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xmllint есть.
 
P.S. Машина не боевая

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:51 23-08-2016 | Исправлено: CrownRU, 13:54 23-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> xmllint есть.  
 
Тогда нужен не «кусок из конфига», а конфиг полностью (ну либо полная структура до нужного поля).
 
Добавлено:
Хотя возможно, что и не нужен.  Проверьте сперва instance_get_import_path как таковую.  Остальное тоже, очевидно, не проверял.
 

#!/bin/bash
 
instance_init ()
{
    local instance="$1"
    local action="$2"
    "$instance/bin/${instance/'/'/'_'}.sh" "$action"
}
 
instance_get_import_path ()
{
    local instance="$1"
    xmllint --xpath '//placeholder[@name="importPath"]/node()' \
            "$instance/config/${instance/'/'/'_'}.xml"
}
 
cd '/archive/obj/bastore/'
 
for instance in ?/*; do
    [[ -d "$instance/failed" ]] || continue
    instance_init "$instance" stop
    rm -r -- "$instance/system"
    mv -- "$instance/failed"/* "$(instance_get_import_path "$instance")"
    instance_init "$instance" start
done

 
Простор для оптимизации тут тоже громадный.  Хорошо бы было, к примеру не разбирать конфиги каждый раз (они же у вас не меняются сами по себе, верно?), но для этого надо, очевидно не по крону это запускать, а держать демоном.

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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот один из...
 
Script
 
Добавлено:
Эхх... Дураком помру...
 
Как проверить instance_get_import_path ?
 
Добавлено:

Цитата:
Хорошо бы было, к примеру не разбирать конфиги каждый раз

 
Конфиги не везде одинаковые - там комментарий, здесь лишний параметр, где-то еще что-то...
 
Добавлено:
Попробовал xmllint запустить :/
Unknown option --xpath
 
Добавлено:
xmllint --version
xmllint: using libxml version 20706

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:32 23-08-2016 | Исправлено: CrownRU, 16:08 20-11-2017
ASE_DAG



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

$ instance_get_import_path ()
> {
>     local instance="$1"
>     xmllint --xpath '//placeholder[@name="importPath"]/node()' \
>             "$instance/config/${instance/'/'/'_'}.xml"
> }  

 
А затем выполнить в ней:
 
$ instance_get_import_path N/NSP_F3
 
> Попробовал xmllint запустить :/
> Unknown option --xpath
 
О господи, опять у вас там какие-то древности.
 
Хорошо, прежде чем начинать костылить спрошу, может быть есть xsltproc(1)?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:02 23-08-2016
CrownRU



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

Код:
xsltproc --version
Using libxml 20706, libxslt 10124 and libexslt 813
xsltproc was compiled against libxml 20701, libxslt 10124 and libexslt 813
libxslt 10124 was compiled against libxml 20701
libexslt 813 was compiled against libxml 20701
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 17:11 23-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, о!  Тогда держите:
 

instance_get_import_path ()
{
    local instance="$1"
    xsltproc --novalid --nonet \
             - "$instance/config/${instance/'/'/'_'}.xml" << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select="//placeholder[@name='importPath']/node()" />
  </xsl:template>
</xsl:stylesheet>
EOF
}

 
Не проверял.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:41 23-08-2016
ASE_DAG



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



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

instance_get_import_path ()
{
    local instance="$1"
    xmllint --shell "$instance/config/${instance/'/'/'_'}.xml" \
            3>&1 1>&- 2>&- << 'EOF'
cd //placeholder[@name="importPath"]/node()
write /dev/fd/3
EOF
}


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос
 
stupom
Нет, локи это стандартный способ для всех языков (правда иногда используются более сложные механизмы вроде семафоров).
Из bash'а это делается, сюрприз-сюрприз, командой flock.
 
man 1 flock
man 2 flock


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:11 24-08-2016
CrownRU



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

Цитата:
CrownRU, как успехи?  

Прошу прощения, с сыном к врачу ходил.
 
Может я что-то делаю не так?
Запустил в баше функцию, затем ошибка:
 

Код:
# instance_get_import_path /archive/obj/bastore/N/NSP_F3
warning: failed to load external entity "/archive/obj/bastore/N/NSP_F3/config//archive/obj/bastore/N/NSP_F3.xml"
unable to parse /archive/obj/bastore/N/NSP_F3/config//archive/obj/bastore/N/NSP_F3.xml


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:34 24-08-2016 | Исправлено: CrownRU, 13:43 24-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Ну тут т. ASE_DAG рассчитывал что ты уже выполнил cd в каталог /archive/obj/bastore. И в переменную $instance попадёт только относительный путь, например N/NSP_F3.

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

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



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

Код:
 
/archive/obj/bastore # instance_get_import_path N/NSP_F3
warning: failed to load external entity "N/NSP_F3/config/N/NSP_F3.xml"
unable to parse N/NSP_F3/config/N/NSP_F3.xml


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 16:53 24-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
А код обёртки над функцией-то как выглядит?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:17 24-08-2016
ASE_DAG



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

>> CrownRU, как успехи?
> Прошу прощения, с сыном к врачу ходил.
 
Ну вот, заставил вас извиняться, будто бы вы в чем-то виноваты.  Надо, наверное, объясниться.  Я обычно спрашиваю «как успехи», когда у меня возникают подозрения, что собеседник завяз в благородных (без шуток) попытках действовать с соответствии с сетевым этикетом и хорошенько думать прежде чем бросаться с дополнительными вопросами; тогда как в данном случае — с программками, при которых сказано «не проверял» — это не особо целесообразно, ибо там вполне могут именно мои ошибки, вплоть до опечаток.

 
>> "$instance/config/${instance/'/'/'_'}.xml"
>>                             ^^^^^^^^
> unable to parse N/NSP_F3/config/N/NSP_F3.xml
>                                  ^
 
Но в данном случае ошибок я не вижу; а предполагаю опять какой-то древний Баш на вашей стороне.  Проверьте-ка минимальный пример:

$ s='a/b'
$ echo ${s/\//_}
a_b

 
 
Добавлено:
Alukardd> А код обёртки над функцией-то как выглядит?
 
Какой еще «обертки»?  Написано же: $ instance_get_import_path N/NSP_F3 — все.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Какой еще «обертки»?  Написано же: $ instance_get_import_path N/NSP_F3 — все.
Ну я думал, там рекурсивный обоход в цикле какой.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:20 24-08-2016
CrownRU



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

Цитата:
Ну вот, заставил вас извиняться, будто бы вы в чем-то виноваты.  Надо, наверное, объясниться.  Я обычно спрашиваю «как успехи», когда у меня возникают подозрения, что собеседник завяз в благородных (без шуток) попытках действовать с соответствии с сетевым этикетом и хорошенько думать прежде чем бросаться с дополнительными вопросами; тогда как в данном случае — с программками, при которых сказано «не проверял» — это не особо целесообразно, ибо там вполне могут именно мои ошибки, вплоть до опечаток.  
 
 
>> "$instance/config/${instance/'/'/'_'}.xml"  
>>                             ^^^^^^^^  
> unable to parse N/NSP_F3/config/N/NSP_F3.xml  
>                                  ^  
 
Но в данном случае ошибок я не вижу; а предполагаю опять какой-то древний Баш на вашей стороне.  Проверьте-ка минимальный пример:  
 
$ s='a/b'  
$ echo ${s/\//_}  
a_b  
 

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

Код:
 
SO-0A216:/archive/obj/bastore # s='a/b'
SO-0A216:/archive/obj/bastore # echo ${s/\//_}
a_b


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 22:51 24-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> Вроде на "ты" были :-)
 
В публичном поле мне как-то проще со всеми на «вы».  Но если настаиваешь...

 
> Вот, вроде проходит, хотя и баш древний.
 
Хорошо, а так:

$ s='a/b'  
$ echo ${s/'/'/'_'}  
a_b

 
Если не пройдет, то понятно, что делать, я надеюсь.  :-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:37 25-08-2016
CrownRU



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

Код:
SO-0A216:/archive/obj/bastore # s='a/b'
SO-0A216:/archive/obj/bastore # echo ${s/\//_}
a_b
 
SO-0A216:/archive/obj/bastore # s='a/b'
SO-0A216:/archive/obj/bastore # echo ${s/'/'/'_'}
a/b
 


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:33 25-08-2016 | Исправлено: CrownRU, 10:39 25-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, ну так я надеюсь, понятно, что теперь делать?   Заменить в программке выше всякую ${.../'/'/'_'} на ${.../\//_}.
 
Но я бы еще все-таки не переразбирал конфиги каждые N минут, но держал бы это в памяти постоянно запущенной программки.  Вот так как-то:
 

#!/bin/bash
 
#config
TIMEOUT='5m'
 
instance_init ()
{
    local instance="$1"
    local action="$2"
    "$instance/bin/${instance/\//_}.sh" "$action"
}
 
instance_get_import_path ()
{
    local instance="$1"
    xsltproc --novalid --nonet \
             - "$instance/config/${instance/\//_}.xml" << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select="//placeholder[@name='importPath']/node()" />
  </xsl:template>
</xsl:stylesheet>
EOF
}
 
process_failed_instances ()
{
    for instance in "${instances[@]}"; do
        [[ -d "$instance/failed" ]] || continue
        instance_init "$instance" stop
        rm -r -- "$instance/system"
        mv -- "$instance/failed"/* "${import_paths[$instance]}"
        instance_init "$instance" start
    done
}
 
declare -a instances
declare -A import_paths
 
cd '/archive/obj/bastore/'
instances=( ?/* )
 
for instance in "${instances[@]}"; do
    import_paths["$instance"]=$(instance_get_import_path "$instance")
done
 
while :; do
    process_failed_instances
    sleep $TIMEOUT
done

 
Опять же, не проверял.

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

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



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

Код:
/tmp/aaa.sh: line 41: declare: -A: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]
/tmp/aaa.sh: line 47: F/FQP_RA: division by 0 (error token is "A")
Stopping moreen for instance F_FQP_RA
rm: cannot remove `F/FQP_RA/system': Directory not empty
/tmp/aaa.sh: line 35: F/FQP_RA: division by 0 (error token is "A")
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:02 25-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Отсутствие ассоциативных массивов
 
У меня на работе тоже не всегда есть возможность принести в систему нужный мне пакет, но зато всегда есть возможность скопировать туда исполняемый файл.
Скопилируй ты уже себе статичный бинарник со свежим bash'ом и положи на все машины. Ну и соответсвенно пропишешь в своих скриптах вместо /bin/bash, какой-нить /usr/local/bin/bash4 или даже /home/crownru/bash4.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 12:50 25-08-2016
CrownRU



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

Цитата:
CrownRU  
Отсутствие ассоциативных массивов  
 
У меня на работе тоже не всегда есть возможность принести в систему нужный мне пакет, но зато всегда есть возможность скопировать туда исполняемый файл.  
Скопилируй ты уже себе статичный бинарник со свежим bash'ом и положи на все машины. Ну и соответсвенно пропишешь в своих скриптах вместо /bin/bash, какой-нить /usr/local/bin/bash4 или даже /home/crownru/bash4.
 

 
Да мочь то я могу, но нельзя. За такое "атата" могут сделать. Я же машины не админю Но я попытаюсь получить разрешение.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:11 25-08-2016 | Исправлено: CrownRU, 13:15 25-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Но почему запуск скрипта это нормально, а запуск скрипта со своим интерпритатором — нет?
У тебя и так рутовые права, как я понимаю, ты и так всё гробануть можешь, так не всё ли равно им каким софтом ты это сделаешь?!

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:22 25-08-2016
CrownRU



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:26 25-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Я же тебе говорю — разложи просто везде статичный бинарник и пофигу что там вокруг.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:31 25-08-2016
CrownRU



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:37 25-08-2016
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:42 25-08-2016
CrownRU



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:08 25-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Цитата:
Я так понимаю надо компилить на машине, где это работать должно?  

Цитата:
Где-нить на своей рабочей/домашней машине компилишь и всё.  
Желательно что бы совпадала архитектура, а вообще и это решается кросскомпиляцией...
 
Добавлено:
CrownRU
В общем для x86-64 я тебе сделал — http://rgho.st/6HSqnmFdG.

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

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



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:23 25-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
оО, а Чт и Пт у тебя выходные?)

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

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



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:31 25-08-2016
stupom



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

Цитата:
#!/bin/bash
 
alias hhh='ls -Fail'
hhh
exit 0
 

В ответ пишет только

Цитата:
 line 4: hhh: command not found

Куда смотреть надо?
 
Спасибо

Всего записей: 182 | Зарегистр. 04-07-2015 | Отправлено: 14:20 27-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd>> оО, а Чт и Пт у тебя выходные?)
CrownRU> Не, заболел я :-)
 
«Заболел» и смайлик.  Даже затрудняюсь, что написать: то ли «сочувствую», то ли «поздравляю».  :-)  Выбери сам.

 



stupom> Куда смотреть надо?
 
В документацию, вестимо.

Цитата:
  Aliases are not expanded when the shell is not interactive, unless
the `expand_aliases' shell option is set using `shopt' (*note The Shopt
Builtin::).
(info "(bash) Aliases"), оно же $ info '(bash) Aliases',
оно же https://www.gnu.org/software/bash/manual/bash.html#Aliases

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:53 27-08-2016 | Исправлено: ASE_DAG, 17:01 27-08-2016
CrownRU



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

Цитата:
CrownRU> Не, заболел я  
 
«Заболел» и смайлик.  Даже затрудняюсь, что написать: то ли «сочувствую», то ли «поздравляю».    Выбери сам.  

 
Да не с чем поздравлять. Ощущение, как будто еж в горле, сопли. Вообщем лучше не болеть.  
 
Добавлено:
ASE_DAG
Я тебе в личку постанул, уточнить куда пузырь слать ...

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 23:54 27-08-2016 | Исправлено: CrownRU, 01:12 28-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
> лучше не болеть.
 
Это верно.  :-)

 
> уточнить куда пузырь слать :-)
 
Так оно что, работает как надо?  Не может такого быть — там принципиальная ошибка — каталог failed, наличие которого используется за условие ошибки, не удаляется.
 
И вообще, если не еще начал возиться с установкой Баша, то вот:
 

#!/usr/bin/perl
 
package CrownRU;
 
use warnings;
use XML::LibXML;
use File::Path;
use File::Copy;
 
my $xml_parser = XML::LibXML->new(validate => 0,
                                  load_ext_dtd => 0);
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $self = {};
  (my $id_ = $id) =~ tr,/,_,;
  $self->{initscript} = "$dir/$id/bin/$id_";
  $self->{failed_dir} = "$dir/$id/failed";
  $self->{system_dir} = "$dir/$id/system";
  my $config = "$dir/$id/config/$id_.xml";
  $self->{import_dir} = ($xml_parser
                         ->load_xml(location => $config)
                         ->find('//placeholder[@name="importPath"]/node()')
                         ->string_value());
  return bless $self, $class;
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  -d $self->{failed_dir}
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for glob "$self->{failed_dir}/*";
  rmdir $self->{failed_dir};
  $self->start();
}
 
package main;
 
use warnings;
 
@ARGV == 1
  or die "Usage example: $0 '/archive/obj/bastore/'\n";
 
my ($wd) = @ARGV;
my $timeout = 5 * 60;
 
chdir $wd
  or die "$!\n";
 
@instances = map { CrownRU->new($wd, $_) } glob '?/*';
 
for (;;) {
  $_->process_failed() for @instances;
  sleep $timeout;
}

 
Надеюсь, что libxml2 у вас там наличествует.  И разумеется, не проверял.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 07:34 29-08-2016
CrownRU



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

Код:
# echo "$BASH_VERSION"
4.3.46(1)-release

 
К сожалению вылазят вот такие ошибки:
Ошибки
 
И еще, если не трудно, можно сделать какоe нибудь перенаправление в лог и возможность скармливать скрипту какую нибудь одиночную инстанцию? Типа:

Код:
idxsafe.sh N_NST_MDP

 
P.S. Каталог failed удалять не нужно. Надо только переместить файлы
Код:
mv *.idx <import_path>
, а содержимое system стереть.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:17 29-08-2016 | Исправлено: CrownRU, 10:20 29-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
> warning: failed to load external entity "F/exchange/config/F_exchange.xml"
> warning: failed to load external entity "N/core/config/N_core.xml"
 
То есть в подкаталогах есть еще какие exchange и core, что учитывать не надо?  А что тогда надо, если не ?/*?  Ну попробую угадать, что ?/???_*.  Так?
 
> mv: cannot stat `F/FQT_RA/failed/*': No such file or directory
 
Это ровно та ошибка, о которой я сказал выше: «там принципиальная ошибка — каталог failed, наличие которого используется за условие ошибки, не удаляется».  Не понимаю, зачем было запускать программу, не исправив ее.
 
> Exception in thread "main" java.io.IOException: Failed to retrieve RMIServer stub:
 
Ява?  Какая еще Ява?  Это, я так понимаю, что-то с инит-скриптом экземляра этой проприетарщины.
 
> Каталог failed удалять не нужно. Надо только переместить файлы
> mv *.idx <import_path>
 
И соответственно условием будет наличие таковых файлов.  ОК.  
 
> И еще, если не трудно, можно сделать какоe нибудь перенаправление в лог
 
В какой?  В Сислог?  Да, не вопрос.
 
> и возможность скармливать скрипту какую нибудь одиночную инстанцию?
 
Да и не одиночную тоже не проблема.
 
Лови:
 

#!/usr/bin/perl
 
package CrownRU;
 
use warnings;
use XML::LibXML;
use File::Path;
use File::Copy;
 
my $xml_parser = XML::LibXML->new(validate => 0,
                                  load_ext_dtd => 0);
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $i = "$dir/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  (my $id_ = $id) =~ tr,/,_,;
  $self->{initscript} = "$i/bin/$id_";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/$id_.xml";
  $self->{import_dir} = ($xml_parser
                         ->load_xml(location => $config)
                         ->find('//placeholder[@name="importPath"]/node()')
                         ->string_value());
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
 
my $SCRIPTNAME = 'idxsafe';
 
@ARGV >= 1
  or die ("Usage examples:\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore N/NST_F3 F/FQP_RA\n");
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
# setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my ($wd, @ids) = @ARGV;
my $timeout = 5 * 60;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { CrownRU->new($wd, $_) } (@ids
                                               ? @ids
                                               : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  sleep $timeout;
}

 
(Не проверял.)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:37 30-08-2016 | Исправлено: ASE_DAG, 00:39 30-08-2016
CrownRU



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

Код:
MO-0A248:/archive/obj/bastore/F/FQT_RA # /tmp/saveidx.sh F/FQT_RA
F/FQT_RA: No such file or directory at /tmp/saveidx.sh line 83.
MO-0A248:/archive/obj/bastore/F/FQT_RA # /tmp/saveidx.sh /archive/obj/bastore/F/FQT_RA
No instances found at /tmp/saveidx.sh line 93.
MO-0A248:/archive/obj/bastore/F/FQT_RA # /tmp/saveidx.sh FQT_RA
FQT_RA: No such file or directory at /tmp/saveidx.sh line 83.
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 09:58 30-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
> # /tmp/saveidx.sh F/FQT_RA
> # /tmp/saveidx.sh /archive/obj/bastore/F/FQT_RA
 
По-моему, кто-то решительно невнимателен. :-)
 

Цитата:
Usage examples:
    $ idxsafe /archive/obj/bastore
    $ idxsafe /archive/obj/bastore N/NST_F3 F/FQP_RA

 
И, кстати, почему он у тебя .sh, когда вовсе нет, не говоря уж о том, что суффиксы исполняемостям обычно не дают?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
И, кстати, почему он у тебя .sh, когда вовсе нет, не говоря уж о том, что суффиксы исполняемостям обычно не дают?
а я вот, кстати, за то что бы у скриптов были суфиксы, их так искать проще и не смотря внутрь понимать на чём он написан. Так для shell скриптов (sh, bash) и за расширение .sh.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:13 30-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> Так для shell скриптов (sh, bash) и за расширение .sh.
 
Ага, а потом вы перепишете эту программу с Баша на Перл (ровно что и произошло сейчас), и у вас будет файл *.sh, содержащий программу на Перле (менять название исполняемости на поздних этапах-то уже нельзя — интерфейс-с).

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:23 30-08-2016
stupom



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cron шлёт сообщения об ошибках
задание

Цитата:
* * * * * date +%s >> /root/hlam/cron.test.txt

присылает на почту

Цитата:
Cron <root> date +

Если просто "спросить время", то ошибки нет всё пишет в файл.
 
Почему ему не нравится + и что с этим сделать?

Всего записей: 182 | Зарегистр. 04-07-2015 | Отправлено: 18:24 30-08-2016 | Исправлено: stupom, 20:04 30-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stupom, как вы пришли к тому, что ему «не нравится +»?  Плюс же исполнился, вы же сами все показали, не?  «Не нравится» ему, наверное, %, и может быть стоит открыть документацию — crontab(5), и прочитать, что&#769; же он в этом контексте значит, и как его экранировать?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:28 30-08-2016 | Исправлено: ASE_DAG, 19:29 30-08-2016
stupom



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

Всего записей: 182 | Зарегистр. 04-07-2015 | Отправлено: 19:46 30-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Ну я не согласен, и старый sh им пусть и остаётся. а новый я назову .pl.
А среди моих знакомых, есть те которые не зависимро от execute bit'а пишут sh script.sh, т.о. изменив содержимое на perl ни чего хорошо и так не выйдет.
Расщирение стоит убирать только в однои случае, когда скрипт помещается в PATH, например в /usr/local/bin

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 09:53 31-08-2016
CrownRU



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

Цитата:
По-моему, кто-то решительно невнимателен.  

 
Ай... Прошу прощения.
 
Все равно ошибка:
 

Код:
MO-0A248:~ # /tmp/saveidx /archive/obj/bastore F/FQT_RA
Can't locate object method "load_xml" via package "XML::LibXML" at /tmp/saveidx line 25.
 
MO-0A248:~ # /tmp/saveidx /archive/obj/bastore
Can't locate object method "load_xml" via package "XML::LibXML" at /tmp/saveidx line 25.
 

 
Добавлено:
Alukardd
 
Там уж, хоть .sh, хоть .pl, лишь бы работало. Потом переименуем как надо

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:19 31-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Цитата:
Can't locate object method "load_xml" via package "XML::LibXML" at /tmp/saveidx line 25.  
ну видимо потому что
Цитата:
This function is available since XML::LibXML 1.70
текущую версию наверное проще всего узнать так: perldoc -t XML::LibXML | grep -A1 '^VERSION$'

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

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



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

Код:
 
0A248:/archive/obj/bastore/F/FQT_RA # perldoc -t XML::LibXML | grep -A1 '^VERSION$'
VERSION
    1.66
 

Можно "проактуализировать" как bash?

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:34 31-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Ну perl как и наверное всё можно собрать статично.
Если между рабочими делами выйдет, то соберу тебе.
А так вот — http://search.cpan.org/~mlehmann/App-Staticperl-1.44/staticperl.pod

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 11:42 31-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Сапсибо. Я в perl даже не ноль, а ниже нуля  
Пока написал ругательное письмо начальству админов.
Заколебало это "never touch a running system" возведенное в абсолют.
 
Добавлено:
SLES11 SP4

Код:
# zypper up perl
Loading repository data...
Reading installed packages...
No update candidate for 'perl-5.10.0-64.72.1.x86_64'. The highest available version is already installed.
Resolving package dependencies...
 

 
Нету официальных обновлений для SLES11SP4

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:55 31-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> Ну perl как и наверное всё можно собрать статично.
 
Из-за такой ерунды?  Там одну строчку переписать для совместимости со старым интерфейсом:
 

@@ -23,7 +23,7 @@
   $self->{system_dir} = "$i/system";
   my $config = "$i/config/$id_.xml";
   $self->{import_dir} = ($xml_parser
-                         ->load_xml(location => $config)
+                         ->parse_file($config)
                          ->find('//placeholder[@name="importPath"]/node()')
                          ->string_value());
   return bless $self, $class;

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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:57 31-08-2016 | Исправлено: ASE_DAG, 17:58 31-08-2016
Alukardd



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

Цитата:
мне наверное надо было сообразить, что 1.70 — не такая уж и старая версия
Это ж не только сообразить надо было, но ещё и знать, что интерфейс менялся в 1.70 версии. Мне пришлось погуглить для этого, т.к. в perldoc'е я на такую информацию не наткнулся.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:06 31-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Спасибо огромное!
Завтра попробую и сразу отпишусь. Жду ответа на ЛС
 
Добавлено:
Alukardd

Цитата:
 
мне наверное надо было сообразить, что 1.70 — не такая уж и старая версия
Это ж не только сообразить надо было, но ещё и знать, что интерфейс менялся в 1.70 версии. Мне пришлось погуглить для этого, т.к. в perldoc'е я на такую информацию не наткнулся.

 
Спасибо!
Сегодня застращал начальство, что системы дырявые. Надеюсь дойдет и наконец обновят их. Админы молят меня, чтобы я оставил их в покое до пенсии

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 18:43 31-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Почему бы не иметь актуальные статичные версии итерпритаторов
 
Так а толку?  Здесь не в версии Перла дело, как ошибочно предположил т. CrownRU, став искать обновления для него (# zypper up perl); а в версии libxml-libxml-perl (это в Дебиане пакет зовется так, как в Сузе, я не знаю).   Которая, как можно предположить, должна быть если не точно, то в каких пределах согласована с версией libxml2.  Ее тоже собирать?
 
Хотя тот же load_xml(), как можно узнать, — это действительно всего-лишь внутриперловский сахар.  Я даже затрудняюсь сказать, для чего его вообще ввели.  Вероятно, в порядке совместимости с чем-нибудь.
 
> Это ж не только сообразить надо было, но ещё и знать, что интерфейс менялся в 1.70 версии.
 
Ну так это в документации же написано.  Может быть, вы помните синтаксис XML::LibXML наизусть, я-то — нет, поэтому прежде чем что-либо писать пробежался по ней глазами.
 
> Мне пришлось погуглить для этого, т.к. в perldoc'е я на такую информацию не наткнулся.
 
Ну и вышли на него же.  Бывает.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:10 31-08-2016 | Исправлено: ASE_DAG, 20:27 31-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> текущую версию наверное проще всего узнать так: perldoc -t XML::LibXML | grep -A1 '^VERSION$'
 
Да вы просто мастер костыля! :-)  Я уже давно и забыл, что grep(1) так умеет.
 
А вообще: $ perl -mXML::LibXML -e 'print XML::LibXML->VERSION, "\n"'

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> А среди моих знакомых, есть те которые не зависимро от execute bit'а пишут sh script.sh, т.о. изменив содержимое на perl ни чего хорошо и так не выйдет.  
 
Обосновывать дурную, но в целом безвредную привычку другой — уже откровенно глупой и опасной — это сильно!

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
XML::LibXML->VERSION
Эх, там ООП интерйейс, и функция... А я проверил только переменную XML::LibXML::VERSION, после чего решил использовать perldoc.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 01:18 01-09-2016 | Исправлено: Alukardd, 01:46 01-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> А я проверил только переменную XML::LibXML::VERSION
 
Как это может быть переменной?  Скалярные переменные в Перле начинаются с доллара, а голое слово — это чаще всего именно функция (подпрограмма).
 
Такой сущности как XML::LibXML::VERSION просто нет, но похожая на нее XML::LibXML::LIBXML_VERSION — это именно подпрограмма (что возвращает версию двоичной библиотеки, если что).  Это легко проверить — подставьте к голому слову маркер функции — амперсанд:
 

$ perl -MXML::LibXML -de1
 
DB<1> print XML::LibXML::LIBXML_VERSION # bareword
20901
DB<2> print &XML::LibXML::LIBXML_VERSION # function
20901
DB<3> print $XML::LibXML::LIBXML_VERSION # scalar
 
DB<4>  


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

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



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

Код:
MO-0A248:/archive/obj/bastore/F/FQT_RA # /tmp/saveidx /archive/obj/bastore F/FQT_RA
Operation in progress at /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/XML/LibXML.pm line 587. at /tmp/saveidx line 25

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 09:38 01-09-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Как это может быть переменной?
Методы тоже можно вызвать таким образом. Просто тут разработчик либы не позаботился об этом.
Что бы оно заработало достаточно внести малюсенькое исправление в модуль. Конечно я не заботился о различных ситуациях, а сделал тяп-ляр, просто что бы показать Вам что так тоже можно.
У меня это 41я строка модуля (она же 1я строка метода VERSION), теперь она выглядит так:
my $class = shift // 'XML::LibXML';
И тогда вызов работает норм:
perl -MXML::LibXML -e 'print XML::LibXML::VERSION'

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, привет. :-)  Если я долго никак не отвечаю, а вроде бы намеревался, то вполне вероятно, что есть смысл мне написать и напомнить — я ведь мог и просто пропустить сообщение мимо.  И нет, ни в коем случае не по здешней внутренней почте — она никуда дальше Руборда не идет, на нормальную э-почту.  Ты ее и так знаешь, но на всякий случай (который весьма вероятен в свете последних событий вокруг Руборда) вписал адресок в подпись.
 


Теперь по существу.
 
> После ~10 секундной паузы опять выдал ошибку:
 
А вот не могу ничем обрадовать.  Понятно, надеюсь, что это не совсем ошибка, это он сообщает, что за эти десять секунд так и не смог разобрать конфиг.  Это, конечно, ненормально, но учитывая, что у меня все работает, даже и не знаю, что предположить.  У меня оно правда работает не на F/FQT_RA (который мне никто не давал), а на N/NSP_F3, но, я надеюсь, они по форме одинаковые.
 
Так что не могу предложить ничего лучше, чем дергать из Перла xsltproc, который у нас, кажется, работал вполне корректно:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
use IPC::Run 'run';
 
sub xpath
{
  my ($file, $xpath) = @_;
  my $in = <<"EOF";
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF
  my ($out, $err);
  run ['xsltproc', '--novalid', '--nonet', '-', $file], \$in, \$out, \$err;
  length $out
    or die "$err";
  return $out;
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $i = "$dir/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  (my $id_ = $id) =~ tr,/,_,;
  $self->{initscript} = "$i/bin/$id_";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/$id_.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'idxsafe';
 
my $syslog = 1;
my $timeout = 5 * 60;
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout);
 
@ARGV >= 1
  or die ("Usage examples:\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore N/NST_F3 F/FQP_RA\n");
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my ($wd, @ids) = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { CrownRU->new($wd, $_) } (@ids
                                               ? @ids
                                               : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 07:40 07-09-2016 | Исправлено: ASE_DAG, 07:42 07-09-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Привет. Ну мало ли. Может другие дела навалились...
Все равно ошибка вылазит:
 

Код:
# /tmp/saveidx /archive/obj/bastore F/FQT_RA
Can't locate IPC/Run.pm in @INC (@INC contains: /usr/lib/perl5/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/5.10.0 /usr/lib/perl5/site_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.10.0 /usr/lib/perl5/vendor_perl .) at /tmp/saveidx line 20.
BEGIN failed--compilation aborted at /tmp/saveidx line 20.
 

 
Там действительно так сложно нужно? И наверное (жирным выделил) лишнее) saveidx /archive/obj/bastore F/FQT_RA.
Все равно огромное спасибо!

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:13 07-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
 
> Can't locate IPC/Run.pm in @INC
 
Ну это модуля в системе нет.  Не обязан, конечно, но мне казалось, что он довольно распространенный, извиняюсь.  Ладно, завяжемся еще и на оболочку:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
 
sub xpath
{
  my ($file, $xpath) = @_;
  return qx(xsltproc --novalid --nonet - "$file" <<EOF
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF)
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $i = "$dir/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  (my $id_ = $id) =~ tr,/,_,;
  $self->{initscript} = "$i/bin/$id_";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/$id_.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'idxsafe';
 
my $syslog = 1;
my $timeout = 5 * 60;
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout);
 
@ARGV >= 1
  or die ("Usage examples:\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore\n" .
          "    \$ $SCRIPTNAME /archive/obj/bastore N/NST_F3 F/FQP_RA\n");
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my ($wd, @ids) = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { CrownRU->new($wd, $_) } (@ids
                                               ? @ids
                                               : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}

 
> Там действительно так сложно нужно?  :-( И наверное (жирным выделил) лишнее) saveidx /archive/obj/bastore F/FQT_RA.
 
В каком смысле?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 10:34 07-09-2016
CrownRU



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

Цитата:
> Там действительно так сложно нужно?   И наверное (жирным выделил) лишнее) saveidx /archive/obj/bastore F/FQT_RA.
 
В каком смысле?
 

Я имею ввиду, что вот так было бы логичней просто: saveidx FQT_RA
 
Сейчас проверю.
 
Запустил - висит, в смысле не выходит в шелл, но похоже работает. Во всяком случае тестовый файл переместился из failed.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:53 07-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> Я имею ввиду, что вот так было бы логичней просто: saveidx FQT_RA
 
Да бога ради.

@@ -95,18 +95,15 @@
 use Sys::Syslog qw(:standard :extended);
 use Getopt::Long;
 
-my $SCRIPTNAME = 'idxsafe';
+my $SCRIPTNAME = 'saveidx';
 
 my $syslog = 1;
 my $timeout = 5 * 60;
+my $wd = '/archive/obj/bastore';
 
 GetOptions("no-syslog" => sub { $syslog = 0 },
-           "timeout=i" => \$timeout);
-
-@ARGV >= 1
-  or die ("Usage examples:\n" .
-          "    \$ $SCRIPTNAME /archive/obj/bastore\n" .
-          "    \$ $SCRIPTNAME /archive/obj/bastore N/NST_F3 F/FQP_RA\n");
+           "timeout=i" => \$timeout,
+           "wd=s" => \$wd);
 
 openlog $SCRIPTNAME, 'pid', LOG_USER;
 
@@ -116,7 +113,7 @@
 $SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
 $SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
-my ($wd, @ids) = @ARGV;
+my @ids = @ARGV;
 
 -d $wd
   or die "$wd: $!";

 
> ...но похоже работает.  Во всяком случае тестовый файл переместился из failed.
 
Можно еще в сислог заглянуть, посмотреть, о чем эта хрень отчиталась.
 


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

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



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

Цитата:
Можно еще в сислог заглянуть, посмотреть, о чем эта хрень отчиталась.  

 
 
Так ошибка в пути:

Код:
# /tmp/saveidx FST_YE
/archive/obj/bastore/FST_YE: No such file or directory at /tmp/saveidx line 49.
 

 
Приходится так:
# /tmp/saveidx F/FST_YE
 
Ой, да, извини, забыл лог выложить.
 

Код:
Sep  7 10:47:56 MO-0A248 saveidx[28218]: /archive/obj/bastore/FST_YE: No such file or directory at /tmp/saveidx line 49.
Sep  7 10:48:38 MO-0A248 saveidx[28237]: Started successfully on: F/FST_YE
Sep  7 10:48:38 MO-0A248 saveidx[28240]: Can't exec "/archive/obj/bastore/F/FST_YE/bin/F_FST_YE": No such file or directory at /tmp/saveidx line 77.
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot unlink file for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246dda00000005: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot restore permissions to 0100666 for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246dda00000005: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot unlink file for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246ddc00000006: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot restore permissions to 0100666 for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246ddc00000006: Device or resource busy at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28237]: cannot remove directory for /archive/obj/bastore/F/FST_YE/system: Directory not empty at /tmp/saveidx line 86
Sep  7 10:48:38 MO-0A248 saveidx[28241]: Can't exec "/archive/obj/bastore/F/FST_YE/bin/F_FST_YE": No such file or directory at /tmp/saveidx line 71.
Sep  7 10:48:38 MO-0A248 saveidx[28237]: F/FST_YE restored
 


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:53 07-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> # /tmp/saveidx FST_YE
 
А!  Тебе еще и без префикса.  Ну вот так должно приниматься как с, так и без:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
 
sub xpath
{
  my ($file, $xpath) = @_;
  return qx(xsltproc --novalid --nonet - "$file" <<EOF
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF)
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $pfx = substr $id, 0, 1;
  my $i = "$dir/$pfx/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  $self->{initscript} = "$i/bin/${pfx}_${id}.sh";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/${pfx}_${id}.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  rmtree $self->{system_dir};
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'saveidx';
 
my $syslog = 1;
my $timeout = 5 * 60;
my $wd = '/archive/obj/bastore';
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout,
           "wd=s" => \$wd);
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my @ids = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { s,^./,,;
                      CrownRU->new($wd, $_); } (@ids
                                                ? @ids
                                                : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}

 
> Ой, да, извини, забыл лог выложить.
> Can't exec "/archive/obj/bastore/F/FST_YE/bin/F_FST_YE": No such file or directory at /tmp/saveidx line 77.
 
Ну это я, как ты уже понял, пока вся шла вся эта тягомотина, суффикс .sh потерял (выше исправлено).
 
> Сannot unlink file for /archive/obj/bastore/F/FST_YE/system/.nfs0000000000246dda00000005: Device or resource busy at /tmp/saveidx line 86
 
А вот это не ко мне.  Впрочем, вероятно, это из-за неостанова, да?
 
Кстати говоря, в порядке тестирования, ведь наверное, сислог засорять ни к чему, да и бесконечный цикл не нужен, так что почему бы тебе не запускать его с ключами --no-syslog --timeout -1?


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

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



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

Код:
MO-0A248 saveidx[6566]: cannot remove directory for /archive/obj/bastore/N/NST_Y/system: Das Verzeichnis ist nicht leer at /tmp/saveidx line 86
 

там не директория, а содержимое директории должно стираться.
 
И можно без ключей сделать, чтобы они запускались по умолчанию, раз без них вис происходит?
И еще, можно между stop - start вставить короткий sleep на 3 секунды?

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:42 19-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
 
> cannot remove directory for /archive/obj/bastore/N/NST_Y/system: Das Verzeichnis ist nicht leer at /tmp/saveidx line 86
 
Что по русски говоря значит «каталог не пуст»?  Не могу сказать, что ему не нравится — само собой, он не пуст, поэтому и rmtree.
 
Однако коль скоро имеется такое чудное требование, что «там не директория, а содержимое директории должно стираться», то просто вот:
 

#!/usr/bin/perl
 
# package CrownRU::LibXML;
 
# use warnings;
# use XML::LibXML;
 
# my $xml_parser = XML::LibXML->new(validate => 0,
#                                   load_ext_dtd => 0);
 
# sub xpath
# {
#   my ($file, $xpath) = @_;
#   return $xml_parser->parse_file($file)->find($xpath)->string_value;
# }
 
package CrownRU::XSLTProc;
 
use warnings;
 
sub xpath
{
  my ($file, $xpath) = @_;
  return qx(xsltproc --novalid --nonet - "$file" <<EOF
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select='$xpath' />
  </xsl:template>
</xsl:stylesheet>
EOF)
}
 
package CrownRU;
 
use warnings;
use File::Path;
use File::Copy;
 
# *xpath = \&CrownRU::LibXML::xpath;
*xpath = \&CrownRU::XSLTProc::xpath;
 
sub new
{
  my ($class, $dir, $id) = @_;
  my $pfx = substr $id, 0, 1;
  my $i = "$dir/$pfx/$id";
  -d $i
    or die "$i: $!";
  my $self = { id => $id };
  $self->{initscript} = "$i/bin/${pfx}_${id}.sh";
  $self->{failed_dir} = "$i/failed";
  $self->{system_dir} = "$i/system";
  my $config = "$i/config/${pfx}_${id}.xml";
  $self->{import_dir} = xpath($config,
                              '//placeholder[@name="importPath"]/node()');
  return bless $self, $class;
}
 
sub id
{
  my $self = shift;
  return $self->{id};
}
 
sub start
{
  my $self = shift;
  system $self->{initscript}, 'start';
}
 
sub stop
{
  my $self = shift;
  system $self->{initscript}, 'stop';
}
 
sub clear_system_dir
{
  my $self = shift;
  opendir my $dh, $self->{system_dir};
  for (readdir $dh) {
    $_ ne '.' && $_ ne '..'
      or next;
    my $f = "$self->{system_dir}/$_";
    if (-d $f) {
      rmtree $f;
    } else {
      unlink $f;
    }
  }
}
 
sub process_failed
{
  my $self = shift;
  my @idxs = glob "$self->{failed_dir}/*.idx"
    or return;
  $self->stop();
  $self->clear_system_dir();
  move $_, $self->{import_dir} for @idxs;
  $self->start();
}
 
 
package main;
 
use warnings;
use Sys::Syslog qw(:standard :extended);
use Getopt::Long;
 
my $SCRIPTNAME = 'saveidx';
 
my $syslog = 1;
my $timeout = 5 * 60;
my $wd = '/archive/obj/bastore';
 
GetOptions("no-syslog" => sub { $syslog = 0 },
           "timeout=i" => \$timeout,
           "wd=s" => \$wd);
 
openlog $SCRIPTNAME, 'pid', LOG_USER;
 
$syslog
  or setlogsock 'stream', '/dev/stderr';
 
$SIG{__WARN__} = sub { syslog LOG_WARNING, @_ };
$SIG{__DIE__} = sub { syslog LOG_ERR, @_ };
 
my @ids = @ARGV;
 
-d $wd
  or die "$wd: $!";
 
chdir $wd
  or die "$!";
 
my @instances = map { s,^./,,;
                      CrownRU->new($wd, $_); } (@ids
                                                ? @ids
                                                : glob '?/???_*');
 
@instances > 0
  or die "No instances found";
 
syslog(LOG_INFO,
       "Started successfully on: %s", join ', ', map { $_->id } @instances);
 
for (;;) {
  for (@instances) {
    $_->process_failed()
      and syslog LOG_INFO, "%s restored", $_->id;
  }
  exit if $timeout < 0;
  sleep $timeout;
}

 
> И можно без ключей сделать, чтобы они запускались по умолчанию, раз без них вис происходит?
 
ОМГ.  Какой еще «вис»?  Я, конечно, за такое время уже, может быть, все и забыл, но по-моему это условием задачи было, чтоб программка: а) проверяла, не валяются ли упавшие файлы, *регулярно* (здесь я уже не помню по какой причине задался интервалом по-умолчанию в пять минут), б) писала в системный лог; не?
 
> И еще, можно между stop - start вставить короткий sleep на 3 секунды?
 
Я думаю, что без проблем.  Однако, как можно заметить, между start и stop происходит собственно работа над файлами в двух строчках, так что вставляй в любое из трех возможных мест.  Образец там есть.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Коллеги, объясните непонимающему.
Есть файл с текстом:

Код:
    name*1*=7897985464897523fsdf.jpg
    name*1*="7897985464897523fsdf.jpg"
    name*1=7897985464897523fsdf.jpg
    name*1="7897985464897523fsdf.jpg"

Надо первую и третью строчки привести к виду:

Код:
    name=7897985464897523fsdf.jpg

А вторую и четвёртую, соответственно, к такому:

Код:
    name=7897985464897523fsdf.jpg"

Использую команду sed 's/name\*1\*{,1}\={,1}/name=some_/g', а этот подлец игнорирует квантификаторы. Куда бы его пнуть?

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 09:57 27-09-2016 | Исправлено: urodliv, 10:00 27-09-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Ну мне кажется Вы просто забыли ключ -E для sed'а.
 
А вообще не проще ли так?
Код:
sed '/name/s/*\?1*\?//g'
Или оно же
Код:
sed -E '/name/s/\*?1\*?//g'
В зависимости от наличия ключа -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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 10:11 27-09-2016 | Исправлено: Alukardd, 10:12 27-09-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
> sed 's/name\*1\*{,1}\={,1}/name=some_/g'
 
Чего-то я вообще не понимаю, что здесь написано.  Что такое some_?
 
> Есть файл с текстом:
 
Там действительно отступы есть?  И их надо сохранить, да?  Хорошо.
 
>    name=7897985464897523fsdf.jpg
>    name=7897985464897523fsdf.jpg"
 
А нафига, если не секрет, удалять кавычку?  Тем не менее:

#!/bin/bash
 
shopt -s extglob
 
while IFS='=' read key val; do
    printf '%s=%s\n' "${key/name\*1?(\*)/name}" "${val#\"}"
done


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 10:17 27-09-2016 | Исправлено: ASE_DAG, 10:19 27-09-2016
urodliv



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

Цитата:
А вообще не проще ли так?

Красивше, но надо в голову уложить.
 
ASE_DAG

Цитата:
Чего-то я вообще не понимаю, что здесь написано.  Что такое some_?

Артефакт. Его не должно было быть.

Цитата:
Там действительно отступы есть?  И их надо сохранить, да?

Отступы есть, сохранять не надо.

Цитата:
А нафига, если не секрет, удалять кавычку?

Ооооо, это страшная тайна, открыв которую, все будут ржать надо мной. Я уже думаю в более правильном направлении.

Цитата:
Тем не менее:

Это здорово, но у меня в .procmailrc обработка ведётся. Не хочу утяжелять код.

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 17:54 27-09-2016 | Исправлено: urodliv, 17:54 27-09-2016
urodliv



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну в общем коллеги вы поняли? Доброго вам дня.
Требуется пояснение и помощь. Сначала без конкретных примеров.
Итак. Есть рабочий файл .procmailrc, который фильтрует почту. procmail, соответственно, вызывается fetcmail`ом. Если запуск fetchmail`а производить из командной строки, то почта великолепно принимается и сортируется. Стоит мне только поместить эту же самую команду в bash-скрипт и запустить этот скрипт, как тут же получаю ошибку синтаксиса файла .procmailrc. Ошибка приходится на первую не закомментированную строку. Если её закомментировать, то ругань будет на следующую строку и т.д.
Думал это связано с тем, что я использую собственные переменные окружения. Прописал во всех файла абсолютные пути - не помогло. Что это за фигня такая?

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 21:19 06-10-2016
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:34 06-10-2016
urodliv



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

Код:
#! /bin/bash
 
# Каталог, где расположены все файлы настроек и исполняемые файлы
FRAMZAM="/home/user/framzam"
 
# На всякий случай создадим каталог для доставки почты
mkdir -p $FRAMZAM/mail
 
# Принимаем почту
fetchmail -f $FRAMZAM/.procmailrc -i $FRAMZAM/.fetchids

 
Это полный .fetchmailrc
 
Ну и .procmailru добавим
 
Из каталога со скриптом вызываю так: ./zam.sh
Могу вызывать так: /home/user/framzam/zam.sh
Скрипт сделан исполняемым.
 
Добавлено:
Alukardd
Нашёл! ССЗБ. В вызов fetchmail`а подставляю "рецептурник" procmail`а. Это уже клиника...


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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 21:55 06-10-2016 | Исправлено: urodliv, 21:58 06-10-2016
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:47 06-10-2016
urodliv



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

Цитата:
Почему в первой строке у Вас пробел закрался после восклицательного знака?

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

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

Всего записей: 6694 | Зарегистр. 29-04-2009 | Отправлено: 00:33 07-10-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Действительно, можно, не знал  
Похоже это заслуга execve(2), а может shell и сам trim'ает пробелы.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:44 07-10-2016 | Исправлено: Alukardd, 00:47 07-10-2016
tmpl

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно переделать очень много ссылок в куче файлов вида http://example.com/page.php?id=NNN в http://example.com/NNN, т.е. в любом текстовом редакторе с регулярками это будет замена (http://example.com/)page.php?id=([0-9]+) на $1$2. Но я не смог найти, как это можно сделать с помощью awk, т.к. из доков следует, что он не умеет работать с найденными совпадениями, которые в скобках. Гугл не помог, там нашел только, что в gawk есть нестандартное расширение для такого. Можно ли сделать желаемое на awk?

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



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

Всего записей: 182 | Зарегистр. 04-07-2015 | Отправлено: 22:24 10-10-2016
ASE_DAG



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


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

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

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

Цитата:
sed

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

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

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

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

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

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

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

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

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



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:09 11-10-2016 | Исправлено: Alukardd, 10:32 11-10-2016
tmpl

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

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



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

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

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

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

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

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



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

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

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



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

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

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

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

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

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

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


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



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

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


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:45 24-11-2016
ASE_DAG



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

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


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

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



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:55 24-11-2016 | Исправлено: Alukardd, 17:56 24-11-2016
ASE_DAG



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

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

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

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

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



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

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

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

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

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



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

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

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

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

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

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

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



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

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

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

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

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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422, да блин.  Отфильтровываете (как лишнее) вы что?

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Где-то снова напутал. Надо при текущей дате заставить срабатывать $3 > nowtime, а если дата не совпадает, то $3 > nowtime не нужен.
 

Код:
 
BEGIN {
    RS="\n";
    FS=";";
    OFS=";";
    nowtime = strftime ("%H:%M");
    nowdate = strftime ("%d.%m.%Y");
}
 
# ======================= date ===================
NR == 2 {
match ($1, /([.0-9]+)/, s);
split(s[1], a,".");
"date '+%d.%m.%Y' -d "a[3]"-"a[2]"-"a[1]"" | getline newdate
dt=newdate
}
# ================================================
 
# дата совпала, проверяем по времени
/[[:digit:]]{6,9}/ && dt == nowdate && $3 > nowtime {
print (dt "\t" $3);
}
 
#дата не совпала, выводим все.
/[[:digit:]]{6,9}/ {
print (dt "\t" $3);
}
 

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго.
Прошу помощи в разборе вложенных блоков.
 
На входе строка вида "aaaa{bbbb{cccc}eeee}fffff gg{hhh{ci}kkkkk}".  
Уровни вложенности не лимитированы.
sed, awk, grep.
 
Как заменить {cccc} и {ci} на <lim>?
пробовал так:

Код:
 
# echo "aaaa{bbbb{cccc}eeee}fffff gg{hhh{ci}kkkkk}" ; echo "aaaa{bbbb{cccc}eeee}fffff gg{hhh{ci}kkkkk}" | gawk '{gsub("{c[^{]+}", "<lim>", $0); print }'
#aaaa{bbbb{cccc}eeee}fffff gg{hhh{ci}kkkkk}
#aaaa{bbbb<lim>fffff gg{hhh<lim>
 

т.е. нормально заменяется только 1 блок и в конце кусок, но не верно (так понимаю, срабатывает "greedy")
никак не могу найти решение.  
 

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 22:15 24-11-2016 | Исправлено: dvk54, 22:19 24-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54> Как заменить {cccc} и {ci} на <lim>?
 
Таки так:
 
$ gawk 'gsub (/{cccc}|{ci}/, "<lim>")' <<< "aaaa{bbbb{cccc}eeee}fffff gg{hhh{ci}kkkkk}"
aaaa{bbbb<lim>eeee}fffff gg{hhh<lim>kkkkk}

 
:-)
 
В смысле, доформулируйте задачу.
 
Добавлено:
А что до вашего примера, то в нем просто опечатка:

gawk '{gsub("{c[^{]+}", "<lim>", $0); print }'
                 ^

 
Должно быть, очевидно:
 

gawk '{gsub("{c[^}]+}", "<lim>", $0); print }'
                 ^



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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня там ДВЕ опечатки...
там ещё "с" лишняя.

gawk '{gsub("{[^}]+}", "<lim>", $0); print }'
              ^

 
Пример переделывал - форум на квадратные скобки ругается что тэг не закрыт.
Задача - замена ВНУТРЕННИХ вложенных блоков неким текстом. Поиск по скобкам.
 
т.е. если на входе:
aaaa{bbbb{cccc}eeee}fffff gg{h{hh{dsdsci}kkk}kk}lalala
и строка замены "<stop>",
то на выходе должно быть:
aaaa{bbbb<stop>eeee}fffff gg{h{hh<stop>kkk}kk}lalala
 

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 23:06 24-11-2016 | Исправлено: dvk54, 23:11 24-11-2016
alex52mail

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

Всего записей: 1573 | Зарегистр. 04-09-2015 | Отправлено: 23:56 24-11-2016 | Исправлено: alex52mail, 02:20 26-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
> Задача - замена ВНУТРЕННИХ вложенных блоков неким текстом. Поиск по скобкам.  
 
Ну, я вижу, вы ее решили.
 
> Пример переделывал - форум на квадратные скобки ругается что тэг не закрыт.
 
Да в большинстве случаев на ругань местного недопарсера можно плевать.   А когда нельзя, то можно помимо [font=monospace][/font] образцы еще и в [no][/no] забирать.
 



alex52mail, что-то вы не по адресу.


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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
На мой предыдущий вопрос про /[[:digit:]]{6,9}/ && dt == nowdate && $3 > nowtime никто  не ответил и хорошо, в этом случае как раз нужен if, вроде получилось.
 
Есть второй вопрос: что надо в find прописать чтобы найти файлы по маске даты (dd.mm.yyyy) за текущий день и файлы с масками даты будущих дней ?
date -d before (1..30) - некрасиво
find -type f -name "*.*.*.txt" -printf "%f\n"

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 17:35 25-11-2016
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
 
 
Ну, я вижу, вы ее решили.  

К сожалению, нет.
echo "aaaa{bbbb{cccc}eeee}fffff gg{h{hh{dsdsci}kkk}kk}lalala " | gawk '{gsub("{[^}]+}", "<lim>", $0); print }'
 
на выходе:
aaaa<lim>eeee}fffff gg<lim>kkk}kk}lalala
а должно быть:
aaaa{bbbb<lim>eeee}fffff gg{h{hh[b]<lim>[/b]kkk}kk}lalala  

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 20:23 25-11-2016 | Исправлено: dvk54, 20:26 25-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54, а, извините.  Обе скобки же должны быть:
 
$ gawk 'gsub (/{[^{}]+}/, "<lim>")' <<< 'aaaa{bbbb{cccc}eeee}fffff gg{h{hh{dsdsci}kkk}kk}lalala'
aaaa{bbbb<lim>eeee}fffff gg{h{hh<lim>kkk}kk}lalala


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

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



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Недавно обнаружил, что aria2 не хочет принимать данные из stdin под linux. Под виндой работает, а под сабжем - No files to download. Даже простейшее
Цитата:
echo 'http://url/'|aria2c -i -

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 23:33 25-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ> под Linux
 
Решительно не готов поверить, что здесь что-то может зависеть от ядра.  Однако именно на нем УМВР.
 
Debian GNU/Linux Jessie, aria2c 1.18.8

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:42 25-11-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
aria2 version 1.27.1
Linux 4.4.32-rc1 #1580 Mon Nov 14 11:06:03 CET 2016 armv7l DD-WRT
Другие хавают stdin без проблем (wget, grep, sed и т.п.)
 
Добавлено:
ASE_DAG
Цитата:
не готов поверить, что здесь что-то может зависеть от ядра
Кстати, как-то открывал тикет даже на такой же случай с виндой (только с виндой) - в следующей версии исправили.

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 23:56 25-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ> aria2 version 1.27.1
 
А все равно УМВР.

$ /opt/aria2-1.27/bin/aria2c -i - <<< 'http://ya.ru'
 
11/26 02:42:34 [NOTICE] Downloading 1 item(s)
 
11/26 02:42:34 [NOTICE] Download complete: /tmp/index.html
 
Download Results:
gid   |stat|avg speed  |path/URI
======+====+===========+=======================================================
9ffac4|OK  |   839KiB/s|/tmp/index.html
 
Status Legend:
(OK):download completed.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:42 26-11-2016
Pasha_ZZZ



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

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 02:49 26-11-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG
А можно еще поинтересоваться, у вас х86 или х64?
Цитата:
Debian GNU/Linux Jessie
Просто вроде как проверили, на х64 говорят не работает и на armv7. А на x86 и armv5, например, работает...
А еще на mipsel не работает тоже
 
Добавлено:
ASE_DAG
Все-таки это был косячок-с...
https://github.com/aria2/aria2/issues/785

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 14:16 26-11-2016 | Исправлено: Pasha_ZZZ, 14:23 26-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ, amd64.  Ну и славно, что баг нашли и решили.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:33 26-11-2016
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, спасибо!
 
теперь ещё вопрос по gawk :
не могу понять его идеологию..
пытаюсь перенести последовательную обработку строк в файл, но что-то не понял, и не получается.
вот так оно работает правильно:

Код:
echo "aaa 123 bbb 456 ccc" | gawk '{gsub("123","012");print}' | gawk '{gsub("456","789");print}'
aaa 012 bbb 789 ccc
 

пишу файл 1.g:

Код:
 
BEGIN {
gsub("123","012")
gsub("456","789")
}
END{}
 

запускаю: echo "aaa 123 bbb 456 ccc" | gawk -f 1.g
и ничего не получается. (echo тут для проверки, так-то файл на входе)
смысл: Надо для каждой строки файла произвести несколько замен.
Пробовал по разному, но чего-то главного я не догнал..  с gawk только-только познакомился. интернет читал - не помогло..

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 00:02 27-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54> спасибо
 
Да на здоровье.
 
> не могу понять его идеологию
 
Идеологию языка?  Вы еще скажите «философию»...
 
> и ничего не получается
 
А что должно получится, если вы ничего не выводите?


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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
добавил в файл {print $0}
- вывело  
aaa 012 bbb 456 ccc
aaa 012 bbb 789 ccc
aaa 012 bbb 789 ccc
 
Я действительно просто не понимаю - как надо писать в файле с программой.
Приведите пример на основе предложенной строки, пожалуйста.

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 01:27 27-11-2016
ASE_DAG



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

$ cat dvk54
#!/usr/bin/gawk -E
 
{
    gsub ("123", "012");
    gsub ("456", "789");
    print;
}
 
$ ./dvk54 <<< 'aaa 123 bbb 456 ccc'
aaa 012 bbb 789 ccc

> просто не понимаю - как надо писать в файле с программой
 
Пардон, а вы не пытались изучить язык прежде, чем на нем начинать писать?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:50 27-11-2016 | Исправлено: ASE_DAG, 03:57 27-11-2016
Pasha_ZZZ



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

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 05:58 27-11-2016
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, ещё раз - СПАСИБО! Это то, что надо.

Цитата:
а вы не пытались изучить язык

Ребята, пытался!
Но - цейтнот.
Я не студент, и область профессиональная далека от.
Параллельно "изучаются" С, Perl, php, mysql - а годы уже не молодые, мозги не те.
Если, благодаря наличию примеров, "hello world" на gcc (демон: сокеты, потоки, sql) вполне работоспособна, то в случае с awk - нужных примеров не нашлось.
Я уже и так и так крутил, но НЕ ПОНИМАЮ, почему выводится строка 3 раза!
В сях понятно: блок выполняется последовательно и всё. Надо ветвление - на тебе if,case. А тут - не доходит до меня..
 

Цитата:
а в его выборе без этого знания...

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

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 09:02 27-11-2016 | Исправлено: dvk54, 09:02 27-11-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
dvk54
Может в вашей задаче вообще sed'ом обойтись?

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 10:57 27-11-2016
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
У меня недостаточно обширные знания о никсовом инструментарии, чтобы определиться.
Задача такая:  
Приходит большой файл с хаотично вкраплёнными \n \t  и пробелами.
Сначала сбивается в одну строку пробелы приводятся к нормальному виду (не более одного за раз) -  tr
Потом производится полтора десятка замен (gawk gsub).
Потом перлом парсится и пишется в БД.  
 
gawk для замены был выбран по производительности - попалась заметка с измерениями awk,perl и sed.
awk лидировал с большим отрывом.
 
Upd: Когда всё заработает - не исключено, что буду переписывать всё сразу на сях - если будет слишком медленно. Хотя работа со строками в С меня убивает. Что такое указатель я полностью осознаю, но выражение "указатель на указатель" уже вызывает kernel panic..

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 11:30 27-11-2016 | Исправлено: dvk54, 11:35 27-11-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
dvk54
Цитата:
Сначала сбивается в одну строку пробелы приводятся к нормальному виду (не более одного за раз)
Это что-то типа
Цитата:
tr -s '\n\t' ' '
а потом какие замены?

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 12:28 27-11-2016
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
угу,
-s "\t"," "  
-s "\r\n\","\n"
.. и т.д. и т.п.
а потом замены вида
(от "утра" до "вечера") заменить "8 часов пахали"
вася заменить петя
ломал - демонтировал
и т.п.
киррилица - это только для примера, так-то latin
 
уже 47 замен и это ещё не конец
 
У меня по gsub awk вот ещё какой вопрос:
конструкция [^abc] исключает символы из СПИСКА a,b,c
а можно исключить СТРОКУ?
т.е. предположим на входе racb 1cde dcfgh
надо что-то типа gsub("a[^'cd']+", "Ф")
чтобы на выходе получилось rФcde dcfgh

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 13:04 27-11-2016 | Исправлено: dvk54, 13:49 27-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
>> а вы не пытались изучить язык прежде, чем на нем начинать писать?
> У нас так было в универе. Сначала лабораторная, на которой надо было что-то делать, а потом - самая первая лекция в принципе по предмету.
 
И что, за лабораторную принимались не читая методичку?
 
dvk54
> СПАСИБО!
 
Да не за что...
 
>> а вы не пытались изучить язык
> Ребята, пытался!
> Но - цейтнот.  
> Я уже и так и так крутил, но НЕ ПОНИМАЮ, почему выводится строка 3 раза!
> В сях понятно: блок выполняется последовательно и всё. Надо ветвление - на тебе if,case. А тут - не доходит до меня.
 
Смею вас заверить, что вы уже&#769; потратили больше времени на попытки «дойти» опытным, исследовательским, путем до умолчаний, принятых в АВКе, чем понадобилось бы для того, чтоб просто прочитать хотя бы обзорную часть прилагаемой к программе инструкцию.  Ну которая (info "(gawk) Getting Started").
 
Pasha_ZZZ
> Может в вашей задаче вообще sed'ом обойтись?
 
Вы товарищу решили совсем мозги сломать?  :-)
 
dvk54
> Приходит большой файл с хаотично вкраплёнными \n \t и пробелами.
> Сначала сбивается в одну строку пробелы приводятся к нормальному виду (не более одного за раз) — tr
> Потом производится полтора десятка замен (gawk gsub).
> Потом перлом парсится и пишется в БД.
 
tr, gawk, perl — да, вот только Седа здесь еще не хватает.
 
dvk54
> конструкция [^abc] исключает символы из СПИСКА a,b,c
> а можно исключить СТРОКУ?
 
Очевидно, что [^a][^b][^c].
 
> т.е. предположим на входе racb 1cde dcfgh
> чтобы на выходе получилось rФcde dcfgh
 
Не понял, ни как это связно со «строкой», ни что это вообще за наборы бессвязных букв.  Но тем не менее, очевидная связь между ними такова:

$ gawk 'gsub (/r.*cd/, "rФcd")' <<< 'racb 1cde dcfgh'
rФcde dcfgh


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
> конструкция [^abc] исключает символы из СПИСКА a,b,c
> а можно исключить СТРОКУ?
 
Очевидно, что [^a][^b][^c].  
Очевидно, что нет: echo awbc | grep -P '[^a][^b][^c]'

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> Очевидно, что нет: echo awbc | grep -P '[^a][^b][^c]'
 
Честно говоря, я не понял возражения.

$ awk 'gsub ("foo[^a][^b][^c]", "X")' <<< 'foobar fooabr foobca foobac'
X fooabr X foobac

Что, разумеется, не отменяет того, что товарищу Двк-54 это, по всей видимости, не нужно.  Но тут как спрошено, так и отвечено.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Я вопрос понял так, что символы не должны идти подряд, т.е. реализуется это if'ом, как мне видится.
awk 'BEGIN{RS=" "} /abc/{print; next} gsub("foo[^ ]*", "X")' <<< 'fooabc fooawbc foobac'

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:50 28-11-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> Я вопрос понял так...
 
Наверное, вы правы.  Я-то не понял, чего товарищу Двк-54 на самом деле надо (кроме краткого учебника по АВКу :-).
 
Кстати, у меня появилось подозрение, что масса народу не подозревает, что помимо всякой сторонней литературы (ссылки на которую накиданы в шапке) у каждой хорошей программы есть еще и *приложенное руководство*.

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

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

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день! Подскажите пожалуйста, никак не могу разобраться.
Ubuntu Mate 15. Есть скрипт. start.sh

Код:
 
#!/bin/bash
echo "Начинаю монтирование"
mount //192.168.1.5/shara /home/user/shara -rw -o username=user,password=1
echo "Монтирование выполнено"
 

 
Задача. Добавить данный скрипт в автозагрузку после reboot. Увидеть результат выполнения, а именно echo в терминале.
Как я это вижу. Загружается система, открывается терминал, в нем выполняется скрипт от root, после чего я вижу результаты echo.
Если добавить скрипт в Startup Applications, то он запускается, но с правами обычного пользователя.
Если добавить в rc.local, то он выполняется, от root, но результата выполнения я не вижу.
В crontab так же как и в rc.local.
 
 

Всего записей: 10 | Зарегистр. 01-10-2014 | Отправлено: 15:01 05-12-2016 | Исправлено: kaktusgarden2014, 15:02 05-12-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaktusgarden2014
1. Зачем скрипт? https://wiki.ubuntu.com/MountWindowsSharesPermanently
2. Зачем вывод на экран, когда этот самый вывод "улетает", в т.ч. и при показе приглашения для входа?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:15 05-12-2016
kaktusgarden2014

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

Цитата:
2. Зачем вывод на экран, когда этот самый вывод "улетает", в т.ч. и при показе приглашения для входа?

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

Код:
ifconfig $WIFI_IFACE down && sleep 10 && ifconfig $WIFI_IFACE up && echo "$(date +"%Y.%m.%d %T") WiFi-Interface перезагружен " >> "$local_log/$log_file"

Его нужно выполнить от root, и видеть результат именно в терминале.

Всего записей: 10 | Зарегистр. 01-10-2014 | Отправлено: 16:32 05-12-2016 | Исправлено: kaktusgarden2014, 16:33 05-12-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaktusgarden2014
Ну ок, скрипт, так скрипт.
Вызвать его же тогда лучше не из rc.local, а написать systemd unit ( у Вас же там systemd? ).
Цитата:
echo hello_journal
echo hello_console > /dev/console
Как-то так должно быть.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:44 05-12-2016
kaktusgarden2014

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

Цитата:
Вызвать его же тогда лучше не из rc.local, а написать systemd unit ( у Вас же там systemd? ).

Я не большой эксперт. Что Вы имеете ввиду под  systemd unit?

Всего записей: 10 | Зарегистр. 01-10-2014 | Отправлено: 17:26 05-12-2016 | Исправлено: kaktusgarden2014, 17:26 05-12-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kaktusgarden2014
Цитата:
Что Вы имеете ввиду под  systemd unit?  
Эм.
systemd.unit(5) (man 5 systemd.unit)
А ещё, иногда стоит спрашивать google.
 
Добавлено:
kaktusgarden2014
Вообще это обсуждение скорее для Новичковой темы, чем для темы по скриптам.
И да. Вы можете использовать rc.local, он вызывается для совместимости, я просто показал Вам что если у Вас система с systemd, то будет правильнее использовать его.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:39 05-12-2016 | Исправлено: Alukardd, 22:31 05-12-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, что надо прописать в NR, чтобы вместо 132 выводилась фактическая строка, найденная по условию $3 >= now ? Без NR выводятся все строки, а мне нужна только первая.
$3 >= now && NR==132 {}

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:30 07-12-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Я не понял что Вам надо.
NR == 132, значит что условие будет истино только для 132 строки.
Предположу, что хотите Вы что-то такое: awk '$3 >= now {print; exit}'

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:52 07-12-2016 | Исправлено: Alukardd, 21:52 07-12-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
$3 >= now - делает вывод всех строк, которые подпадают под условие. Мне надо вывести только одну строку, причем первую из условия $3 >= now, т.е. она может иметь любой NR. Т.е. не первую строку из файла, а именно из условия.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 22:00 07-12-2016
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:06 07-12-2016
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Точно, {exit}, обработать одну строку и закончить блок, а не скрипт целиком. Это самый удачный вариант?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422> Точно, {exit}, обработать одну строку и закончить блок, а не скрипт целиком
 
???
 

7.4.10 The 'exit' Statement
---------------------------
 
The 'exit' statement causes 'awk' to immediately stop executing the
current rule and to stop processing input; any remaining input is
ignored.  The 'exit' statement is written as follows:
 
     'exit' [RETURN CODE]
 
   When an 'exit' statement is executed from a 'BEGIN' rule, the program
stops processing everything immediately.  No input records are read.
However, if an 'END' rule is present, as part of executing the 'exit'
statement, the 'END' rule is executed (*note BEGIN/END::).  If 'exit' is
used in the body of an 'END' rule, it causes the program to stop
immediately.
 
   An 'exit' statement that is not part of a 'BEGIN' or 'END' rule stops
the execution of any further automatic rules for the current record,
skips reading any remaining input records, and executes the 'END' rule
if there is one.  'gawk' also skips any 'ENDFILE' rules; they do not
execute.
 
(info "(gawk) Exit Statement")

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В итоге {exit} не подходит, у меня ниже есть еще обработка и она не работает при {exit}. Надо другое решение.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:33 09-12-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422, $3 >= now && !i++

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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, спасибо, то что надо было.
Мою конструкцию проще никак не сделать? Она сравнивает дату, время и т.д.  
dt == nowdate && $3 >= now && dt && /[[:digit:]]{6,9}/ && !i++ {}

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:44 09-12-2016
ASE_DAG



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

!i && $3 >= now {
    i = 1;
    print;
}

 
> dt == nowdate && $3 >= now && dt && /[[:digit:]]{6,9}/
 
Ну, dt == nowdate && dt, как нетрудно заметить, упрощается до dt == nowdate.  А по сие: /[[:digit:]]{6,9}/ — я вас уже спрашивал на предмет заменить это на что-то нормальное, но вы, кажется, так и не ответили.

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

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

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

Цитата:
А по сие: /[[:digit:]]{6,9}/ — я вас уже спрашивал на предмет заменить это на что-то нормальное, но вы, кажется, так и не ответили.

Отвечал вроде, это строки, в которых есть время в формате HH:MM. Без этой конструкции появляется ненужный текст.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:20 10-12-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422, да я как бы догадываюсь, что&#769; это такое!  Я говорил, что если вы желаете переписать это нормально, то стоило бы показать, что&#769; вы пытаетесь отфильтровать.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:39 10-12-2016
Victor_VG



Tracker Mod
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
 
Ваша задача решается много проще - повторяющийся пробел это шаблонный символ, замены в таких случаях удобнее делать через регулярные выражения - это управляемые шаблоны и вариантов библиотек их реализующих много PCRE (Perl), Lua, Oniguruma, Far Manager, ... . К примеру в PCRE если в строке нам надо найти и заменить группу из 2 и более идущих подряд пробелов одним, хоть пусть их там будет хоть бесконечность мы напишем пару регулярных выражений:
 
искать \w{1,}?\s{2,}?\w{1,}? и заменить \w{1,}?\s{1}w{1,}? и все идущие подряд заменим на один, сколько бы таких групп в нашей строке не встретилось.
 
Да, из языков программирования именно для таких задач когда-то был придуман Кобол, но он и тогда был достаточно громоздким и медленным, и его средства работы с массивами данных перекочевали в PL/1 - этот язык сочетает математику Фортрана, работу с массивами и списками данных Кобола и гибкость алгоритмов Алгола со скоростью работы программ на 1,5% - 2% меньшей чем у Ассемблера (Фортран 1,09, С 1,03, Кобол 1,18, Алгол 1,08). Микрософт объявила его "устаревшим" по простейшей причине - компилятор PL/1 сложен в реализации, а значит нужны знания и вложение денег. Первых у них исторически нет, вторые - жаба душит. Но компиляторы для него есть, хотя и дико урезанный в виде фронтэнда для GCC 4.15 и в IBM VisualAge for OS/2. Других я увы, не видел, а много лет искал.

----------
Жив курилка! (Р. Ролан, "Кола Брюньон")
Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

Всего записей: 33290 | Зарегистр. 31-07-2002 | Отправлено: 12:57 22-12-2016
ruslan910



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Комрады, состряпайте плизз с else...
 
При выполнении команды в терминале ip rule ответ

Код:
 
/etc$ ip rule
0:    from all lookup local  
32757:    from 192.168.1.217 lookup pptp  
32758:    from 192.168.1.129 lookup pptp  
32759:    from 192.168.1.144 lookup pptp  
32760:    from 192.168.1.109 lookup pptp  
32761:    from 192.168.1.110 lookup pptp  
32762:    from 192.168.1.133 lookup pptp  
32763:    from 192.168.1.195 lookup pptp  
32764:    from 192.168.1.115 lookup pptp  
32765:    from 192.168.1.245 lookup pptp  
32766:    from all lookup main  
32767:    from all lookup default  
 

 
Есть простой скрипт, который добавляет строки:

Код:
 
#!/bin/sh
ip rule add from 192.168.1.245 table pptp
ip rule add from 192.168.1.115 table pptp
ip rule add from 192.168.1.195 table pptp
ip rule add from 192.168.1.133 table pptp
ip rule add from 192.168.1.110 table pptp
ip rule add from 192.168.1.109 table pptp
ip rule add from 192.168.1.144 table pptp
ip rule add from 192.168.1.129 table pptp
ip rule add from 192.168.1.217 table pptp
ip route add default via 10.64.0.1 dev pptp-alt metric 1 table pptp
ip route flush cache
exit 0  
 

Комрады нужно сделать паровеку на уже существующие строки ip rule add from , а ip route add default всегда добавлять.

Всего записей: 428 | Зарегистр. 31-05-2008 | Отправлено: 18:52 22-12-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ruslan910
1. Что бы не было казусов с default'ным маршрутом, стоит писать ip route replace.
2. Не проще ли вместо проверок сделать одно правило на from 192.168.1.0/24?
3. Проверка будет выглядеть так:

Код:

ip ru s | grep -q 'from 192.168.1.145 lookup pptp' || ip rule add from 192.168.1.145 table pptp
Разумеется, что для каждого ip писать такое не очень, поэтому вывод ip rule show можно сохранить в переменную, а по списку ip клиентов пройтись циклом
Код:

#!/bin/bash
ip_list=$(echo 192.168.1.{115,245,247})
ip_rules=$(ip rule show)
for ip in $ip_list; do
  [[ $ip_rules =~ from\ $ip\ lookup\ pptp ]] || ip rule add from $ip table pptp
done
ip route replace default via 10.64.0.1 dev pptp-alt metric 1 table pptp
ip route flush cache


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:13 22-12-2016
ruslan910



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

Всего записей: 428 | Зарегистр. 31-05-2008 | Отправлено: 20:43 22-12-2016
CrownRU



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

Код:
"ZBDROH291B0E8059881EE6ADAC33730461604B","/DTASAP/NSP/050/INPUT/DMS/AOKNDS/egp/FBI103119201600348791_00000623","YA","jpg"
"ZBDROH2901B0E8059881EE6ADAC33730461804B","/DTASAP/NSP/050/INPUT/DMS/AOKNDS/egp/FBI10311920600348791_00000627","YA","jpg"
"ZBDROH2901B0E8059881EE6ADAC33730461204B","/DTASAP/NSP/050/INPUT/DMS/AOKNDS/egp/FBI103119201600348791_00000620","YA","jpg"
"ZBDROH291B0E8059881EE6ADAC33730461404B","/DTASAP/NSP/050/INPUT/DMS/AOKNDS/egp/FBI103119201600348791_00000626","YA","jpg"

 
Последний столбик "jpg" или еще что там может стоять, должен быть в верхнем регистре.
Я пробовал вот так сделать, но не получается

Код:
awk -F\" '{gsub ( $(NF-1),toupper ) ; print $0}' BI103119201600348792.idx

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 18:00 10-01-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Цитата:
Последний столбик "jpg" или еще что там может стоять, должен быть в верхнем регистре.  

Код:
sed 's/\(.*,\)\([^,]*\)/\1\U\2/'
Или ещё компактнее
Код:
sed 's/,[^,]*$/\U&/'

Ну и до кучи
Код:
На awk в лоб
awk -F, '{ for(i=1; i<NF; i++) printf $i","; print toupper($NF)}'
На awk по умнее
awk 'BEGIN{FS=OFS=","} {gsub(/.*/,toupper($NF),$NF); print}'  (тут как и почти везде в awk можно вместо print сделать небольшой хак: awk 'BEGIN{FS=OFS=","} {gsub(/.*/,toupper($NF),$NF)} 1')


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:53 11-01-2017 | Исправлено: Alukardd, 09:28 11-01-2017
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Огромное спасибо. С sed еще лучше - можно сразу внести изменения в файл.
 
А можно с sed сделать еще универсальнее? Чтобы с такой строкой тоже работало:
 

Код:
V742479627;1481;10012017;R5;1701100008;V7424796271481_10072824.pdf;pdf

 
должно получиться:

Код:
 
V742479627;1481;10012017;R5;1701100008;V7424796271481_10072824.pdf;PDF


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:24 11-01-2017 | Исправлено: CrownRU, 10:39 11-01-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
CrownRU
Цитата:
sed 's/[^,;]*$/\U&/'

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 10:36 11-01-2017
CrownRU



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:58 11-01-2017
shylExSSchumi

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

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 13:30 19-01-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shylExSSchumi
Например так
Код:
for i in 1 2 5 7 99 125; do /path/to/myscript.sh $i; 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:34 19-01-2017 | Исправлено: Alukardd, 14:35 19-01-2017
shylExSSchumi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как мне вывернуться, вот я я в ряде файликов удаляю строки:
find $1 -name '*.iml' -type f -print0 | xargs -0 sed -i 's/ scope=\"PROVIDED\"//g'
 
А как мне пупутно вывести названия тех файлов, где было произведена замена?

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 10:43 25-01-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shylExSSchumi
Я по прежнему за цикл...
Код:
for f in $(find $1 -name '*.iml' -type f); do
  sed -i 's/ scope=\"PROVIDED\"//g' "$f"
  echo "File is $f"
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.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> for f in $(find $1 -name '*.iml' -type f); do
 
-1

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:45 25-01-2017 | Исправлено: ASE_DAG, 16:46 25-01-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Ну да,в в таком простом случае можно обойтись find'ом и всё.
Код:
find $1 -name '*.iml' -type f -exec sed -i 's/ scope="PROVIDED"//g' {} \; -print


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:53 26-01-2017 | Исправлено: Alukardd, 10:50 26-01-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> можно обойти[сь]
 
Игра в гольф, возможно, и занятна, но согласитесь, что заслуживает внимания в первую очередь, так это то, работает программа или нет.  ;-)


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 10:48 26-01-2017
shylExSSchumi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подключаюсь к удалённой машине и скачию файлик (лог) с помощью scp.
Хочется не вводить пароль. Но никакие ключики я залить не могу на сервер.
Можно ли как-то извратиться одним только башем? Я думаю что нет, но так для проформы спрашиваю, т.е. запустить scp, подождать пару секунд и как-то? ввести пароль и нажать enter.
Сейчас я просто перед запуском scp копирую пароль в буфер обмена и потом вставка + enter.

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 11:39 30-01-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
shylExSSchumi
Можно:
а) перейти на авторизацию ключами, параметр -i
б) sshpass

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 11:50 30-01-2017
shylExSSchumi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
Хм, я наверно, тебя всё таки не понимаю.
Я не могу перейти на авторизацию ключами. У меня есть только логин и пароль. После подключения я могу весьма ограниченные команды выполнять, всё сводится к чтению текстовых файлов.
sshpass я использую сейчас, когда хочу просто подключиться без пароля. А там уже хожу по каталогам и смотрю через less. Я не могу даже при подключении автоматически поменять папку, приходится руками вводить.
Я что хочу сделать - скрипт, на вход ему имя файла. На выходе - скачивается файлик без какого-либо доп. ввода с моей стороны. Я правильно понимаю, что sshpass мне поможет?
Просто у меня дальше "автологина" с помощью sshpass не прошло.

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 12:17 30-01-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
shylExSSchumi
sshpass только для "автопароля" и используется. scp можно использовать как cp, только с возможностью указания пользователя/хоста
Цитата:
sshpass -p 'password' scp -BC user@host:/path/to/file.txt /path/to/local/file.txt
(-B - пакетный, -C - сжатие, для текстовых файлов может пригодиться)

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 12:38 30-01-2017
shylExSSchumi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, может есть в репозитарии какая тулза, которая позволяет распарсить аргументы у скрипта.
Т.е. пишу скрипт, и там у меня на вход куча параметров, такой --verbose или такой --limit=10.
Хочется условно что-то внешнее запустить и чтобы быстро получить, а есть ли такой аггумент или если есть такой аргумент, то какое у него значение.

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 15:39 03-02-2017
Pasha_ZZZ



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

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 18:03 03-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Угу, но и самому распарсить аргументы руками совсем не сложно.
 
И да, в bash'е есть встроенный getopts, хотя он достаточно ущербный, в отличии от предложенного внешнего.

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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, буду сам руками - http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 10:10 04-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ответ на http://forum.ru-board.com/topic.cgi?forum=65&topic=6043
 
Remdale
Итерироваться по файлам и копировать проще всего командой find Можно и самому реализовать рекрсивный обход на баше, но если find есть, то к чему извращаться...
С dd надо будет немного усложнить: for f in $(find /path/ -type f); do dd if="$f" of="/newpath/$(basename $f); done
А вот с cp просто указать ключ -R и усё.
 
Что за бред, что у cp нету прав на чтение файла, а у dd вдруг они имеются?..
 
 
p.s. все команды писал прямо в сообщеньку не проверяя

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:10 05-02-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> for f in $(find /path/ -type f); do
 
Что с вами?  Второй раз подряд детская и грубая ошибка, причем та же самая.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Вы про то, что я не использовал exec? Ну я это тут намерено сделал... На скорость оно не особо влияет. Но это понятнее чем писать конструкцию {}. Если файлов там миллионы, тогда да, но это редкость.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:36 05-02-2017 | Исправлено: Alukardd, 16:37 05-02-2017
Remdale

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть Montavista 4.0 на плеере Archos 704. Устройство само по себе закрыто от постороннего вмешательства. Но нашлась одна дыра, через которую можно исполнять свои команды. Но они исполняются не от рута. "sudo" командная строка не понимает. Поэтому команда "cp" не работает на некоторых файлах из-за прав доступа. А вот dd умеет сливать файлы не обращая внимание на права доступа. Я хочу слить все файлы из ото всюду, в другое место.  
 И есть еще один вопрос. Какой еще есть вариант исполнения команды от имени рута? Читал что-то насчет символа #, но так и не понял как его правильно использовать

Всего записей: 206 | Зарегистр. 25-10-2010 | Отправлено: 18:18 05-02-2017
ASE_DAG



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

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

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



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Это наверное про Bash pitfalls #1

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 18:59 05-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
А, это работа меня развращает, в командной строке я всегда знаю с каким данными работаю. А в скриптах пишу побольше защит от дураков и различных пустот, пробелов и так далее. Да, сорян. советовать так не стоит((
 
Добавлено:
Так должно быть норм
while read -r f; do [[ -z $f ]] && continue; echo "f is $f"; done <<<"$(find /tmp/test/ -type f)"

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 23:31 05-02-2017 | Исправлено: Alukardd, 14:45 28-02-2017
shylExSSchumi

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что-то не соображу, как упросить.
Задача: найти определённые строки в определённом файлике. Файлик лежит где-то глубоко в какой-то подпапке.
 
find ./ -name MyMailService.java | xargs fgrep 'mailService.'

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 16:30 10-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
shylExSSchumi
BASH 4 поддерживает рекурсивный глоббинг, ** (должна быть включена опция globstar)

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 16:41 10-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shylExSSchumi
Разве что так: find ./ -name MyMailService.java -exec fgrep 'mailService.' "{}" \;

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:59 10-02-2017 | Исправлено: Alukardd, 16:59 10-02-2017
shylExSSchumi

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

Всего записей: 114 | Зарегистр. 28-03-2016 | Отправлено: 18:38 10-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
shylExSSchumi
Ваш вариант использует не любимый мной xargs, ну тем не менее его всё равно надо приводить в порядок и тогда, возможно, он Вам уже не покажется "более понятным"...
find ./ -name MyMailService.java | xargs -I {} fgrep 'mailService.' "{}"
или так
find ./ -name MyMailService.java -print0 | xargs -0 fgrep 'mailService.'  (в "чистоте" этого варианта я менее уверен)

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 19:07 10-02-2017 | Исправлено: Alukardd, 19:09 10-02-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ> BASH 4 поддерживает рекурсивный глоббинг
 
А ГНУ Греп — рекурсивный обход по шаблону, если уж на то пошло.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Это да, а в сочетании с опцией --include=GLOB он полноценно заменил бы связку find ... grep.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 05:32 11-02-2017
zedxxx

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос по aria2c (сильно не пинайте, форум редиректит в этот топик).
Использую её для загрузки торрентов и есть необходимость добавить руками пира по ip:port. Это как-то возможно сделать? В доках не нашел...

Всего записей: 1506 | Зарегистр. 14-07-2008 | Отправлено: 18:26 16-02-2017 | Исправлено: zedxxx, 18:27 16-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Наверное подходящий топик... надо сконвертить JSON в строку с разделителями. К примеру такой:
Цитата:
{"name1":111,"name2":[[22,3333,44444,555,6666,"Name3","Name4"],[77,888,9],[0,11,222]]}
в строки надо сконвертировать все вложенные в массив name2 массивы, по отдельности. Т.е. на выходе должно быть
Цитата:
22;3333;44444;555;6666;Name3;Name4
77;888;9
0;11;222
В общем, через jq -c '.name2[]' получается
Цитата:
[22,3333,44444,555,6666,"Name3","Name4"]
[77,888,9]
[0,11,222]
а дальше, если добавить к строке | join(";") - ошибка
Цитата:
jq: error (at <stdin>:24): string ("") and number (22) cannot be added
exit status 5
и как применить tostring не ко всему массиву, а к каждому элементу - не нашел.

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 06:48 18-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
jq -r '.name2[] | @csv'
Как красиво заменить запятую на точку с запятой что-то не придумалось или туплю
 
Можно так
jq -r '.name2[] | @csv | gsub(",";";")', но если запятая будет внутри значения, то она так же заменится, что плохо...

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:13 20-02-2017 | Исправлено: Alukardd, 13:24 20-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
Да я уж разобрался, без костылей и с любым символом:
Цитата:
jq -r '.name2[] | [ .[] | tostring ] | join(";")'

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 14:19 20-02-2017 | Исправлено: Pasha_ZZZ, 14:21 20-02-2017
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть небольшой скрипт, ищет в папке в файлах txt и log текст "error"  и выводит содержимое в отдельный файл. Все устраивает за исключением того, что если в файлах строки с "error" нет, то все равно появляется строка "### имя файла". Можно исправить?
 

Код:
 
for i in $(find $DATE_YM/$DATE_YMD/ -type f -name "*.txt" -printf "%f \n" -o -name "*.log" -printf "%f \n"); do
    for k in $(find $DATE_YM/$DATE_YMD/ -type f -name $i); do
    (echo ""; echo "###" $i; gawk "/error/" $k) > $oufile
done
done
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 17:18 24-02-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
Не знаю, что там у вас в файлах, но стоит попробовать grep -lH

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 17:36 24-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Только вот на этой станице практически идентичную задачу решали
Код:
while read -r f; do
  [[ -z $f ]] && continue
  res=$(grep error "$f")
   [[ -n $res ]] && echo "### $(basename "$f") $res"
done <<<"$(find "$DATE_YM/$DATE_YMD/" -type f -name '*.txt' -o -name '*.log')"


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:45 24-02-2017 | Исправлено: Alukardd, 14:44 28-02-2017
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, это не совсем моя задача, тем более я при постановке задачи ее немного упростил, у меня в конструкции gawk "/error/" $k параметров на пару строк, идет выборка по времени, чтобы отчеты не повторялись и др., поэтому grep тут не справится. Я думаю не буду трогать тот скрипт, лучше обработать итоговый файл, а выглядит он так:

Код:
 
1.  Когда в файлах нужная строка не найдена
### событие1
 
### событие2
 
### событие3
 
2.  Когда в файлах строка найдена.
### событие1
09:02:47:22:  что-то есть в логах
 
### событие2
10:05:42:22:  что-то есть в логах2

 
Мне надо не выводить в конечный файл то что в п.1.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 12:30 25-02-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
ну замените grep на awk и всё будет работать, главное что бы awk выдавал вообще пустоту если нету совпадений и не печатал там пустые строки. например. Если там есть пробелы и прочее в случае неудачи, то надо просто изменить проверку $res на то что Вам подойдёт.
Ну либо можно вообще все эти проверки и выводы сделать внутри awk, скажем в блоке END.
 
Тут, так сказать, нету Вашего кода — нету и примеров.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:13 25-02-2017
KrgUser

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
 
Есть переменные a и b, это наборы строк, и эти наборы отличаются на одну строку, причем эта строка может находиться в любом месте набора. Задача --- выделить как раз эту строку, "вычет"
Работает эта команда
Код:
diff --changed-group-format='%<%>' --unchanged-group-format='' <(echo "$a") <(echo "$b")
но, к сожалению, под MSYS это не подходит
 
Как решить задачу с помощью sed?
 
Спасибо

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 13:42 08-03-2017 | Исправлено: KrgUser, 13:43 08-03-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KrgUser
> Есть переменные a и b...
 
Не вижу.
 
> не подходит
 
Почему?  Чего не хватает?
 
> Как решить задачу с помощью sed?
 
Перректально.  Откуда такое ограничение на инструмент?
 
Добавлено:
KrgUser, так, ладно, не буду вас ждать:

$ comm -3 <(sort <<< "$a") <(sort <<< "$b")


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:20 08-03-2017
KrgUser

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Не вижу
А разве недостаточно сказанного
Цитата:
Есть переменные a и b, это наборы строк

Цитата:
Почему?  Чего не хватает?
Жалоба на то, что каналы (pipes) не реализованы. По этой же причине не будет работать
Цитата:
$ comm -3 <(sort <<< "$a") <(sort <<< "$b")
Подобные вещи уже попробовал
Цитата:
Откуда такое ограничение на инструмент?
Да в общем-то нет ограничения, просто интересно, можно ли таким способом. И, ничего извращенного не вижу в этом
 
Добавлено:
Если совсем уж туго с воображением, вот пример:
a:
qweqw wdw ssacasc
asd xccvdv sdfds
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg
 
b:
qweqw wdw ssacasc
asd xccvdv sdfds
assdasd sdfsdf dfgfghfgjh sdfsd
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg
 
И уточню еще раз: нужно, чтобы работало под MSYS

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 15:46 08-03-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KrgUser
> Если совсем уж туго с воображением...
 
Странная однако у вас тактика — просить помощи и при этом хамить.
 
> Да в общем-то нет ограничения
 
Странно, а только что было...
 
> просто интересно, можно ли таким способом.
 
Можно.  Сед — полный по Тьюрингу язык.
 
> нужно, чтобы работало под MSYS
 
У меня нет этого вашего MSYS, и я так понял, что на ГНУ его априори поставить нельзя, но heredoc-то там, я надеюсь осилили:
 
#!/bin/bash
 
a='qweqw wdw ssacasc
asd xccvdv sdfds
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg'
 
b='qweqw wdw ssacasc
asd xccvdv sdfds
assdasd sdfsdf dfgfghfgjh sdfsd
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg'
 
readarray -t A <<< "$a"
readarray -t B <<< "$b"
 
for i in ${!B[@]}; do
    if [[ ${A[$i]} != ${B[$i]} ]]; then
        printf '%s\n' "${B[$i]}"
        break
    fi
done


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:36 08-03-2017
KrgUser

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

Цитата:
Странная однако у вас тактика — просить помощи и при этом хамить
Укажите, где я хамил? Я лишь отвечал в тон Вашему ответу. Мне показалось странным, что столь опытному пользователю непонятно утверждение типа
Цитата:
переменные a и b, это наборы строк


Цитата:
Странно, а только что было...
Опять же, укажите, где я ставил ограничения? Я всего-то лишь спросил
Цитата:
Как решить задачу с помощью sed?
Говоря Вашим языком, не вижу ограничений

Цитата:
...вашего MSYS
Вы делаете мне честь). Таки, это не моя разработка
Цитата:
...но heredoc-то там, я надеюсь осилили
Насчет доков не скажу, но вот Ваша конструкция опять не пашет
Цитата:
readarray: command not found
В MSYS реализовано очень много утилит Unix, но, к сожалению, с ограничениями
 
В любом случае, спасибо за ответы
На всякий случай: я использую следующую сборку MSYS
https://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/msys%2B7za%2Bwget%2Bsvn%2Bgit%2Bmercurial%2Bcvs-rev13.7z/download

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 19:57 08-03-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
KrgUser
Сохранить переменную a в файл и использовать grep -Fv -f... или вот просто без sed вообще никак?

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 02:08 09-03-2017
KrgUser

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
Использовать файлы, конечно, самый простой способ, но хотелось бы по возможности обойтись без этого (надо подчищать все время и такое)
Цитата:
...или вот просто без sed вообще никак?
Ну почему же? Главное, работало под MSYS

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 08:40 09-03-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KrgUser> Укажите, где я хамил?
 
Мне казалось, я вас процитировал.
 
> Опять же, укажите...
 
Извините, русский язык — ваш родной?
 
> В MSYS реализовано очень много утилит Unix, но, к сожалению, с ограничениями
 
Ну, readarray — не утилита, и по смыслу не может ей быть, это часть Баша.
 
Что же там у вас, такая версия, что вообще массивов еще нет?
 
$ echo $BASH_VERSION

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

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

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
3.1.17(1)-release

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 10:33 09-03-2017
thejustsoul



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KrgUser
Может не в тему, но есть еще MSYS2.

Код:
$ echo $BASH_VERSION
4.4.12(1)-release

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 15:13 09-03-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KrgUser> 3.1.17(1)-release
 
Ну массивы вроде бы есть, и на том хорошо.
 
Вот так, возможно, прокатит:

#!/bin/bash
 
a='qweqw wdw ssacasc
asd xccvdv sdfds
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg'
 
b='qweqw wdw ssacasc
asd xccvdv sdfds
assdasd sdfsdf dfgfghfgjh sdfsd
asdas cvcvb dfgfgdhg
123 4554gffdgfe  dgffdgg'
 
IFS=$'\n' read -r -a A -d '' <<< "$a"
IFS=$'\n' read -r -a B -d '' <<< "$b"
 
for i in ${!B[@]}; do
    if [[ ${A[$i]} != ${B[$i]} ]]; then
        printf '%s\n' "${B[$i]}"
        break
    fi
done


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:54 09-03-2017
KrgUser

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
thejustsoul
Цитата:
Может не в тему, но есть еще MSYS2
В тему, но про это я знаю, и MSYS2 мне не нравится по разным причинам:
1) То что требует инсталляции (вместе с дурацким web-загрузчиком). MSYS можно скачать в виде простого архива --- распакуй и работай
2) Какие-то идиотские ограничения (например, нельзя устанавливать на FAT --- с правами, что ли, мудрят, а так ли они нужны?)
 
ASE_DAG
Цитата:
Вот так, возможно, прокатит
Спасибо, прокатило
 
А sed спрашивал потому, что хотелось решения проще

Всего записей: 86 | Зарегистр. 26-04-2011 | Отправлено: 05:51 10-03-2017
ForposT_ForeveR



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте.
Помогите, пожалуйста, решить проблему.
В файле ips находится большое количество IP адресов, которые необходимо прогнать через GEO IP и записать вывод в два файла:
Название 1го файла: short/[country code]
Сюда записать только IP
Название 2го файла: full/[country_code]
IP, State.... ZIP
 
Пример команды GEO IP:
https://snag.gy/u09TfL.jpg
 
Необходим bash скрипт.

Всего записей: 525 | Зарегистр. 11-12-2004 | Отправлено: 04:03 12-03-2017
Alukardd



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

Код:
#!/bin/bash
 
cd /path/to/project/root/folder
 
IPFILE="ips.list"
 
mkdir -p short
mkdir -p full
 
while read -r ip; do
  res="$(geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat $ip | awk -F: '{print $2}')"  # это бред, geoiplookup хорошо бы уметь не писать ненужную метаинформацию о себе в каждом ответе
  country="$(awk -F, '{print $1}' <<< "$res")"
  echo "$ip" >> "short/$country"
  echo "${ip}, $res" >> "full/$country"
done <"$IPFILE"
(писал прямо здесь без проверок)

Цитата:
Пример команды GEO IP:  
ну сколько можно выдавать две строки текста в виде картинки, вместо текста?!

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:33 12-03-2017 | Исправлено: Alukardd, 13:36 12-03-2017
karavan



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

Цитата:
ну сколько можно выдавать две строки текста в виде картинки, вместо текста?!

С этим надо смириться - не каждый новичок из всех имеет удобный терминал с поддержкой копипасты

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 14:51 12-03-2017
mithridat1



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

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

Смешно.Сложно найти терминал без копипасты

Всего записей: 4961 | Зарегистр. 05-01-2006 | Отправлено: 15:06 12-03-2017 | Исправлено: mithridat1, 15:06 12-03-2017
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mithridat1
Легко, доступ к VNC на консоль VPS через браузер.  
Только про ssh тссс, нас могут услышать

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 15:50 12-03-2017
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет. Наваял тут творение. Скрипт вроде работает, но совсен не оптимирован.
Учитывая то, что скриптом будет пользоваться "сторож", хотелось бы выслушать советы по улучшению и как избавиться от слипов.
 
Скрипт должен закрыть 3 процесса - 2 от Websphere и один DB2.
Думаю в скрипте все понятно.
 

Код:
ECLIENTPID=$(pgrep -f "eclient server1")
ICMRMPID=$(pgrep -f "icmrm server1")
 
kill_eclient()
{ if kill -0 $ECLIENTPID; then echo Prozess runs yet and swill be closed; kill -15 $ECLIENTPID ; fi  
sleep 30
if kill -0 $ECLIENTPID; then echo Prozess runs yet and will be destroyed closed; kill -9 $ECLIENTPID ; fi
sleep 10
STOPPID=$(pgrep -f "stopserver.sh eclient")
if kill -0 $STOPPID ; then kill -15 $STOPPID; fi
sleep 10
if kill -0 $STOPPID ; then kill -9 $STOPPID; fi }
 
kill_icmrm()
{ if kill -0 $ICMRMPID; then echo Prozess runs yet and swill be closed; kill -15 $ICMRMPID ; fi
sleep 30
if kill -0 $ICMRMPID; then echo Prozess runs yet and will be destroyed; kill -9 $ICMRMPID ; fi }
 
echo '-----------------------------------------------------------------------------'
echo '>>> 'eClient shutdown...
echo '-----------------------------------------------------------------------------'
 
(     /opt/IBM/WebSphere/AppServer/profiles/eclient/bin/stopServer.sh  server1 ) &
LASTPID=$!
sleep 60
kill_eclient
( sleep 20 && kill -15 -$LASTPID ) &
 
sleep 15
 
echo '-----------------------------------------------------------------------------'
echo '>>> 'ResourceManager shutdown...
echo '-----------------------------------------------------------------------------'
(     /opt/IBM/WebSphere/AppServer/profiles/icmrm/bin/stopServer.sh server1 ) &
LASTPID=$!
sleep 60
kill_icmrm
( sleep 20 && kill -15 -$LASTPID ) &
sleep 15
 
echo '-----------------------------------------------------------------------------'
echo '>>> 'DB2 shutdown...
echo '-----------------------------------------------------------------------------'
su - db2icm -c db2stop
echo '>>> 'Wait 30s
sleep 30
echo '>>> 'Stoppe DB2 FORCE ...
su - db2icm -c "db2stop force"

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:27 24-03-2017
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую,  
вопрос по массовому редактированию - примерно 1000 файлов html, все на виртуальном хостинге,   в одной директории. Можно конечно скачать и потом регулярками в notepad++ как то, но подумалось, раз есть ssh, может напрямую проще будет? Впрочем, если нет, то  notepad++ оставляю в уме про запас.
 
Структура всех файлов одна, вот один из исходных файлов. Заменил на txt, чтобы проще открывался код.
http://alexander-naumov.com/data/test/AN01_12.txt
Надо удалить все строки, начиная - все что под тегом <header>, дальше все что под <div class=" container"> , те несколько br что идут дальше до <div style="margin-left:35px;">, и заканчивая следующим <font color="#000000">.  
В файле примере дальше идет второй <body>, соот-но это ошибка, и тоже надо удалить, но эта ошибка есть не во всех файлах.
 
Теперь - присутствуют тоже не во всех файлах, но есть - выше <header> подключаются пару стилей,  их тоже надо удалить, если они есть. Вот они.
<link href="../../css/layout.css" rel="stylesheet" type="text/css" />
<link href="../../css/menu.css" rel="stylesheet" type="text/css" />  
 
Строку <div style="margin-left:35px;"> надо заменить на <div class="archive">
 
И последнее.  
В примере есть 6 картинок, встречаются не во всех файлах.
Там где они есть, надо относительные пути заменить на абсолютные.
Т.е. было src="../../pics/.."
надо чтобы стало  src="http://mysite.com/pics/.."
В принципе больше ничего не надо, достаточно чтобы файл стал таким:
 
http://alexander-naumov.com/data/test/test2.txt
 
Главное - если найти - заменить еще как то понимаю, по большому счету возможно смогу сам разобраться, то с тегами засада.
 
Если кто подскажет, буду признателен.

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 22:40 01-05-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
Что-то вы дохрена менять хотите...
Ну я бы решал её с помощью Ruby::Nokogiri, оно как-то поудобнее всего остального будет.
А так можно пытаться использовать и другие ЯП под это дело, или пытаться ужиться с xmllint
 
 
Вот например, как вырезать div
Код:
#!/usr/bin/env ruby
 
require 'nokogiri'
 
data = File.read(ARGV[0])
 
 
doc = Nokogiri.HTML( data )
doc.css('div[class="container"]').each do |el|
  #el.replace( el.inner_html )
  el.remove()
end
puts(doc.to_html)
(примеры того как и что можно выбирать из HTML'я — http://ruby.bastardsbook.com/chapters/html-parsing/)

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

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



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

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 09:46 06-05-2017
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Weinaum
Цитата:
Можно конечно скачать
Можно сразу подключить диск через SFTP Net Drive

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 10:34 06-05-2017
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Комрады, помогите разобраться со скриптом.
Хочу выловить файл, раскрутить его на части, чтобы потом использовать в скрипте.
Собрал такую штуку. Хотелось бы, чтобы в командной строке сперва обрабатывался аргумент $1 , ну а потом уже аргументы getops. типа вот так:
script.sh <$1> <getopts>
 
 

Код:
BASEDIR="/long/long/path"
INST=$(find "$BASEDIR" -type f -name conf.ini.$1)
INSTP=$(awk /\^INSPORT/'{ print $2 }' $INST)
WEBP=$(awk /\^WEBPORT/'{ print $2 }' $INST)    
 
while getopts "lsf" Option
do
case $Option in
l)
lsof -i:$INSTP -i:$WEBP;;
 
s)
echo "stops -i $BASEDIR$INST";;
 
f)
echo "nohup starts -i $BASEDIR$INST &";;
esac
done

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:17 17-05-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Цитата:
Хотелось бы, чтобы в командной строке сперва обрабатывался аргумент $1 , ну а потом уже аргументы getops
Так после того как поюзал $1, вызови команду shift (man bash).
 
 
Добавлено:
А вообще я предлагаю опции разбирать самому. Заодно, такой подход позволяет использовать и long options, а так же ему всё равно где стоит позиционный параметр — до, после или между опций.

Код:
#!/bin/bash
 
# args — array with positional parameters
# options — array with options and it's args. Needed for recursive call this script/function itself.
declare -a args options
 
# fix for long options anyeater
set -f
set -- $(sed -E 's/(--[^=]+)=/\1 /g' <<< "$@")
set +f
 
# parse options
while [ $# -gt 0 ]; do
  case "$1" in
    --interdc-replicas|-i)
          idcreplicas=true
          options+=("$1")
          ;;    
    --cluster_num)
          cluster_num="$2"
          options+=("$1" "$2")
          shift
          ;;
    --*|-*)
          PrintHelp
          return 1
          ;;
    *)
        args+=("$1")
        ;;
  esac
  shift
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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:53 17-05-2017 | Исправлено: Alukardd, 15:16 17-05-2017
thejustsoul



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

Цитата:
В тему, но про это я знаю, и MSYS2 мне не нравится по разным причинам:
1) То что требует инсталляции (вместе с дурацким web-загрузчиком). MSYS можно скачать в виде простого архива --- распакуй и работай
2) Какие-то идиотские ограничения (например, нельзя устанавливать на FAT --- с правами, что ли, мудрят, а так ли они нужны?)  

Тут есть portable, без всяких установщиков:
http://repo.msys2.org/distrib/x86_64/
Распаковать в удобное место, 2 раза запустить msys2_shell.cmd (о чем будет написано в окошке).
На FAT установилось без проблем (архивом выше), проверил только что.
MSYS2 круче тем, что в нем есть pacman, если вы понимаете о чем я.
 
Добавлено:
Господа, кто поделится надежнейшим bash-скриптом (Debian), для бекапа папок с сайтами и баз мускула?
У меня конечно есть несколько самописных мини-скриптов, но их нужно переписывать и оптимизировать, и нагугленных, которые тоже не идеальны, вдруг у вас есть что-то получше. Чем проще\меньше и надежней скрипт, тем лучше. Пакеты которые надо устанавливать в систему не предлагать, только standalone-скрипты.

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 15:18 17-05-2017
karavan



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

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 16:01 17-05-2017 | Исправлено: karavan, 16:01 17-05-2017
thejustsoul



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

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

Да выкладывайте погляжу-)

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 19:00 17-05-2017
karavan



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

Цитата:
У меня простенькие скрипты

У меня не сложнее, но он один.
Когда я админил некоторое множество сайтов на различных движках, то сделал следующее.
На хранилке для каждого сайта была своя директория, пример:

Код:
# pwd; ls -l
/Storage/Sites/turism
итого 8
drwxr-xr-x 2 nobody nobody 4096 Окт 21  2015 archive
drwxr-xr-x 2 nobody nobody 4096 Окт 21  2015 scripts

 
В директории scripts лежал backup.bash одинаковый для всех движков, а рядом подключаемый из скрипта variables.txt, в котором указывал индивидуальные значения переменных.
Скрипт работал с хостингами через ssh по ключам.
В хомяке учетной записи, из-под которой запускался скрипт, был файл ~/.ssh/config с параметрами для каждого хостинга.
В кроне для каждого сайта была своя строчка.
 
backup.bash
 
variables.txt
 
Скрипту уже более 4-х лет. На тот момент меня устраивали бэкапы без какого-либо контроля успешности.
Сейчас я бы добавил еще строчку по удалению некоторого файла на стороне хостинга после создания архива, а на хостинге бы включил вечернее создание файла и утреннюю проверку по наличию этого файла, и через шлимыло кидал бы ворнинги.
Так-же, можно было бы заменить bzip2 на вариацию 7z или pbzip2 - для многоядерных систем это дало бы прирост в скорости создания архива.
И еще, можно убрать множественные подключения ssh и засунуть все команды в одну сессию.
Конфиги nginx, apache, php.ini менялись на столько редко, что добавление их в ежедневный бэкап не требовалось.
 
 
Добавлено:
К слову о бэкапах.
Два месяца, как меня познакомили с git, SaltStack и новым взглядом на сущность любого кода и конфигов.
Теперь я не вижу смысла делать архивацию сайта, только базы данных.
Восстановление сайта или даже всего окружения на какое-либо состояние происходит несколькими командами из консоли.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 23:07 17-05-2017 | Исправлено: karavan, 23:34 17-05-2017
ASE_DAG



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

$ bashdb aluopts --cluster_num '~/Рабочий стол'
bashdb<0> fin
bashdb<1> x $cluster_num
~/Рабочий

 
> return 1
 
Скопировали из подпрограммы, забыв заменить на exit.  :-)  Ну shift’ов, кажется, не хватает.
 
> Единственное  
 
Не единственное.
 
Добавлено:
CrownRU, по существу уже ответили — shift.
 
А не по существу, я откровенно не понял, что здесь вообще происходит — что это за вывод приказов на стандартный вывод?  Или это не более, чем примера ради?

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

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



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

Цитата:
А не по существу, я откровенно не понял, что здесь вообще происходит — что это за вывод приказов на стандартный вывод?

 
Вобщем да. Я уже рассказывал, есть куча инстанций. С ними нужно много всяких дел делать - от проверок работает/не работает до старт/рестарт/kill -9 и прочее.
Вот и хотел скриптик написать, чтобы из одного места все делать можно было.
Пока мое творение не работает

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:25 18-05-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
aluopts --cluster_num '~/Рабочий стол'
Да, это строка с  set ломает норм обработку (вернее command substitution). Надо бы пофиксить как-то.
 
Добавлено:
Чот ни чего не придумалось, надо просто убрать этот fix for long options anyeater, и забыть про то что можно использовать опции через знак равенства (=).

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> надо просто убрать этот fix for long options anyeater, и забыть про то что можно использовать опции через знак равенства (=)
 
Да, действительно, что что может быть проще?  ;-)  Знак равенства — забыть.  Слитная нотация кратких опций — забыть.  Возможность сокращать длинные опции — да кто про это вообще помнит!

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

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



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 20:00 19-05-2017
MihailM



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите решить задачку : в "Облаках" есть такая функция как дедупликация чтоль , в линукс ос она как я понимаю тоже есть ну или что похожее, вопрос , как удалить все старые копии таких(одинаковых) файлов ?  

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 11:16 28-05-2017 | Исправлено: MihailM, 11:17 28-05-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MihailM
Что-то вы путаете, пока я не понял о чём речь. Дедупликация это дедупликация. Копии файлов это копии файлов. Жёсткие ссылки это жёсткие ссылки.
О чём именно речь?
 
Дедупликация это редкость. она есть в малом количестве софта, например ZFS.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:06 28-05-2017
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 13:12 28-05-2017
MihailM



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
ASE_DAG
Цитата:
MihailM> в "Облаках"  

В облачных хранилищ .
 
Возможно это по типу как архивные копии=невидимые чтоль , я не знаю как это точно обозвать )
Просто синхронизировал папку с помощью rsync.  И похоже что 1 и тот же файл записался еще раз , по типу , как в дедупликации происходит , только с разным временем чтоль.  Вот как удалить старые файлы, точнее очистить в файловой системе , наверное так это называется правильно ???
А файлы , в том же каталоге, но имеют другую дату и время и скрытые наверное .
Синхронизировал вот этой командой "rsync -avh  откуда куда" , просто после нескольких операций умудрился диск забить теперь )  
Просто как то заметил , когда копировал по фтп - делал бекап, 1 и тот же файл когда попадал , то иногда приходилось его подтверждать на перезапись. Вот и привел , как дедупликацию в виде примера . Я просто в этом нуб , и тонкости не знаю еще . И вообще такое возможно ?

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 13:29 28-05-2017 | Исправлено: MihailM, 13:39 28-05-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MihailM> В облачных хранилищ
 
Не понимаю вас.
 
> Возможно это
 
Возможно.
 
>  я не знаю как это точно обозвать
 
Не надо никого «обзывать», об’ясните, что&#769; надо по сути.
 
> похоже что 1 и тот же файл записался еще раз
> А файлы , в том же каталоге, но имеют другую дату и время и скрытые наверное
 
Это ваши фантазии, как я понял?
 
> когда копировал по фтп - делал бекап, 1 и тот же файл когда попадал , то иногда приходилось его подтверждать на перезапись
 
А это то *единственное* наблюдение, из какого вы выводите все фантазии, так?
 
> "rsync -avh  откуда куда" , просто после нескольких операций умудрился диск забить теперь
 
А это собственно то, что побудило вас фантазировать?  Вы делали резервную копию — и у вас закончилось место на целевом диске?  На том и весь вопрос, верно?
 
> по типу , как в дедупликации происходит
 
???
 
> как удалить старые файлы
 
Ну, приказ # rm -fr /*, я думаю, удалит.  :-D

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:05 28-05-2017 | Исправлено: ASE_DAG, 14:11 28-05-2017
MihailM



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

Цитата:
Дедупликация это редкость.
То есть в никсах , такого нет . Просто ,
Цитата:
когда копировал по фтп с никсах подобной ОС - делал бекап себе на винду , 1 и тот же файл когда попадал , то приходилось его подтверждать на перезапись  
 
Вот свежий пример : http://prntscr.com/fd0qh9 ..
Зараза забываю , что файлы имеющие одинаковое название , но разные регистры букв в названии - для линукс-подобных ОС, это разные файлы . А для винды они одинаковые )
Вот это меня и сбило с толку . Вот и подумал , мож , есть что похоже в линуксах.  

Цитата:
 "rsync -avh  откуда куда"  

При такой команде , если файл совпадает, он же перезаписывается ?
 
ASE_DAG

Цитата:
 
Ну, приказ # rm -fr /*, я думаю, удалит.  :-D

И нафиг мне всё удалять.
 
Добавлено:
ASE_DAG

Цитата:
А это то *единственное* наблюдение, из какого вы выводите все фантазии, так?  

Зато у вас с фантазией всё хорошо , а у меня вот что http://prntscr.com/fd0qh9.  
Вообщем сам разобрался, похоже и вправду место забить умудрился )
 
Добавлено:
Что то запутался с Жесткая ссылка и Символическая ссылка , чем они все таки отличаются . Что то читаю и понять не могу.  
Какую мне делать ссылку , если я хочу чтобы по этой ссылке скачался нужный файл по этой ссылке ?
А то думаю отказаться от копирования файлов и заодно потерей места на жестком диске, а использовать сим-линк . Как лучше это сделать просто командой ln или же ln -s , включив при этом подпапки внутри каталога-ов  ?

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 15:52 28-05-2017 | Исправлено: MihailM, 17:57 28-05-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MihailM> Что то запутался с Жесткая ссылка и Символическая ссылка , чем они все таки отличаются.
 
Жесткая ссылка — это ссылка с имени файла на его содержимое, а если быть точнее, то на порядковый номер в таблице.  Символьная же ссылка — это ссылка с имени на иное имя.
 
Это разные уровни абстракции — символьные ссылки без жестких существовать не могут.  Если у нас есть файл a и символьная ссылка b -> a:

789405 -rw-r--r-- a
789406 lrwxrwxrwx b -> a

, а вы запросили у системы b, то она для вас: перейдет по жесткой ссылке с b на inode № 789406, найдет там символьную ссылку на a, перейдет по жесткой ссылке с a на 789405, и найдет там его содержимое, какое и отдаст за содержимое b.
 
> Какую мне делать ссылку, если я хочу чтобы по этой ссылке скачался нужный файл?
 
Очевидно, на нужный файл.  ;-)
 
> А то думаю отказаться от копирования файлов...
 
Тут нечего комментировать, вы не пояснили, зачем вы их копируете.
 
>  использовать сим-линк . Как лучше это сделать просто командой ln или же ln -s
 
Говорят, что хороший вопрос содержит в себе половину ответа.  Ваш же вопрос содержит в себе ответ целиком: «симлинк».
 
> включив при этом подпапки внутри каталога-ов?
 
Если вы еще не прочли, то сообщаю, что множественные жесткие ссылки на каталоги на практике запрещены.

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

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



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MihailM
Для поиска дублей существуют специальные программки:
 
fdupes
fslint
dupmerge
 
море их. Посмотрите как ими пользоваться в интернете.
 
Можно что-то такое намутить:

Код:
md5 -r * | sort -t ' ' -k 4 -r | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm

 
Насчет дедубликации... Я так понимаю, что Вы хотите устроить файлопомойку. Попробуйте btrfs или если в облаках хотите, то что-то вроде opendedup.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:30 09-06-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MihailM
Цитата:
>  "rsync -avh  откуда куда"  
При такой команде , если файл совпадает, он же перезаписывается ?  
нет конечно, rsync на то и придуман.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:59 09-06-2017 | Исправлено: Alukardd, 13:59 09-06-2017
MihailM



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU , да нет - вообще то это для другого. А так просто иногда когда делаю бекап файлов на винду , проскакивает сообщение типа файл уже есть ну и вопрос "Перезаписать или НЕТ", вот и подумал вдруг там 2 файла одинаковых , ну или типа дедупликации что. Но разные скажем по времени изменения или еще что. НО как оказалось всё намного проще .. Ответ Ниже ..
 
Цитата:
Зараза забываю , что файлы имеющие одинаковое название , но разные регистры букв в названии - для линукс-подобных ОС, это разные файлы . А для винды они одинаковые )  

Alukardd, Спасибо , будем знать !!
 
У меня вопрос , сюда или нет , мне надо на bush написать что то похожее . При совпадении файла из одной папки в другой папке, чтобы не выполнять ту и иную модификацию или что то с файлом делать . К примеру архивирование.Использую вот такое :  

Цитата:
Пример : find папка -type f -iname "*.*" -exec команда выполнения \; #  

Это здесь , или есть еще тема здесь ?  
 

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 15:44 21-06-2017 | Исправлено: MihailM, 16:12 21-06-2017
CrownRU



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

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

 
Емм, еще раз, помедленней.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 15:52 21-06-2017
MihailM



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, мне надо сделал архив только новых файлов в папке , то если есть уже одинаковый файл в папке назначение , чтобы заново мне не делать архивирование, то есть просто пропускал такой=одинаковый файл . Зачем 2 раза делать одно и тоже .Вроде должно быть, понятно ? )
А то у мня сейчас получается , что при выполнении операции архивирования, то я 2 раза делаю с одинаковым файлов одно и тоже. А файл то не изменялся..  
 
 

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 15:56 21-06-2017 | Исправлено: MihailM, 16:02 21-06-2017
CrownRU



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 11:41 23-06-2017
MihailM



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, мне нужен уже сам процесс выполнения .. то есть в данном случае архивация..Ну если вы знаете , скинули бы примерчик то ) Хотя тут похоже помощи хрен дождешься, которые вместо помощи посылать любят в Гугль )
ВОПРОС ЗАКРЫТ !!!!

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 15:51 23-06-2017
CrownRU



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

Код:
# rsync -aHAXxv --numeric-ids --stats -e ssh <откуда> <куда>

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:46 28-06-2017
MihailM



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

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

Цитата:
Готовые скрипты в интернете имеются.
Это же ваше сообщение  ..  
 
А теперь по поводу вашего ответа : Причем тут ваша
Цитата:
rsync  
и моя помощь с
Цитата:
архивированием

С rsync я уже разобрался .. мне нужен пример скриптика для архивирование - вроде по русски написано, но только не всех подряд файлов , а только тех которых нет в папке с архивами .. То есть выполнять типа проверки на наличие файлов...
Если rsync  умеет архивировать , тогда напишите .Хотя вроде бы я не умеет.  
А вообще то
Цитата:
ВОПРОС ЗАКРЫТ !!!!  
, Решил по старинке , все файлы архивировать ..  
Помощи я так и не услышал-не увидел , кроме как :
Цитата:
 Готовые скрипты в интернете имеются.

 
А по поводу поисковиков, вы когда посылаете в поисковик , сделайте похожий запрос типа "linux скрипт архивирования", и вам тут же выпадет куча информации по архивированию файлов, то есть команды и простенькие примеры. Вообщем не то , что мне нужно.  Хотя нашел пример архивировать файлы за посл. месяц-год от тек. даты .  НО это не много не то,хотя  взял на заметку может пригодится.  

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 20:32 28-06-2017 | Исправлено: MihailM, 20:55 28-06-2017
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MihailM
То есть надо сравнивать файлы в источнике с файлами в архиве?
Почему бы не использовать backup решения?
 
Ну или воспользоваться функцией --filesync от ZIP?
 
Посмотрите также и эту страницу.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:19 29-06-2017 | Исправлено: CrownRU, 14:24 29-06-2017
MihailM



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

Цитата:
То есть надо сравнивать файлы в источнике с файлами в архиве?  
да , только файлы все отдельно, 1 файл=1 архив.
да и еще мне нужно другим архиватором. А то у меня есть готовый скрипт , ну у меня там долгий процесс получается .. Вот и хотел мож как то сократить время выполнения. Тем более мне это нужно не для бекапа, а просто для архивирования - недостающий-новых файлов из источника.  
У меня сейчас , как всё происходит , я копирую все нужные файлы мне в определенную папку типа "архив", там уже запускаю процесс архивирование с удалением источника. Потом с помощью rsync уже переношу-копирую  в другой каталог. Потом удаляю я эту папку архив, чтобы не мешало.  На ВПС всё это..

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 14:47 29-06-2017 | Исправлено: MihailM, 14:57 29-06-2017
CrownRU



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 17:07 29-06-2017
MihailM



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

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 09:14 30-06-2017 | Исправлено: MihailM, 09:17 30-06-2017
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MihailM
 
значит bzip2... Тогда наверное самое простое воспользоваться tar. У него есть опция -u update, то биш. Проблема в том, что он не может актуализировать архивыне файлы.
 
Значит есть у нас архив.tar.bz2
распаковываем его до tar
Затем tar -uf актуализируем файлы
Пакуем.
 
Сейчас времени нет подробней писать, надеюсь так понятно.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:03 30-06-2017
Deoptimizer

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
Необходимо составить Search regular expression для такого задания:
Например есть такой ключ:

Код:
6F4BB-YCB3T-WK763-3P6YJ-BVH24

Известно, что они состоят из только таких комбинаций chars:
 

Цитата:
[BCDFGHJKMNPQRSTVWXY2346789]{5}
(где {5} пять chars до разделителя)
 

 
Причем не обязательно привязывать разделитель "-", он может быть любым, например:

Код:
 
6F4BB   -   YCB3T   -   WK763   -   3P6YJ   -   BVH24
 
или
 
6F4BB
YCB3T
WK763
3P6YJ
BVH24
 
или
 
6F4BBYCB3TWK7633P6YJBVH24
 
и еще как угодно...
 

 
Но известно, что набор из пяти chars по пять наборов.
 
Нужно составить Search regular expression (можно grep или sed) с конкретным ответом 0(если нашло такую комбинацию) или 1(не нашло такую комбинацию).
 
Добавлено:
И да, нужно учитывать, что этот ключ находится внутри текста.

Всего записей: 315 | Зарегистр. 12-06-2015 | Отправлено: 15:22 01-07-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Deoptimizer
Думаю, Вам будет достаточно такого

Код:
grep -qPz '([BCDFGHJKMNPQRSTVWXY2346789]{5}([^BCDFGHJKMNPQRSTVWXY2346789]*?)){5}' /tmp/data && echo FOUNDED


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:11 01-07-2017
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как правильно запустить скрипт с правами root? Скрипт примитивный, тупо удаление файлов и папок в /usr/local/ с rm -f и rm -rf соответственно, пути полные, в шебанге #!/bin/sh.
Сделал исполняемым, sudo ./del.sh не срабатывает, sudo sh del.sh тоже. Сделал финт ушами: sudo thunar -> зашёл в папку со скриптом, вызвал консоль, дальше sudo sh del.sh, но это как-то некрасиво.

Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 15:49 07-10-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off> Сделал исполняемым, sudo ./del.sh не срабатывает, sudo sh del.sh тоже.
 
УМВР.

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

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



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

Цитата:
Сделал исполняемым, sudo ./del.sh не срабатывает, sudo sh del.sh тоже.

Попробуйте указать полный путь к скрипту,например sudo /tmp/del.sh

Всего записей: 4961 | Зарегистр. 05-01-2006 | Отправлено: 21:36 07-10-2017
Skif_off

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

Цитата:
УМВР.

Оно как бы именно так и должно работать
 
mithridat1
С полным путём то же самое.
 
Кстати, есть разница: если использовать sudo sh del.sh, то всё выглядит так, как будто скрипт отработал как задумано, а если sudo ./del.sh, то в консоль пишет

Цитата:
sudo: unable to execute ./del.sh: No such file or directory
Обрыв терминальной линии

Это что-то очевидное? Куда копнуть?

Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 00:09 08-10-2017
thejustsoul



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

Код:
cd /path/to/script
bash del.sh

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 01:03 08-10-2017 | Исправлено: thejustsoul, 01:04 08-10-2017
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
thejustsoul
Нет, не сработало.
 
Хм... Оно и без всякого sudo не работает Другие скрипты вроде работают, этот примитивный, типа

Код:
#!/bin/sh
 
rm -f /usr/local/bin/geany
rm -rf /usr/local/include/geany
...
echo "ok"

первый - файл, второй - каталог, подобного на несколько десятков строк. Что с ним может быть не так?

Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 01:25 08-10-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off
> $ sudo ./del.sh
> sudo: unable to execute ./del.sh: No such file or directory
> Хм... Оно и без всякого sudo не работает :-)
 
Уже лучше.  Давайте файл в двоичном виде.
 
Ну или сами проверьте первую строку на наличие непечатного мусора.  Ну и остальные заодно.  Подсказка: самое вероятное, что может быть — перед каждым переводом строки стоит еще и возврат каретки.

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

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off
В какой кодировке скрипт?  
Смените формат на UTF-8, Unix (LF), если в notepad++, то в строке состояния, где написано "Windows (CR LF)", ПКМ->"Преобразовать в UNIX-формат (LF)", ну и кодировку выставьте в UTF-8.
 
Либо можно пересоздать (или конвертировать) заново :
Код:
echo -e '#!/bin/sh\nrm -f /usr/local/bin/geany\nrm -rf /usr/local/include/geany\necho "ok"' > del2.sh

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 11:18 08-10-2017 | Исправлено: thejustsoul, 11:20 08-10-2017
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, thejustsoul
Спасибо, буду знать, куда сначала смотреть Дело действительно оказалось в конце строк CR+LF, есть у меня дурная манера иногда вместо создания файла копировать существующий с переименованием (даже не текстовый, бывает), потом Ctrl+A > Ctrl+V > Ctrl+S... Похоже, этот случай.

Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 12:47 08-10-2017
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго.
FreeBsd.
вытаскиваю адреса из логов nginx так:

Код:
 
cat /var/log/nginx.log | egrep -o '^[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' | sort
 

Подскажите, как получить уникальные адреса?
В том смысле, что встретился 15.15.15.15 20 раз, но вывелся только один раз?

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 03:24 29-10-2017
Pasha_ZZZ



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

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 04:03 29-10-2017
thejustsoul



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

Код:
#!/usr/bin/env bash
 
FILE=$1
 
[ $# -eq 0 ] && exit 1
 
if [ -f "$FILE" ]; then
    echo "Processing log $FILE..."
    if file --mime-type "$FILE" | grep -q gzip$; then
        zcat "$FILE" | awk '{print $1}' | sort | uniq -c | sort -n | tail
    else
        cat "$FILE" | awk '{print $1}' | sort | uniq -c | sort -n | tail
    fi
fi

Юзать так:
Код:
# ./logs.sh /var/log/nginx.log
Или так:
Код:
# ./logs.sh /var/log/nginx.log.2.gz

Если убрать | tail, то будут выводиться все, вместо 10 с конца.

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 23:03 29-10-2017 | Исправлено: thejustsoul, 23:41 29-10-2017
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
thejustsoul
Pasha_ZZZ
Спасибо, исчерпывающе!

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 08:28 30-10-2017
kaurych



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет!
Есть вопрос по потоковому редактору sed.  
В файле куча строк и надо только после трёх определённых, которые совпадут по условию вставить несколько других строк.
Допустим есть фаил, filetest.
Фаил содержит:
string1
string2
string3
string4
string5
string6
Только после строк совпадающих с условием, а это в примере строки:
string3
string4
string5
можно вставить три строки:
line 1
line 2
line 3
В результате должно получиться:
string
string1
string2
string3
string4
string5
line 1
line 2
line 3
string6
Хорошо подходит для начала решение:  

Код:
sed '/string3/{N;/string4/{N;/string5/s/.*/замена/}}' filetest  

или  

Код:
sed '/string3/{N;N;s/string3\nstring4\nstring5/заменяющий текст/}'  

НО она отрабатывает ТОЛЬКО НА ЗАМЕНУ так как в приведённом примере используется команда 's'
Правильно будет использовать в потоковом редакторе SED команду 'a' но блин куда её влепить не знаю уже голова дымится, команда d;p;s отрабатывает а 'a' не хочет!  
Возможно кто нибудь уже АС в SED и подскажет как правильно написать?  
Заранее благодарен!

Всего записей: 465 | Зарегистр. 16-05-2006 | Отправлено: 16:21 22-11-2017 | Исправлено: kaurych, 16:41 22-11-2017
mikeus



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

Код:
sed '/string3/{n;/string4/{n;/string5/s/$/\nline1\nline2\nline3/}}' filetest

'N' не требуется, достаточно 'n'.
 
(добавлено)
 'a' - тоже можно заставить работать. Последняя строка добавляемого текста для команды 'a' должна заканчиваться переводом строки без завершающего '\'.

Код:
sed '/string3/{n;/string4/{n;/string5/a\
line1\
line2\
line3
}}' filetest

Код:
sed '/string3/{n;/string4/{n;/string5/a line1\nline2\nline3  
}}' filetest


Всего записей: 327 | Зарегистр. 20-12-2007 | Отправлено: 18:53 22-11-2017 | Исправлено: mikeus, 19:10 22-11-2017
Vorland

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

Всего записей: 106 | Зарегистр. 20-12-2005 | Отправлено: 21:15 22-11-2017
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:38 22-11-2017
Taran2ul



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

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 16:57 10-12-2017
Taran2ul



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

Код:
#!/bin/sh  
serverip="http://192.168.1.240"  
 
path=`dirname $0`  
parser="/usr/bin/jq"  
filepath="/mnt/media/playlists"  
 
playlist_url="http://pomoyka.win/trash/ttv-list/ttv.json"  
json="$filepath/m3u/ttv.json"  
outdir="$filepath/m3u"  
 
header="#EXTM3U"  
newline="ZFZFaZZZ"  
#informational="informational"  
informational="Религиозные"  
 
url_prefix="$serverip:6878/ace/getstream?id="  
#url_prefix="$serverip:6878/ace/manifest.m3u8?id="  
url_postfix=""  
 
mkdir -p $filepath >> /dev/null 2>&1  
mkdir $filepath/m3u >> /dev/null 2>&1  
 
rm $json >> /dev/null 2>&1  
wget $playlist_url -O $json  
 
data=`cat $json |$parser '.channels|=sort_by(.cat,.name)'`  
size=`echo $data |$parser '.channels|length'`  
 
if [ $size -gt 1 ]  
then  
param="'.channels|=sort_by(.cat,.name)|.channels[]|select(.cat != \"$informational\")|\"#EXTINF:-1 group-title=\\\"\"+.cat+\"\\\" tvg-logo=\\\"$serverip/tv/\"+.name+\".png\\\", \"+.name+\"$newline\"+\"$url_prefix\"+.url+\"$url_postfix\"'|sed 's/$newline/\n/g'"  
eval "echo \$header; echo \$data | " $parser "-r" $param > $outdir/as.kodi.m3u  
fi

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 09:53 11-12-2017
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется список IP/хостов. У всех открытый порт 443. Нужно получить данные сертификатов, конкретно, поля - Common Name и Alternate Names. После чего экспортировать эти данные в csv или куда-то ещё.
Есть идеи, как это сделать мультипоточно, вероятно, с помощью openssl?
Ну, или что посоветуйте?

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 07:07 12-12-2017
arto

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

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 08:12 12-12-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qw12
Отдаете список хостов parallel'у, в том через openssl s_client -connect получаете нужные поля и результат пишите в отдельный файл по имени хоста. Потом просто  cat всех этих файлов в один общий.Сразу многопоточно лучше не писать в один файл, вывод может перемешаться, ну или надо заботиться о блокировках.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 08:38 12-12-2017
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Файл 25 Гб. Памяти - 16 Гб. Нужно удалить дубликаты. Идеи? Предложения?

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 09:44 27-12-2017
Pasha_ZZZ



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

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 10:36 27-12-2017
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно и без сортировки: awk 'uniq[$1]==0{print;uniq[$1]=1}'
 
Добавлено:
Правда если уникальных данных больше 16Гб, то масив тоже должен переполниться.
Если строки оооочень длинные, то можно в массив класть некую хэш сумму строки, что сильно сэкономит память, но нагрузит проц.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:27 27-12-2017 | Исправлено: Alukardd, 15:31 27-12-2017
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
команда
sed -n '/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/p' ips.txt
дает результат:
82.102.173.91    
66.240.205.34    malware-hunter.census.shodan.io
5.8.37.0/24 ; SBL284078
91.121.121.72/16
91.121.121.72
что нужно добавить или изменить чтобы результат получился такой?
82.102.173.91    
66.240.205.34
5.8.37.0/24
91.121.121.72/16
91.123.221.72

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 18:34 05-01-2018
karavan



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

Код:
$ cat ./ips.txt  
82.102.173.91      
66.240.205.34    malware-hunter.census.shodan.io  
5.8.37.0/24 ; SBL284078  
91.121.121.72/16  
91.121.121.72  
$ sed -n 's/\(\([0-9]\{1,3\}[\.]\)\{3\}[0-9]\{1,3\}\(\/[1-9]\{1,2\}\)\?\).*/\1/p' ./ips.txt  
82.102.173.91
66.240.205.34
5.8.37.0/24
91.121.121.72/16
91.121.121.72
 

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 20:39 05-01-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan,
спасибо и прошу извинить за неточно поставленую задачу.
в вашем варианте не игнорируется строка
# Number of entries: 5101.226.196.136
и ip 216.47.96.0/20 показывается как  216.47.96.0/2

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 21:26 05-01-2018
karavan



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

Код:
$ cat ./ips.txt  
82.102.173.91      
66.240.205.34    malware-hunter.census.shodan.io  
5.8.37.0/24 ; SBL284078  
91.121.121.72/16  
91.121.121.72
# Number of entries: 5101.226.196.136  
216.47.96.0/20
 
$ sed -n 's/\(^\([0-9]\{1,3\}[\.]\)\{3\}[0-9]\{1,3\}\(\/[0-9]\{1,2\}\)\?\).*/\1/p' ./ips.txt  
82.102.173.91
66.240.205.34
5.8.37.0/24
91.121.121.72/16
91.121.121.72
216.47.96.0/20
 

 

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 21:42 05-01-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan,
Спасибо.
Это самый "короткий" вариант для sed?

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 22:03 05-01-2018
karavan



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

Цитата:
Это самый "короткий" вариант для sed?

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

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 22:21 05-01-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan,
просто для уточнения:
ваш вариант работает у меня с gnu sed, для sed идущего с macOS он не подходит.
почему изначально и спрашивал что подправить в команде.

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 23:17 05-01-2018
thejustsoul



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

Код:
cat ips.txt | grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
82.102.173.91
66.240.205.34
5.8.37.0
91.121.121.72
91.121.121.72
101.226.196.136
216.47.96.0

Если совсем грубо, то:

Код:
cat ips.txt | grep -Eo "[0-9\.]{7,15}"
82.102.173.91
66.240.205.34
5.8.37.0
91.121.121.72
91.121.121.72
5101.226.196.13
216.47.96.0
 

Еще можно добавить | uniq чтобы убрать повторы.
Если надо регулярку чтобы извлечь только валидные адреса, то могу тоже скинуть. Когда-то гуглил вопрос этот и сохранил для себя.

Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 23:20 05-01-2018 | Исправлено: thejustsoul, 23:22 05-01-2018
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
thejustsoul
В задаче от los надо еще префиксы сети учитывать.
 
los
Цитата:
Это самый "короткий" вариант для sed?

Вариант от thejustsoul с grep получше выглядит.

Код:
$ grep -Eo '^(([0-9]{1,3}[\.]){3}[0-9]{1,3}(\/[0-9]{1,2})?)' ./ips.txt  
82.102.173.91
66.240.205.34
5.8.37.0/24
91.121.121.72/16
91.121.121.72
216.47.96.0/20
 

P.S.: Во всех вариантах не учитывается вхождение адреса в упоминаемый диапазон.
Если в файле будет подобное:
Код:
192.168.10.10
192.168.10.0/24
То будут выведены обе строки.
 
Добавлено:

Цитата:
Если надо регулярку чтобы извлечь только валидные адреса

"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 23:38 05-01-2018 | Исправлено: karavan, 23:49 05-01-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los> Это самый короткий вариант для sed?
 
Вариант чего?  Выбора из произвольного текстового файла всех слов, похожих на адрес IPv4 с маской?
 
Или вам все-таки надо разобрать *структурированный* файл?
 
Добавлено:
los, если непонятно, о чем я:
 
#!/usr/bin/awk -f
 
/^#/ { next }                   # comments
{ print $1 }                    # address in the 1st field


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

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

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос изначально был про sed Но в любом случае всем большое спасибо.
thejustsoul,
в вашем варианте с grep из строки
219.147.95.246    246.95.147.219.broad.dq.hl.dynamic.163data.com.cn
подхватывается также 246.95.147.219
и вместо
1.10.16.0/20 получается 1.10.16.0/2
karavan,
за "grep" спасибо но у меня с подобной "командой" проблем не было(как-то разбирался) застрял с sed причем в начале из-за разницы между gnu sed и маковским.
ASE_DAG + кому интересно,

Цитата:
Вариант чего?  Выбора из произвольного текстового файла всех слов, похожих на адрес IPv4 с маской?

Раз рассматриваем варианты не только с sed. К примеру:
Нужно создать blocklist для pf.
curl -L "https://zeustracker.abuse.ch/blocklist.php?download=ipblocklist http://feeds.dshield.org/top10-2.txt http://www.spamhaus.org/drop/drop.lasso https://ransomwaretracker.abuse.ch/downloads/RW_IPBL.txt https://feodotracker.abuse.ch/blocklist/?download=ipblocklist https://labs.snort.org/feeds/ip-filter.blf https://sslbl.abuse.ch/blacklist/sslipblacklist.csv https://sslbl.abuse.ch/blacklist/dyre_sslipblacklist.csv http://rules.emergingthreats.net/blockrules/compromised-ips.txt" > ips.txt
нужно выбрать ip, cidr.
избегая
219.147.95.246    246.95.147.219.broad.dq.hl.dynamic.163data.com.cn
т.е. из строки только первый ip или cidr
 
 
 
Добавлено:
karavan,

Цитата:
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

ваш вариант имеет те же "проблемы", что и вариант thejustsoul
"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))|^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])?"

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 12:12 06-01-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los> Вопрос изначально был про sed :-)
 
Вот удивительное дело!  Как сделать, вы не знаете, а чем при этом обойдетесь — уже знаете.  :-)
 
> $ curl -L ... > ips.txt
 
Да ну где же это видано — сшивать встык разноформатные файлы: в разделением пробелами и запятыми.
 
Нет, ну в вашем частном случае это, может быть, и не испортит дела.  Скажем, если у вас относительно полноценный АВК:

#!/usr/bin/awk -f
 
BEGIN { FS = "[[:space:]]+|," }
 
/^#/ { next }                   # comments
{ print $1 }                    # address in the 1st field


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:49 07-01-2018 | Исправлено: ASE_DAG, 11:50 07-01-2018
los

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

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

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

Цитата:
Да ну где же это видано — сшивать встык разноформатные файлы: в разделением пробелами и запятыми.

здесь, и словом "формат" вы оперируете слишком вольно.

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

Так и есть, случай частный и условное решение (плюс понять где сам ошибаешься) спрашивалось именно под него.
 
Только для примера:
curl -L $url > $tmpfile
 
/usr/local/bin/sed -n 's/\(^\([0-9]\{1,3\}[\.]\)\{3\}[0-9]\{1,3\}\(\/[0-9]\{1,2\}\)\?\).*/\1/p' $tmpfile | /usr/bin/sort -u | /usr/bin/tr "\n" " " > $IPs
пока подходит, не смотря на ваше мнение о "форматах"
Считаете что можно сделать лучше(правильнее,элегантней и т.п.) предлагайте - для этого и форум,а ремарки о том кто чего знает или не знает оставьте для тех кому интересно ваше мнение по этому поводу.
Я достаточно доходчиво и вежливо написал?

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 12:47 07-01-2018
syrenium

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пишу сюда, поскольку перенаправляет
Если ошибся темой, поправьте.
Использую cURL в Windows 10 x64 для загрузки файлов.
Возможно ли сделать так, чтобы файлы загружались и сохранялись, только если они новее, чем расположенный на диске?

Всего записей: 671 | Зарегистр. 07-12-2015 | Отправлено: 17:09 15-01-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
syrenium
Ну Windows, конечно, тут не в тему но про curl отвечу.
Серверу можно послать заголовок -H "If-Modified-Since: ..." (если сервер такое понимает для данного файла)

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 17:52 15-01-2018 | Исправлено: Alukardd, 17:53 15-01-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
syrenium> Если ошибся темой, поправьте.  
 
Нет-нет, все правильно.
 
> Возможно ли сделать так, чтобы файлы загружались и сохранялись, только если они новее, чем расположенный на диске?
 
Ну, если сервер сообщает вам дату изменения, то почему может быть нельзя?
 
Помимо перекладывания это задачи на сервер, разумеется, это можно сделать и на клиенте.  Но заготовки под такое поведение в curl(1) нет.  Как его, собственно, нет и под серверное.  Так что нужно либо взять еще какой-нибудь язык общего назначения, либо поискать программку, где такой алгоритм зашит — wget(1), например.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:41 15-01-2018
redson



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
как в bash скрипте в одну переменную добавить, некоторое количество ip адресов, а потом обращаться к этой переменной?
 
Например, то что я хочу:
 
#!/bin/bash
ipadress="192.168.1.5 192.168.1.7 192.168.1.10 10.10.2.2"
 
echo ${ipadress}
 
на выходе:
 
192.168.1.5
192.168.1.7
192.168.1.10
10.10.2.2

Всего записей: 1336 | Зарегистр. 23-04-2007 | Отправлено: 09:25 23-01-2018
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redson
Вам нужно создать массив
 
ipadress=(192.168.1.5 192.168.1.7 192.168.1.10 10.10.2.2)
 
echo ${ipadress[0]}
echo ${ipadress[1]}
..

Всего записей: 4961 | Зарегистр. 05-01-2006 | Отправлено: 09:33 23-01-2018 | Исправлено: mithridat1, 09:35 23-01-2018
redson



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

Всего записей: 1336 | Зарегистр. 23-04-2007 | Отправлено: 19:41 23-01-2018
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 10:18 02-02-2018 | Исправлено: digital422, 14:29 03-02-2018
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отбой, переконвертировал входной файл через gawk... {print $3";"$9";"$10}, символ в конце пропал.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:35 02-02-2018
vtlseeker



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ищу способ определить в bash скрипте, как он был запущен из консоли или же из gui приложения.

Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 14:21 03-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vtlseeker, urxvt, xterm и т. п. — это здесь что?

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

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



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

Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 15:34 03-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vtlseeker, [[ ! -v DISPLAY && -t 0 ]].
 
И теперь, если не секрет, зачем вам это?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:58 03-02-2018 | Исправлено: ASE_DAG, 16:00 03-02-2018
vtlseeker



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

Всего записей: 386 | Зарегистр. 03-03-2009 | Отправлено: 17:09 03-02-2018
ASE_DAG



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

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:34 03-02-2018
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В каталоге есть пара тыщ файлов. Как скопом отсортировать каждый, попутно удалив дубликаты, не выводить на консоль и заменить исходник отсортированным?
 
Добавлено:
В смысле. файлы - текстовые. Нужно отсортировать строки.

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 17:38 05-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qw12, написав программку.  Например, на Баше с использованием Coreutils.
 
Если какая-то из подзадач (на которые вы вполне верно ее разбили) вызывает затруднения, не разрешаемые элементарным поиском, то можно обратиться с ней на веб-форум.  Например, на этот.

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

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



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

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

Я потому и спрашиваю здесь, как бы набросать что-то такое в awk, наверно.
Конечно, можно сценарий где каждый файл будет обрабатывать отдельно, типа:
sort -u file1.txt -o file1.txt
sort -u file2.txt -o file2.txt
sort -u file2.txt -o file2.txt
...
но, имхо, есть элегантное решение в одну строку. Какое - я не знаю.

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 19:22 05-02-2018
Alukardd



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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 19:39 05-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> Я потому и спрашиваю здесь...
 
...что...?
 
> как бы набросать что-то такое в awk
 
Прочитать файл в массив, отсортировать массив (есть встроенная функция), напечатать массив в файл.
 
> наверно
 
Вот удивительное дело, не?  Сплошь и рядом, спрашивая что-то, не имеют ни малейшего понятия, как, но уже определились, чем.  Но очень редко наоборот — чтобы знали, как, и спрашивали, на чем же это «как»  будет лучше.   Почему, а?
 
> Конечно, можно сценарий где каждый файл будет обрабатывать отдельно
 
Да, и я нахожу это естественным.
 
> типа
> sort -u file1.txt -o file1.txt
> sort -u file2.txt -o file2.txt
> sort -u file2.txt -o file2.txt
 
А!  Вы не знакомы с такой штукой, как цикл?  Ну вот, и установили, с какой из подзадач затруднения — с самой простой из всех четырех :-).
 

for file in *; do
    ...
done


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

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



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

Код:
for file in *.txt; do
    sort -u -o $file $file
done

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 01:27 06-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qw12, https://mywiki.wooledge.org/BashPitfalls#cp_.24file_.24target
 
Да и вы уверены, что не нужно делать резервную копию?

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

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



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А я бы сначала скопировал file* в file*~ (ну или под иное имя, что не нагрузит авторезервирование), а потом уже из него и читал, а в исходный писал.  Это при условии, что товарищу надо, как я понял, сохранить файлы, что и inode бы остался прежним, не только имя, а заменить лишь их содержимое.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:33 06-02-2018 | Исправлено: ASE_DAG, 19:50 06-02-2018
qw12



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

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 20:47 06-02-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
для bash
urls=(
    test.com
    test1.com
    test2.com
)
 
для sh
urls="test.com \
         test1.com \
         test2.com"
 
есть ли еще варианты для sh(кроме в одну строчку) дабы выглядело посимпатичнее?

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 11:51 14-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los, я, надеюсь, понятно, что это не одно и то же?  И второе весьма странно&#769;.  Нет, я понимаю, что в URL не должно быть пробелов, но если под sh имеется в виду воображаемый язык из Позикса, то почему бы их не разделять концами строки?
 
Оно и лучше, и выглядеть будет посимпатичнее.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:04 14-02-2018
los

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

Цитата:
я, надеюсь, понятно, что это не одно и то же?

экстрасенс? Нет не понятно,
#!/bin/bash
 
urls=(  
    test.com  
    test1.com  
    test2.com  
)
 
curl $urls >tmpfile
+++++
#!/bin/sh
urls="test.com \  
         test1.com \  
         test2.com"
 
curl $urls >tmpfile2
 
gost tmpfile tmpfile2 - сумма одинаковая.
к синтаксису строки с curl не придирайтесь  

Цитата:
то почему бы их не разделять концами строки?  
 
Оно и лучше, и выглядеть будет посимпатичнее.

Можно подробнее?

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 17:37 14-02-2018
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем здравствуйте.
Нужна помощь с решением проблемы.
 
написал такой корявый скрипт.
Проблема возникает здесь:
nohup archpro -i $k &
 
Здесь не воспринимается переменная $k. Так и пишет :  
ошибка в выполнении nohup archpro -i $k
 
Пишу там-же echo $k - все выводит нормально.
Скрипт прокомментировал.
 
P.S. Закостылил таким образом:
Код:
echo "nohup archpro -i $k &" |sh

 

Код:
#!/bin/bash
 
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
CYAN="$(tput setaf 6)"
SGR0="$(tput sgr0)"
BOLD="$(tput bold)"
 
# Читает ini файлы в директории...
for k in /archive/obj/cssap/*/*/archint.ini.*
 
    do
# ...и выуживает оттуда соответствующий номер порта.
                                WEBPORT=$(awk /^WEBPORT/'{ print $2 }' $k)
                                ARCHWIN=$(awk /^ARCHWIN_PORT/'{ print $2 }' $k)
# Проверяет возможность соединения через WEBPORT, прописанный в файле $k
                                curl -sm1 $(hostname -f):$(awk /^WEBPORT/'{ print $2 }' $k)  >/dev/null
 
                if [ $? -eq 0 ]
                    then
                        echo "Connected">/dev/null
# Если соединение невозможно, то:
                        else
# 1. Показать ini файл, где происходит затык
                            echo ${BOLD}${GREEN}$k${SGR0}
# 2. Дополнительная информация через lsof
                            lsof -i:$WEBPORT,$ARCHWIN $k
# 3. Если инстанция висит, то...
                                if [ $? -eq 0 ]
                                      then
                                                                         echo ${BOLD}${RED}Stoppe die Instanz $k${SGR0} >> /tmp/arge.log
# 4. останавливаем ее
                                                        archstop -i $k
# 5. И на всякий случай прибиваем то, что останавливаться по-хорошему не хочет
                                                        fuser -k -n tcp $WEBPORT
                                        fi
                                echo ${BOLD}${RED}Starte die Instanz $k${SGR0} >> /tmp/arge.log
# 6. Стартуем инстанцию. И вот здесь начинаются проблемы. $k не перенимается, хотя echo $k показывает переменную правильно.
                                nohup archpro -i $k &
                                fi
done

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 15:34 15-02-2018 | Исправлено: CrownRU, 17:48 15-02-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Странно это. А что при этом попадает на экран или в nohup.out?
К тому же "как должно" быть и хак это не совсем равноценные конструкции. Хотя бы потому что команда в одном случае работает как фоновая задача в текущем шеле, а при хаке, он вообще про нее ни чего не знает, т.к. родителем числится init (1).

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:06 15-02-2018
CrownRU



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

Цитата:
Странно это. А что при этом попадает на экран или в nohup.out?  

Ничего не попадает окромя echo. nohup.out тоже пуст. Завтра утром проверю как скрипт поведет себя в боевой обстановке.
 
Может со screen можно что-то сделать?

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 18:21 15-02-2018 | Исправлено: CrownRU, 18:36 15-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, о!  Сколько лет, а Арчхрени все те же.  :-)
 
Во-первых, давайте-те-ка без конских отступов:

#!/bin/bash
 
RED="$(tput setaf 1)"
GREEN="$(tput setaf 2)"
CYAN="$(tput setaf 6)"
SGR0="$(tput sgr0)"
BOLD="$(tput bold)"
 
# Читает ini файлы в директории...
for k in /archive/obj/cssap/*/*/archint.ini.*
do
    # ...и выуживает оттуда соответствующий номер порта.
    WEBPORT=$(awk /^WEBPORT/'{ print $2 }' $k)
    ARCHWIN=$(awk /^ARCHWIN_PORT/'{ print $2 }' $k)
    # Проверяет возможность соединения через WEBPORT, прописанный в файле $k
    curl -sm1 $(hostname -f):$(awk /^WEBPORT/'{ print $2 }' $k)  >/dev/null
    if [ $? -eq 0 ]
    then
        echo "Connected">/dev/null
        # Если соединение невозможно, то:
    else
        # 1. Показать ini файл, где происходит затык
        echo ${BOLD}${GREEN}$k${SGR0}
        # 2. Дополнительная информация через lsof
        lsof -i:$WEBPORT,$ARCHWIN $k
        # 3. Если инстанция висит, то...
        if [ $? -eq 0 ]
        then
            echo ${BOLD}${RED}Stoppe die Instanz $k${SGR0} >> /tmp/arge.log
            # 4. останавливаем ее
            archstop -i $k
            # 5. И на всякий случай прибиваем то, что по
            # останавливаться по-хорошему не хочет
            fuser -k -n tcp $WEBPORT
        fi
        echo ${BOLD}${RED}Starte die Instanz $k${SGR0} >> /tmp/arge.log
        # 6. Стартуем инстанцию. И вот здесь начинаются проблемы. $k
        # не поренимается, хотя echo $k показывает переменную
        # правильно.
        nohup archpro -i $k &
    fi
done

 
> ошибка в выполнении nohup archpro -i $k
 
Че, прямо по-русски пишет?  Интересно, кто.  Вообще написать такое может только Баш — $k-то нераскрыта, но я что-то не припомню у него сообщения, да и он всегда должен представляться — bash: и только потом сообщение.
 
Так или иначе, ну закавычивать же надо переменные.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 18:44 15-02-2018
CrownRU



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

Цитата:
Че, прямо по-русски пишет?  Интересно, кто.

 
Приветствую, маэстро
Не, пишет по-немецки - это я так, для понятности. Но суть-то в том, что переменная не перенимается - так и пытается подставить вместо переменной $k
Завтра попробую заковычить, но вещует мне что-то, что не поможет.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 20:24 15-02-2018 | Исправлено: CrownRU, 20:35 15-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> Не, пишет по-немецки - это я так, для понятности.  
 
Это не надо.  Если хочется понятности, то лучше просто $ export LANG=C.
 
> Завтра
 
Ну, если это такая тягомотина, то следующий шаг — это, разумеется, включить трассировку, и посмотреть, что там происходит.
 
#!/bin/bash
заменить на
#!/bin/bash -x

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, CrownRU
Может, для начала, лучше set -x перед проблемной строкой и set +x сразу после?
А то там цикл, вывод может быть огромен...

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, и еще сутки долой?  ;-)

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

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



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:53 15-02-2018
CrownRU



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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 00:00 16-02-2018
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем здравствовать!
Извините, что задержался.
Вот вывод. Переменные, как вы и сказали, закавычил. Включил set -x.
Также вставил echo для наглядности.
 

Код:
set -x
nohup archpro -i "$k" &
echo "nohup archpro -i "$k" &"
set +x

 
 

Код:
/archive/obj/cssap/N/NQT_R/archint.ini.NQT_R
+ echo 'nohup archpro -i /archive/obj/cssap/N/NQT_R/archint.ini.NQT_R &'
nohup archpro -i /archive/obj/cssap/N/NQT_R/archint.ini.NQT_R &
+ set +x
+ nohup archpro -i /archive/obj/cssap/N/NQT_R/archint.ini.NQT_R
nohup: h&#228;nge Ausgabe an „nohup.out“ an
./pck_restart.sh: line 15:  8325 Error nohup archpro -i "$k"
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:36 16-02-2018
qw12



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

Код:
./run.sh $line > result.txt

как в переменную line записать данные построчно из файла?

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 14:28 16-02-2018
Alukardd



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

Цитата:
как в переменную line записать данные построчно из файла?
lines=`cat config.txt`
или
lines=$(<config.txt)
 
Добавлено:
CrownRU
Двойные кавычки внутри двойных не работают, надо экранировать... У тебя получилось что в echo переменная $k оказалась вне кавычек.
 
Почему у тебя в выводе сначала идет echo а потом nohup, а в отрывке кода что ты показал наоборот?
 
И почему line 15? Ты запускал не совсем такой скрипт как показывал нам?
 
Если сделать полностью на весь скрипт bash -x вывод слишком большой что бы нам показывать? есть же [more=тут большой вывод]

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:33 16-02-2018
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
есть мне бы надо прочитать строку и файла, отправить ее в переменную, выполнить run.sh, записать результат, повторить со следующей и т.д.
lines=`cat config.txt`
это немного не то.

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 15:05 16-02-2018
Alukardd



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

Код:
OLDIFS=$IFS
IFS=''
while read -r line; do
  echo "line is $line"
done </path/to/your/file
IFS=$OLDIFS


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 15:55 16-02-2018 | Исправлено: Alukardd, 15:56 16-02-2018
CrownRU



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

Цитата:
CrownRU  
Двойные кавычки внутри двойных не работают, надо экранировать... У тебя получилось что в echo переменная $k оказалась вне кавычек.  
 
Почему у тебя в выводе сначала идет echo а потом nohup, а в отрывке кода что ты показал наоборот?  
 
И почему line 15? Ты запускал не совсем такой скрипт как показывал нам?  
 
Если сделать полностью на весь скрипт bash -x вывод слишком большой что бы нам показывать? есть же [more=тут большой вывод]
 

 
Понял, сделаю в понедельник. 15 линия это строка с find.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 22:59 16-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
 
> Также вставил echo для наглядности.
 
А трассировка для чего же?  ;-)
 
> + nohup archpro -i /archive/obj/cssap/N/NQT_R/archint.ini.NQT_R
> nohup: h&#228;nge Ausgabe an „nohup.out“ an
> ./pck_restart.sh: line 15:  8325 Error nohup archpro -i "$k"
 
Ну и к уже отмеченному т-щем Алукардом, еще можно заметить, что вовсе не пишет он этого по-немецки.  Он пишет какой-то номер, а что-то не припомню я, чтобы у ГНУ Баша были номерные ошибки.  Это точно он?
 
Добавлено:
> это строка с find
 
Какой еще find?  Там нет find’а.
 
> Понял, сделаю [полную трассировку]
 
А толку...  Если только еще какую-нибудь странность найти.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:27 16-02-2018 | Исправлено: ASE_DAG, 23:33 16-02-2018
qw12



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

Код:
ping $line > result.txt

в переменную $line мне нужно построчно прочитать данные из файла test.txt

Цитата:
OLDIFS=$IFS
IFS=''
while read -r line; do
  echo "$line"
done <test.txt
IFS=$OLDIFS

Куда мне вставить ping $line > result.txt?
Можно прокомментировать построчно, чтобы понять логику?

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 04:05 17-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qw12> Можно прокомментировать построчно, чтобы понять логику?
 
Упростим маленько:

while read -r; do
    printf '%s\n' "$REPLY"
done <test.txt

 
А теперь можно:

# Пока читается, читать со стандартного ввода (умолчание) построчно
# (умолчание) в переменную REPLY (умолчание), не интерпретируя ‘\’
# особо (-r).
while read -r; do
    # Напечатать переменную REPLY на стандартный вывод (умолчание).
    printf '%s\n' "$REPLY"
# Перенаправить файл с именем test.txt из текущего каталога на
# стандартный ввод цикла.
done <test.txt



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 05:25 17-02-2018
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет, подскажите, pls.
 
Диспозиция:
Среда: WinXP x32 +SP3.
gAwk: GNU Awk 3.1.6
 
1. Я знаю как получить из целого положительного числа литерал «дата». Например:
Код:
gAwk.exe "BEGIN{print strftime(\"%Y.%m.%d\",0);exit}"
порождает литерал «1970.01.01».
 
2. А выражение:
Код:
gAwk.exe "BEGIN{print strftime(\"%Y.%m.%d\",systime());exit}"

порождает литерал «сегодня», например «2018.02.25».
 
Вопрос: как из такого литерала «дата» получить эквивалентное число?
(не «в лоб», через итерации)
 
Спасибо.
 
---
Удачи!
Влад.

Всего записей: 262 | Зарегистр. 14-02-2009 | Отправлено: 14:38 25-02-2018
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
NvvLazyTiger
А чем date не угодил?
Цитата:
date -u -d'@0' +%Y.%m.%d
date -u  +%Y.%m.%d
 
date -u -d'1970/01/01' +%s
date -u +%s

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 15:07 25-02-2018
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Увы, Pasha_ZZZ
Цитата:
А чем date не угодил?
Цитата:
date -u -d'1970/01/01' +%s
Мой Cmd.exe WinXp таких изысков не разумеет:
Код:
C:\>date -u -d'1970/01/01' +%s
Указана недопустимая дата.
Введите новую дату (гг-мм-дд):
А ставить порт "date" из *nix для разовой задачи...
 
Ок, thx. Попытаю в топике о LibreOffice/OpenOffice, может Calk так умеет.

Всего записей: 262 | Зарегистр. 14-02-2009 | Отправлено: 01:36 26-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NvvLazyTiger
> Вопрос: как из такого литерала «дата» получить эквивалентное число?
 
Ну, они далеко не эквивалентны.  Во-первых, как нетрудно заметить, %s точнее %Y-%m-%d в 86400 раз, а во-вторых, что уже может быть не так очевидно, для %s находимо более одной %Y-%m-%d.  Да-да, когда в Киеве 26-е, на Камчатке уже зачастую 27-е.  :-)
 
> (не «в лоб», через итерации)
 
Слушайте, я вас не понимаю :-/.  Почему не «в лоб»?  Кто вам навязал такое ограничение?  И какие еще, к черту, «итерации»?
 
Функция обратная strftime() — это strptime().  Но АВК к ней интерфейса по какой-то причине не дает.
 
Так что могу предложить три вещи:
 
1. Написать этот интерфейс и оформить в виде разделяемой бибилиотеки.
 
2. Написать реализацию strptime() прямо на АВКе.
 
3. Таки решить разбор строки вида %Y-%m-%d «в лоб», а не писать разбор даты в общем виде.
 
Выбирайте, что вам удобнее.  :-)
 
Ну или всегда можно нагородить костылей.  Но этого я вам предлагать не стану.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:48 26-02-2018
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я сожалею, ASE_DAG, но вы, похоже, не обратили внимание вот на это:
Цитата:
для разовой задачи
Отсель и желание «обойтись малой кровью».
 
Я (не знал, но) надеялся вот на это:
Цитата:
Функция обратная strftime() — это strptime()

Раз этой обратной функции нет (в моём, знакомом gAwk) – буду искать альтернативы gAwk-у.
 
Поясню. Фактически мне занадобилось находить «разницу в днях» для пар дат (в виде литералов). Пока этих пар было меньше десятка, – обошёлся подходящим сервисом on-line для. А вот когда таких пар стало несколько сотен, – засуетился…
 
Повторюсь:
Цитата:
Попытаю в топике о LibreOffice/OpenOffice, может Calk так умеет.
Просто  gAwk я использую уже лет 20. Задачи довольно простые, но для обработки файлов "plain text" – самое оно. А в LO я нуб-нубом. Увы…

Всего записей: 262 | Зарегистр. 14-02-2009 | Отправлено: 14:30 26-02-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> Поясню. Фактически мне занадобилось находить «разницу в днях» для пар
> дат (в виде литералов).
 
Не пояснили.  Вообще ничего не добавилось.
 
Так, вы так не проговорили, к примеру, явно, что формат фиксированный, и угадывать его не надо.  Если все-таки надо, то это уже не strptime(), а parse_datetime() — та самая, которую использует тот же date(1), который вы за каким-то лесом отвергаете.  Вот ее вы, наверное, уже не сами не напишите, так что только первый вариант остается — пробрасывать интерфейс.
 
> Повторюсь:
>> Попытаю в топике о LibreOffice/OpenOffice, может Calk так умеет.
> Просто gAwk я использую уже лет 20. Задачи довольно простые, но для
> обработки файлов "plain text" – самое оно. А в LO я нуб-нубом. Увы…
 
facepalm.jpg.


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

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



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

Код:
В моём мануале нашлась функция обратная strftime() — это mktime("YYYY MM DD HH MM SS [DST]")

Литерал «дата» я могу построить в любом формате (в т.ч. и в виде "YYYY MM DD HH MM SS [DST]"). Но, увы мне, мануалы по gAwk я «пропахивал» лет 12-15 назад, когда строил  и внедрял на производстве согласованный комплекс технологических серверных скриптов (CMD, AWK, VBS, etc.), обслуживающих потоки первичных учётных данных региона. Вот и подзабылось кое-что…
 
I’m happy now. Thx!
 
---
Удачи!
Влад.

Всего записей: 262 | Зарегистр. 14-02-2009 | Отправлено: 01:54 27-02-2018
CrownRU



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

Цитата:
CrownRU
 
> Также вставил echo для наглядности.
 
А трассировка для чего же?  
 
> + nohup archpro -i /archive/obj/cssap/N/NQT_R/archint.ini.NQT_R
> nohup: h&#228;nge Ausgabe an „nohup.out“ an
> ./pck_restart.sh: line 15:  8325 Error nohup archpro -i "$k"
 
Ну и к уже отмеченному т-щем Алукардом, еще можно заметить, что вовсе не пишет он этого по-немецки.  Он пишет какой-то номер, а что-то не припомню я, чтобы у ГНУ Баша были номерные ошибки.  Это точно он?
 
Добавлено:
> это строка с find
 
Какой еще find?  Там нет find’а.
 
> Понял, сделаю [полную трассировку]
 
А толку...  Если только еще какую-нибудь странность найти.

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

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:30 02-03-2018
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть у меня один скрипт, который из внешнего ftp ежедневно загружает файлы на мою сторону. Файлы имеют вид в виде текущей даты YYYY-MM-DD.txt и YYYY-MM-DDtext.txt. Например 2018-03-07.txt и 2018-03-07dop.txt. Скрипт загрузки простой:
wget $INPUT_FTP/*.txt $OUTPUT_LOCAL
Владельцы ftp за старыми файлами не следят и там лежат файлы за несколько лет и скрипт ежедневно это все проверяет. Решил его переделать, самый быстрый вариант это:

Код:
 
for m in {0..14}; do
DATA_DAY=$(date +%Y-%m-%d -d "+$M day")
wget $INPUT_FTP/$DATA_DAY*.txt $OUTPUT_LOCAL
done
 

В нем не нравится уход на дату вперед, но бывает что там файлы с датой на несколько дней вперед.
Есть мысль парсить .listing через gawk и эти реальные даты уже подставлять в wget. Но как в gawk сделать сравнение текущей даты и даты в .listing, учитывая год месяц и день? Начал использовать split и запутался, числа разделил, а вот дальше ступор.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 17:49 07-03-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Сравнивать даты всегда стоит через timestamp.
Можно это делать циклом в bash с вызовом утилиты date. now=$(date '+%s');  d="2018-03-02"; [[ $(date -d "$d" '+%s') -lt $now ]] && echo "OLD $d"
Можно это делать на GNU AWK через функцию mktime gawk 'BEGIN{now=systime()} {if (mktime($0) < now) print "OLD "$0}' <<< "2018 03 2 00 00 00"
 
Как видите mktime принимает весьма не удобную строку на вход и ни что иное задать нельзя, на сколько я знаю. Да в awk не проблема сформировать нужную строку, но тем не менее...
Напротив, утилита date очень всеядна.
 
Итого, если речь идет о паре сотен строк, то я бы взял bash. Если их там тысячи и время хоть сколько-то важно, то я бы использовал gawk.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422, я не вполне понял проблему, что вы пытаетесь решить.   Вы хотите написать реализацию ключа --timestamping на Баше?
 
> Владельцы ftp за старыми файлами не следят
 
А что они по-вашему должны с ними делать?
 
> и там лежат файлы за несколько лет
 
Так это же отлично!
 
> wget $INPUT_FTP/*.txt $OUTPUT_LOCAL ежедневно это все проверяет
 
Возможно, у вас какие-то умолчания другие, или я чего-то не помню, но так он их как раз *не должен* проверять, он должен их перезагружать заново.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:31 08-03-2018 | Исправлено: ASE_DAG, 16:32 08-03-2018
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG - мне не нужны файлы, созданные ранее, т.к. они неактуальны и написать владельцам ftp скрипт который бы удалял старые файлы было бы лучшим решением (Cerberus FTP Server - оно под Windows, все понятно), но что есть. Моя задача скачать файлы на текущую дату и если есть на будущую, если они лежат на ftp, т.к. очистка от старых файлов на моей стороне есть. Считываем файл .listing, из 7 ячейки $7 читаем какие есть файлы начиная от текущей даты и подставляем их поштучно в wget. В принципе через for работает, но хочется же сделать всегда лучше.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:07 08-03-2018
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи, помогите с синтаксисом пожалуйста!!!
 
в неком ховто для centos команда  
chown user. "каталог"
 
никак не могу найти - что эта ... точка делает!
Подскажите аналогию для freebcd

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 22:15 25-03-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
Точка(.) раньше использовалась в качестве разделителя имени пользователя и группы. Возможно в коде еще совместимость и оставлена. Используйте двоеточие(:) и в man'ах читайте именно про двоеточие(:).
Если опустить группу, то будет взята "основная" группа указанного пользователя.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 22:28 25-03-2018 | Исправлено: Alukardd, 22:28 25-03-2018
karavan



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

Цитата:
Возможно в коде еще совместимость и оставлена.

Оставлена.
Но соглашусь, что лучше использовать "двоеточие", т.к. в случае, когда в имени учетки или группы есть точка, то chown с разделителем "точка" свалится в ошибку.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 22:51 25-03-2018
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В ошибку и вываливается.
 
Т.е, правильно ли я понимаю, что если  
pw group add grp1
pw user add usr1 -g grp1
 
то аналогом chown usr1. /usr/krap будет:
chown usr1:grp1 /usr/krap
 
?

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 00:18 26-03-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
Цитата:
то аналогом chown usr1. /usr/krap будет:
Совсем аналогом будет chown usr1: /usr/crap
О чем я Вам сказал выше
Цитата:
Если опустить группу, то будет взята "основная" группа указанного пользователя.

 
p.s. хз, что такое krap, crap выглядит лучше))

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

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

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

Код:
#!/bin/sh
exec $HOME/.z/doublecmd/doublecmd > $HOME/.z/doublecmd/doublecmd-test.log 2>&1

и тут вылез один момент: сразу после запуска открываю doublecmd-test.log и вижу последние две строки

Код:
FileSystemWatcher thread starting
TColumns

но если запустить Double Commander напрямую в терминале, то там больше строк:

Код:
FileSystemWatcher thread starting
TColumnsFileView.Create components
TColumnsFileView.Create components
TColumnsFileView.Create components
TColumnsFileView.Create components
TColumnsFileView.Create components
frmMain.frmMainShow

Почему так и можно ли получить всё?
 
2. Почему-то в doublecmd-test.log стоки из STDERR запросто влезают посреди строки из STDOUT, типа

Цитата:
TColumnsFileView.Create compone
(doublecmd:28122): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()
 
nts

а в терминале - порядок, ровно и аккуратно. Это как-то можно поправить?
 
3. В подобных случаях (запуск скриптом) есть ли смысл предварительно перейти командой cd в каталог программы?
 
Добавлено:
Xubuntu 17.10

Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 19:25 22-04-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off, для начала — про .xsession-errors вы курсе, просто вам удобнее так, да?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:32 23-04-2018
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Теперь в курсе, но лишь отчасти: Гугл выдаёт советы, как его отключить/удалить, на 4х языках (у кого-то на 40 с лишним Гб, хе-хе). Кто туда пишет? Все, кому не лень? Посмотрел у себя - из тех ошибок, которые Double Commander (далее DC) сыпет в консоль, там нет ни одной (и собран DC с минимальной зависимостью от системы, зачем ему писать что-то куда-то ещё?).
 
Туда, похоже, софт пишет из STDERR, тогда не очень подходит: мне нужно окружение, т.е. предыдущие строки из STDOUT, чтобы было понятно, откуда ноги растут.

Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 12:52 23-04-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off
> Теперь в курсе, но лишь отчасти: Гугл выдаёт советы, как его
> отключить/удалить, на 4х языках (у кого-то на 40 с лишним Гб,
> хе-хе). Кто туда пишет? Все, кому не лень?
 
Иксы.  Которые перенаправляют туда вывод ошибки со всех программ, у каких он, как вы думали, пропадает безвозвратно по причине того, что никуда не выводится.
 
> Посмотрел у себя - из тех ошибок, которые Double Commander (далее
> DC) сыпет в консоль, там нет ни одной (и собран DC с минимальной
> зависимостью от системы, зачем ему писать что-то куда-то ещё?).
>
> Туда, похоже, софт пишет из STDERR, тогда не очень подходит: мне нужно
> окружение, т.е. предыдущие строки из STDOUT, чтобы было понятно,
> откуда ноги растут.
 
То есть вы хотите сказать, что этот ваш «ДК» выводит ошибки на стандарный вывод вместо стандарного вывода ошибок?  Это баг, пишите рапорт.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:31 24-04-2018
Skif_off

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

Цитата:
Иксы.  Которые перенаправляют туда вывод ошибки со всех программ

Понял, спасибо, понаблюдаю. Хотя вопросы 1 и 3 всё ещё интересны

Цитата:
То есть вы хотите сказать, что этот ваш «ДК» выводит ошибки на стандарный вывод вместо стандарного вывода ошибок?

Нет, я сказал то, что сказал. В терминале вывод выглядит так (каждая строка соответствует строке вывода из соответствующего потока):

Код:
STDOUT
STDOUT
STDOUT
STDERR
STDERR
STDOUT

а если весь вывод перенаправить в файл, то в файле, бывает, получается так

Код:
STDOUT
STDOUT
STDO
STDERR
STDERR
UT
STDOUT

Почему?
 
Добавлено:
Тьфу ты, похоже, я неверно понял вопрос В общем, DC всё пишет как и куда положено - ошибки в STDERR, остальное в STDOUT, а в .xsession-errors вижу только ошибки, т.е. видимо, туда попадают строки из STDERR разных программ, но нет предшествующих строк из STDOUT. А они тоже нужны.

Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 19:19 24-04-2018 | Исправлено: Skif_off, 19:20 24-04-2018
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off
> В подобных случаях (запуск скриптом) есть ли смысл предварительно
> перейти командой cd в каталог программы?
 
То есть, в нормальном случае в /usr/bin?  Нет, конечно.


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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:53 24-04-2018
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго.
Помогите плиз разобраться со скриптом:
Эта "штука" делает образ microSD для Raspberry Pi 3.
по инструкции добывается так:
git clone https://github.com/freebsd/crochet /crochet
затем запуск ./crochet  -b RaspberryPi3
 
Запускал на freebsd 11.1
клонировал не в корень, а в /root/crochet
скрипт успешно (судя по логам) откомпилил world и kernel и вылетел на попытке перейти куда-то

Код:
 
root@max:~/crochet # ./crochet.sh -b RaspberryPi3
Starting at вторник, 29 мая 2018 г. 20:48:42 (+05)
Board: RaspberryPi3
Source version is: 334337
Building FreeBSD version: 11.1
Image name is:
    /root/crochet/work/FreeBSD-aarch64-11.1-GENERIC-334337-RaspberryPi3.img
Building FreeBSD version: 11.1
Object files are at: /root/crochet/work/obj/arm64.aarch64/usr/src
Found suitable FreeBSD source tree in:
    /usr/src
Found U-Boot port in:
    /usr/local/share/u-boot/u-boot-rpi3
Found firmware port in:
    /usr/local/share/rpi-firmware
Building FreeBSD aarch64 world at вторник, 29 мая 2018 г. 20:48:56 (+05)
    (Logging to /root/crochet/work/_.buildworld.aarch64.log)
Building FreeBSD aarch64-GENERIC kernel at среда, 30 мая 2018 г. 00:18:52 (+05)
    (Logging to /root/crochet/work/_.buildkernel.aarch64-GENERIC.log)
Building FreeBSD aarch64-GENERIC efi at среда, 30 мая 2018 г. 00:29:46 (+05)
    (Logging to /root/crochet/work/efi-aarch64-GENERIC/_.efi.aarch64-GENERIC.build.log)
cd: stand: No such file or directory
root@max:~/crochet # cat ./crochet.sh | grep cd
 

но!
я не могу понять, как скрипт устроен внутри - это какой-то другой уровень /bin/sh:

Код:
 
root@mx:~ # cat /root/crochet/crochet.sh
#!/bin/sh
set -e
echo 'Starting at '`date`
 
# General configuration and useful definitions
TOPDIR=`cd \`dirname $0\`; pwd`
LIBDIR=${TOPDIR}/lib
WORKDIR=${TOPDIR}/work
PREFIX="/usr/local"
SHARE_PATH="${PREFIX}/share"
PORTS_PATH="/usr/ports"
CONFIGFILE=
BOARD=
UPDATE_SOURCE=
 
VERBOSE=0
 
# Load utility libraries: strategy.sh must go first
. ${LIBDIR}/strategy.sh
# Rest in alphabetic order
. ${LIBDIR}/board.sh
. ${LIBDIR}/config.sh
. ${LIBDIR}/customize.sh
. ${LIBDIR}/disk.sh
. ${LIBDIR}/email.sh
. ${LIBDIR}/freebsd.sh
. ${LIBDIR}/gpt.sh
. ${LIBDIR}/scm.sh
. ${LIBDIR}/uboot.sh
. ${LIBDIR}/firmware.sh
. ${LIBDIR}/util.sh
 
crochet_usage ( ) {
    echo "Usage: sudo $0 [-b <board>|-c <configfile>]"
    echo " -b <board>: Load standard configuration for board"
    echo "    (Equivalent to loading a config file that contains"
    echo "    only a single board_setup command.)"
    echo " -c <file>: Load configuration from file"
    echo " -e <email>: Email address to receive build status"
    echo " -u: Update source tree"
    echo " -v: Print more detailed progress information"
    exit 2
}
 
# Parse command-line options
args=`getopt b:c:e:vu $*`
if [ $? -ne 0 ]; then
    crochet_usage
fi
set -- $args
while true; do
    case "$1" in
        -b)
            BOARD="$2"
            shift; shift
            ;;
        -c)
            CONFIGFILE="$2"
            shift; shift
            ;;
        -e)
            option Email "$2"
            shift; shift
            ;;
        -u)
            UPDATE_SOURCETREE=yes
            shift
            ;;
        -v)
            VERBOSE=$(($VERBOSE + 1))
            shift
            ;;
        --)
            shift; break
            ;;
        *)
            crochet_usage
    esac
done
 
#
# Load user configuration:  This builds the strategy.
#
if [ -z "$BOARD" ] && [ -z "$CONFIGFILE" ]; then
    crochet_usage
fi
if [ -n "$BOARD" ]; then
    board_setup $BOARD
fi
if [ -n "$CONFIGFILE" ]; then
    load_config $CONFIGFILE
fi
 
# Initialize the work directory, clean out old logs.
mkdir -p ${WORKDIR}
rm -f ${WORKDIR}/*.log
 
# Details for the email reports
BUILDCONFIG="TOPDIR: ${TOPDIR}
SOURCE TREE: ${FREEBSD_SRC}"
 
#
# What to do when things go wrong.
#
handle_trap ( ) {
    disk_unmount_all
 
    email_status "${BUILDCONFIG}" "Crochet build failed"
 
    echo
    echo 'ERROR: Exiting at '`date`
    echo
    exit 2
}
trap handle_trap INT QUIT KILL
 
if [ -n "${UPDATE_SOURCETREE}" ]; then
    scm_update_sourcetree
fi
 
#
# show source revision
#
scm_get_revision
 
#
# get the OS version from the source tree
#
freebsd_src_version
 
#
# Run the strategy to do all of the work.
#
email_status "${BUILDCONFIG}" "Crochet build commenced"
run_strategy
 
# Clear the error exit handler
trap - INT QUIT KILL EXIT
 
# Clean up
disk_unmount_all
 
email_status "${BUILDCONFIG}" "Crochet build finished"
echo 'Finished at '`date`
 

 
не понимаю, как это работает и что поправить (КУДА не получилось "cd"?)чтобы образ сформировался без перекомпиляции ядра и мира (сильно долго).

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 23:05 29-05-2018
U235

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

Цитата:
клонировал не в корень, а в /root/crochet  

Вот из-за этого, похоже, и не работает.
в crochet-master/lib/freebsd.sh
есть фрагмент:

Код:
echo "Building FreeBSD $CONF efi at "`date`
    echo "    (Logging to ${LOGFILE})"
    rm -rf ${EFI_DIR}/boot
    mkdir -p ${EFI_DIR}/boot/defaults
 
    cd stand
    eval $buildenv make "$@" -m $sharemk obj > ${LOGFILE} 2>&1  

а stand у FreeBSD в корне, а не в текущей папке.
можно попробовать заменить cd stand на cd /stand или клонировать в корень.
P.S. удачи с RPi3
 

Всего записей: 885 | Зарегистр. 14-12-2005 | Отправлено: 05:54 30-05-2018
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо!
ключевое слово "stand"!
теперь понятно, что я невнимательно прочёл ошибку....
 
И, ни на одном сервере у меня в "stand" корне нет.  
Он в корне сырцов (должен быть)
но, поскольку сырцы я по привычке качал как
svn co svn://svn.freebsd.org/base/releng/11.1/ /usr/src
то именно stand там нету.
а надо было  
svn co svn://svn.freebsd.org/base/head /usr/src/
 
придётся всё-таки перекомпилять...
 

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 08:06 30-05-2018
karavan



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

Код:
1.32.194.33/32
1.32.194.67/32

Результат выглядит так:

Код:
route 1.32.194.33/32 reject;
route 1.32.194.67/32 reject;

Команда с понятной мне нотацией для подобного результата:

Код:
sed 's/^/route /g; s/$/ reject;/g'

Тот же результат делает команда, которую хочется понять:

Код:
sed 's_.*_route & reject;_'

 
Где почитать про эту магию?

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 00:55 03-06-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan
В общем-то ни какой магии.
Амперсанд (&) представляет собой всё то что "сматчил" шаблон, в данном случае это вся строка (.*).
А подчркивание здесь хз ради какого выпендрёжа. На самом деле это всё таже команда s///, просто вместо привычного Вам слеша можно использовать совершенно любой символ.
 
Почитать? Ну, наверняка, всё это описано в документации - info sed
Что-то про s/// не вижу, но просто про regexp там описано, наверное ниже сказано типа "аналогично описанному выше"

'\%REGEXP%'
     (The '%' may be replaced by any other single character.)
 
     This also matches the regular expression REGEXP, but allows one to
     use a different delimiter than '/'.  This is particularly useful if
     the REGEXP itself contains a lot of slashes, since it avoids the
     tedious escaping of every '/'.  If REGEXP itself includes any
     delimiter characters, each must be escaped by a backslash ('\').
 
     The following two commands are equivalent.  They print lines which
     start with '/home/alice/documents/':
 
          sed -n '/^\/home\/alice\/documents\//p'
          sed -n '\%^/home/alice/documents/%p'
          sed -n '\;^/home/alice/documents/;p'


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 02:12 03-06-2018 | Исправлено: Alukardd, 02:17 03-06-2018
karavan



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

Цитата:
вместо привычного Вам слеша можно использовать совершенно любой символ.

Спасибо. Именно это я где-то пропустил.

Цитата:
sed -n '\%^/home/alice/documents/%p'
sed -n '\;^/home/alice/documents/;p'

Здесь первый разделитель (и только первый) экранируется, а в моем примере нет экрана перед первым подчеркиванием. Почему?
Если следовать примеру с разделителем ";", как разделить несколько команд из моего примера?
 

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 03:10 03-06-2018 | Исправлено: karavan, 03:23 03-06-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan
у команды s разделитель не надо экранировать
echo "ok ololo no" | sed 's_ .* _ & nono _; s? no$? YES?'
 
Это, даже логично, команда явно начинается с символа s, за которым следует разделитель. В случае с поиском, не ясно без экранирования. что это нечто начало команды поиска.
Можно довести до такого: echo "ok ololo no" | sed -n '\sololosp'

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 11:26 03-06-2018
VecH



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
использую wget для Windows например вот так:
wget --no-check-certificate --content-disposition "https://download.mozilla.org/?product=firefox-esr-latest&os=win&lang=ru"
все качается верно, на выходе: Firefox Setup 52.7.4esr.exe
 
т.к. в wget нет поддержки socks, а для Windows нет консольных утилит для заворачивания трафика в socks
попробовал curl в котором есть поддержка socks
 
но опять проблема, файлы на выходе через редиректы от mozilla получаются кривыми: product=firefox-esr-latest&
 
как дергать серверные имена файлов в curl
 
в интернете есть скрипты в два запроса, первый спрашивает имя, второй уже качает перенаправляя в полученное ранее имя файла, но они под linux, а у меня windows
 
Есть ли в curl какой то аналог параметра --content-disposition из wget ?

Всего записей: 2452 | Зарегистр. 18-02-2003 | Отправлено: 04:31 07-06-2018
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
VecH
В скриптах используются sed и/или grep, которые вполне есть под Win. Иногда еще xargs - тоже имеется.

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 07:57 07-06-2018
drondo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помочь со скриптом на баше, никак не могу разобраться.  
С помощью curl получаю JSON с рандомной картинкой JSON
нагуглил консольную утилитку jq для парсинга JSON.  
нужно сохранить файл по именем, указанным в ID, по ссылке, указанной в  .urls. full
ссылку на файл получилось узнать вот таким совмещением curl и jq:
 
Код:
curl -v -G --header "Authorization: Client-ID $KEY" https://api.unsplash.com/photos/random --data-urlencode "query=$keyWord" | jq '.urls | .full' | tr -d '"'
но не получается из этого же JSON выцепить и ID, чтобы сохранить под этим именем. А два запроса делать бесполезно, каждый запрос возвращает рандомную картинку.  
C помощью запятой в синтаксесе jq
Код:
.id, .urls
получаю так
 но перейти на уровень глубже не выходит, чтобы в одну переменную сохранить ID а в другой ссылку.
Может что подсказать? Что хочется получить в конечном результате - запросом curl получаю json с рандомной картинкой, выцепляю из ответа ID и ссылку, сохраняю ссылку тем же curl под нужным именем, указанным в ID. C переменными, curl  и jq вожусь всего второй день, поэтому наверняка что то упускаю

Всего записей: 461 | Зарегистр. 28-10-2005 | Отправлено: 13:49 10-06-2018 | Исправлено: drondo, 13:58 10-06-2018
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
drondo
Цитата:
curl -v -G --header "Authorization: Client-ID $KEY" https://api.unsplash.com/photos/random --data-urlencode "query=$keyWord" | jq '.id, .urls.full' | xargs curl <curl_params> -o

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 14:05 10-06-2018
drondo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
большое спасибо, работает, но чуть чуть не так как хотелось бы. имя получается без расширения. Можно ли как то получить через вывод
Код:
jq '.id, .urls.full'
две переменные внутри скрипта, $id и $url для дальшейшего использования, например если понадобится сохранить ссылку в файл. конструкция
Код:
var=$(curl -v -G --header "Authorization: Client-ID $KEY" https://api.unsplash.com/photos/random --data-urlencode "query=$keyWord" | jq '.urls | .full' | tr -d '"');
echo $var
дает одну строку, где два значения разделяются пробелами, хотя вывод в консоли
Код:
curl -v -G --header "Authorization: Client-ID $KEY" https://api.unsplash.com/photos/random --data-urlencode "query=$keyWord" | jq '.urls | .full' | tr -d '"'
выводит их в две строки, id и ссылку отдельно.

Всего записей: 461 | Зарегистр. 28-10-2005 | Отправлено: 15:28 10-06-2018 | Исправлено: drondo, 15:34 10-06-2018
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
drondo
Ну например так, если параметры комстроки (или переданные в процедуру) не особо нужны уже
Цитата:
set -- $(curl -v -G --header "Authorization: Client-ID $KEY" https://api.unsplash.com/photos/random --data-urlencode "query=$keyWord" | jq -r '.id, .urls.full')
id=$1
url=$2
(jq -r - это чтобы кавычки не мешались)

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 15:44 10-06-2018
drondo



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pasha_ZZZ
К сожалению в процедуру передаются как раз передаются 3 параметра при вводе, и они используются в дальнейшем, поэтому $1 и $2 нельзя затирать.

Всего записей: 461 | Зарегистр. 28-10-2005 | Отправлено: 15:56 10-06-2018 | Исправлено: drondo, 16:00 10-06-2018
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
drondo
Нуканешна... нельзя. Ведь перед этим set -- ну никак не написать
Цитата:
param1=$1
param2=$2
это ведь так сложно

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 16:10 10-06-2018
drondo



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

Всего записей: 461 | Зарегистр. 28-10-2005 | Отправлено: 16:45 10-06-2018
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вопрос про grep
 
--binary-files=ТИП считать, что двоичный файл имеет ТИП:   «binary», «text» или «without-match».    
-a, --text то же что и --binary-files=text    
-I то же, что и --binary-files=without-match

 
Как это работает? При поиске с параметром -а и без, на выводе разный результат, несмотря на то, что исходные файлы текстовые.
 
Добавлено:
Вообще, в каких случаях и зачем нужны эти параметры?

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 15:41 14-06-2018
Alukardd



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

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:05 14-06-2018
qw12



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

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 16:18 14-06-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qw12
Ну так потому что ключ -а говорит grep'у искать выражение в бинарниках, так как-буд-то это обычный текстовый файл.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:23 14-06-2018
qw12



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
А в чем разница для грепа, если он ищет по телу файла? Мне непонятно, в одном и том же файле, например, без 100 совпадений, а с 120 совпадений. Такого же не должно быть!?

Всего записей: 601 | Зарегистр. 04-06-2001 | Отправлено: 16:27 14-06-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qw12
Без -a он просто скажет что Binary file /bin/ls matches, а с -a он покажет подошедшие "строки" (строка здесь скорее всего нечто подошедшее под выражение между двумя 0x0A байтами)

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:51 14-06-2018 | Исправлено: Alukardd, 16:55 14-06-2018
NvvLazyTiger



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет, подскажите нубу, пожалуйста.
 
0. Я столкнулся с неприятным глюком в работе gAwk.exe:
Цитата:
gawk: Q:\#-Comm\siRepls1.awk:29: (FILENAME=- FNR=315) fatal error: internal error (SIGSEGV)
 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Наблюдается эпизодически (весьма редко). Появляется «как тать из кустов». Некоторое время «маячит» (на одном и том же «ровном» месте), затем исчезает (в этом месте).
Проблема в том, что  gAwk.exe используется при сборе/обработке данных, а заметить глюк удаётся лишь случайно. Соответственно, результаты работ (с привлечением gAwk) вызывают сомнение, как минимум...
 
1. Глянул в сети, сходу попалось только довольно невнятное:
Цитата:
It just sounds like a bug, probably introduced during the port to Win32.  It'd be difficult to diagnose without knowledge of debugging.  You may find that just getting another copy of gawk would resolve it, or as you found, another version completely has worked around the problem.

2. Диспозиция:
- ОС: WinXP+SP3 (Microsoft Windows XP [Версия 5.1.2600]);
- gAwk: GNU Awk 3.1.6. (Gawk for Windows);
- Задача:  собрать данные по гостевым раздела автора «Самиздата»;
- Алгортм:
  • запросить статистику раздела;
  • получить из статистики список текстов автора и по каждому тексту:
  • - выяснить наличие гостевой и, если она есть,
  • + получить данные самой первой и самой последней реплик.
3.Рабочий макет включает:
siStat.cmd
siStat.awk
siRepls1.awk
 
4. Выдача на экран штатно (фрагмент, для samlib.ru/s/sedrik/)
Цитата:
Q:\#-Comm>siStat.cmd s-sedrik.lst
? req s/sedrik/stat.shtml
:::
? req repls info for rycarxbezstraha
? req repls info for spisokfanfikowsmoimikommentarijami
:::

Тоже самое с глюком (фрагмент, первое вхождение siRepls1.awk в цикле опроса гостевой)
Цитата:
Q:\#-Comm> siStat.cmd s-sedrik.lst
? req s/sedrik/stat.shtml
:::
? req repls info for rycarxbezstraha
gawk: Q:\#-Comm\siRepls1.awk:29: (FILENAME=- FNR=315) fatal error: internal error (SIGSEGV)
 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

? req repls info for spisokfanfikowsmoimikommentarijami
:::

5. Вопрос: можно ли как-то защититься, или хотя бы надёжно обнаруживать факт?
 
Спасибо.
 
---
Удачи!
Влад.

Всего записей: 262 | Зарегистр. 14-02-2009 | Отправлено: 05:35 26-07-2018
quaritexa



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Наверное не туда спрашиваю, но может кто подскажет. Как запускать GNU утилиты из комплекта WSL под CMD (из батника например) windows 10?

Всего записей: 84 | Зарегистр. 26-09-2006 | Отправлено: 15:53 31-08-2018
ruslan910



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день.
Кто поможет поправить команду? именно на awk.
есть файл со столбцами:

Код:
 
22222222222222222  100 100 20200816  27857 20200815  55  57
33333333333333333  121 310 20200803  12900 20200731  41    
44444444444444444  360 455 20200816   9627 20200718  41    
55555555555555555   51 456 20200705  54188 20200606  55    
33333333333333333
99999999999999999
22222222222222222
 

Требуется в неотсортированном списке удалить все строки $0 имеющие совпадения по 1 колонке $1, т.е. должно получится

Код:
 
44444444444444444  360 455 20200816   9627 20200718  41    
55555555555555555   51 456 20200705  54188 20200606  55    
99999999999999999
 

есть примеры, но удаляются только дубликаты, т.е. одна строка остается.

Код:
 
awk '{if(arr[$1] == 0) {print; arr[$1] = 1}}' file
awk '!a[$1]++' file
 

Пробовал man читать, голова закружилась  ops:

Всего записей: 428 | Зарегистр. 31-05-2008 | Отправлено: 16:39 01-09-2018
U235

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

Код:
 
{
a[$1]++
m[$1]=$0
 }
END {
for(i in a)
{
if (a[i]==1)
{print(m[i] )}
}
}
 
 

 

Код:
awk -f test.awk file

Это если файл не сильно большой.
Можно без AWK:

Код:
cut -f1 -d' '  file |sort|uniq -u >un.txt
sort file >file_sorted
join -j1 1 -j2 1  un.txt  file_sorted

если сортировка не критична.
Еще проще:

Код:
sort file |uniq -u -w 17

проверка на уникальность первых 17 символов.

Всего записей: 885 | Зарегистр. 14-12-2005 | Отправлено: 08:44 02-09-2018 | Исправлено: U235, 14:07 02-09-2018
ruslan910



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
U235 Благодарю за помощь.

Всего записей: 428 | Зарегистр. 31-05-2008 | Отправлено: 13:17 02-09-2018
Valery_Sh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для тех кто делает ставку на (G)AWK, но пока блуждает в потёмках.
https://yadi.sk/i/m7iYcQTj3am7zg

Код:
GAWK: Effective AWK Programming
A User’s Guide for GNU Awk
Edition 4
December, 2012
может и есть лучше, но мне не попадалось.

Всего записей: 2171 | Зарегистр. 30-06-2008 | Отправлено: 14:47 02-09-2018
ruslan910



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

Всего записей: 428 | Зарегистр. 31-05-2008 | Отправлено: 20:22 03-09-2018
Valery_Sh



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

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

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

Всего записей: 2171 | Зарегистр. 30-06-2008 | Отправлено: 19:19 10-09-2018
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может у кого есть готовое решение.
Надо файлы, лежащие в папке переименовывать, формируя в начале ID код и при каждом запуске скрипта ID должно увеличиваться, исключая повторения.
Например есть файлы: file01.mp3, file02.mp3 из них надо сделать 0001_file01.mp3, 0002_file02.mp3.
Затем запускается скрипт и новые файлы принимают вид: 0003_file05.mp3, 0004_file05.mp3.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:03 27-09-2018
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
Как в имени файла однозначно определять идентификатор?

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 20:34 27-09-2018
digital422

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

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 07:45 28-09-2018
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422
Если скрипт не будет уметь обнаруживать идентификатор при его наличии в имени файла, то как вы себе представляете работу скрипта?

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 14:03 28-09-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan
Цитата:
Как в имени файла однозначно определять идентификатор?
Ну что Вы тут устраиваете, принимаете за истину, что начинается с \d+__ и всё. Чего тут разводить демогогию, если такой разделитель не зайдёт, вопрошающий сам его изменит.
 
digital422
Немного ада
Код:
d="/tmp/testd"; lastf=$(find "$d" -xdev -type f -regex '.*/[0-9]+__.*' -printf '%f\n' | sort -n -k1 -t_ | tail -1); [[ -e "$d/$lastf" ]] && lastn=${lastf%%__*} || lastn=0; while read -r f p; do [[ -z "$f" ]] && continue; ((lastn++)); mv "$p/$f" "$p/$(printf '%04d' $lastn)__$f"; done <<<"$(find "$d" -xdev -type f ! -regex '.*/[0-9]+__.*' -printf '%f %h\n')"


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

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

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Зачем так сложно
Вот это работает.
 

Код:
 
#!/bin/bash
 
#x=100000 #-первый запуск
x=$(cat /tmp/number.txt)
 
for i in $(ls /folder)
do
    mv ${x:1}_$i.jpg
    (( x++ ))
done
 
echo ${x} > /tmp/number.txt
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:41 28-09-2018
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
Ну вот. А вы сомневались в необходимости демагогии.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 20:26 28-09-2018
VecH



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
сейчас мучаю expect для автоматизации работы с терминалами на многих однотипных девайсах
в примерах в интернете у команды есть параметры -er -ex (например вот https://unix.stackexchange.com/questions/325096/expect-command-with-multiple-commands)
но что они означают, не пойму, в man тоже не все понятно, да и конкретно этих параметров там нет
 
подскажите кто знает
 
Добавлено:

Код:
#!/usr/bin/expect
 
if {[llength $argv] != 3} {
   puts "Вызов: script.sh <IP_ХОСТА> <ЛОГИН> <ПАРОЛЬ>"
   exit 1
}
 
set timeout 20
set name [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
 
spawn telnet $name
expect {
  "Login*"    {
    stty -echo
    send "$user\r"
    stty echo
  }
}
expect {
  "Password*" {
    stty -echo
    send "$password\r"
    stty echo
  }
}
expect {
  "(config)>" {
    stty -echo
    send "show associations\r"
    stty -echo
  }
}
expect {
  "(config)>" {
    stty -echo
    send "exit\r"
    stty -echo
  }
}
 

После отправки команды show associations в терминал
вылазит длинная портянка, как мне оттуда грепнуть только строки с содержанием mac ?
 
Добавлено:
И почему то stty -echo не отрабатывает, все равно вижу все в консоли

Всего записей: 2452 | Зарегистр. 18-02-2003 | Отправлено: 04:09 01-10-2018 | Исправлено: VecH, 04:10 01-10-2018
MAGNet



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

Код:
awk -F "@" '{ if (($3+0 > 0) && ($4 == "Москва")) {printf "%s,%d\n",$2,$3} }'

Руками запускаю - работает.
Запускается через incron - не работает.
Работать перестало после того, как гении в области обмена информацией добавиль фильтр с кирилическим полем Москва
 
Вот так работало всегда.

Код:
awk -F "@" '{ if ($3+0 > 0) {printf "%s,%d\n",$2,$3} }'

 
Не могу ума дать в чем разница запуска вручную или через incron? Есть у кого идеи?

Всего записей: 2074 | Зарегистр. 31-03-2004 | Отправлено: 10:57 03-10-2018
U235

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может быть проблема с кодировкой в crontabе или обрабатываемом awkом файле. Т.е. Москва м.б. записана в разных кодировках.

Всего записей: 885 | Зарегистр. 14-12-2005 | Отправлено: 12:53 03-10-2018
MAGNet



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
U235, с кодировкой всё нормально.
Ещё раз повторю: в папку падает письмо, по incron'у запускается скрипт, который из письма вытаскивается вложение и распарсивает. Всё срабатывает, скрипт автоматически запускается, файл вытаскивается, но распарсивается не верно. Тут же следом руками запускаю тот же скрипт, который отрабатывает без ошибок.
Ясно, что дело в кодировке или в каких-то переменных среды, которые не подтягиваются для демона incrond.
Надо ещё погуглить чё-нить про локали демонов.. Короче, я уже моск сломал

Всего записей: 2074 | Зарегистр. 31-03-2004 | Отправлено: 15:05 03-10-2018
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MAGNet
Задействуй hexdump, чтобы сравнивать не символы, а их коды.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 15:59 03-10-2018
U235

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

Код:
awk -F "@" '{ if (($3+0 > 0) && ($4 == "Москва")) {printf "%s,%d\n",$2,$3} }'  

написать скрипт в нужной кодировке для awk и вызывать типа awk -f scriptfile.awk
м.б. проблемы с кавычками..
или попробовать поотлаживать  
типа
Код:
awk -F "@" '{ if (($3+0 > 0)) {printf "%s\t%s\n",$0, $4} }'  

и посмотреть какой строке  какой соответствует $4.
какая версия awk и режим совместимости?

Всего записей: 885 | Зарегистр. 14-12-2005 | Отправлено: 17:57 03-10-2018
MAGNet



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

Цитата:
Ясно, что дело в кодировке или в каких-то переменных среды, которые не подтягиваются для демона incrond

Всё так и оказалось.
Если из скрипта проверить локаль, то увидим:

Код:
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

Проблема решилась путем добавления в начало скрипта:

Код:
export LANG=ru_RU.UTF-8

Всего записей: 2074 | Зарегистр. 31-03-2004 | Отправлено: 09:10 08-10-2018
Denis_Kokyev



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Windows 10 + SED
Есть  рутинная задача - каждый день скачивать файл, удалять/изменять в нём  определённые  слова/выражения, обрабатывать определённой прогой и закидывать на FTP.
Погуглил, для таких задач советуют SED, скачал версию под Windows (sed-4.5-x64.exe).
В  пакетный файл записал ряд команд, сразу столкнулся с тем, что если в  bat  файле  есть  слова/выражения  на  русском - они превращаются в крокозябры.  Решил этот вопрос сменой кодировки пакетного файла на 866 OEM Русская.
И  вот  тут столкнулся с другой бедой. Нужный файл качается в кодировке UTF8, обрабатывается   и   впоследствии  используется  так  же  в  UTF8.  Но поэкспериментировав,   оказалось,   что   слова/выражения на русском в этом  файле  SED заменяет лишь если файл перевести в кодировку ANSI, в UTF8 заменяются лишь английские слова.
И  вот вопрос - может есть у SED какая то возможность работать с UTF8, или я не правильно команды задаю? Вот как то так я делаю:

Код:
sed-4.5-x64.exe -i "s/Что/Чем/g" file.txt

Всего записей: 1074 | Зарегистр. 24-02-2003 | Отправлено: 11:36 09-10-2018
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Denis_Kokyev
Можно в батнике сменить кодовую страницу.
Цитата:
chcp 65001
где-нибудь в начале и весь батник в UTF-8

Всего записей: 12434 | Зарегистр. 11-03-2002 | Отправлено: 11:39 09-10-2018
Denis_Kokyev



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

Цитата:
Можно в батнике сменить кодовую страницу.  

У меня если в батнике выставить любую кодировку, кроме 866, команды с русскими словами превращаются в псевдографику и замена в текстовом файле (который в UTF8) не происходит.
 
В программе @TextReplacer для таких случаев есть ключ:  /codepage:utf8  может в SED есть что то подобное.
 
Пока с помощью консольной утилиты меняю кодировку туда/сюда, примерно как-то так:

Код:
win_iconv.exe -c -f UTF-8 -t CP1251 "test.txt" > "test_1251.txt"

Всего записей: 1074 | Зарегистр. 24-02-2003 | Отправлено: 12:04 09-10-2018 | Исправлено: Denis_Kokyev, 13:47 09-10-2018
MAGNet



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Denis_Kokyev, нужно попробовать батник сохранить в кодировке UTF-8.
Это не проблема SED - это проблема операционной системы, какие строки она передает, такие и попадают.
То что при просмотре этого файла вы будете видеть крокозябры - ничего страшного.
У меня, например, прекрасно работает батник, где требуется DOS-кодировка, хотя в блокноте он отображается вот так:

Код:
net use O: "\\SR-DC1\ЋЎйЁҐ ¤®Єг¬Ґ-вл"

Основная задача - сохранить батники именно в кодировке обрабатываемых файлов.
Попробуйте сторонние редакторы типа Notepad++ Я лично для работы в винде пользуюсь FAR'ом, там редактор по Shift-F2 предлагает выбрать кодировку для сохранения.
В общем, нужно пробовать варианты..
 
зы
ну и самый брутальный метод - использовать двоичный формат
например так:

Код:
sed-4.5-x64.exe -i "s/\xD0\xA7\xD1\x82\xD0\xBE/\xD0\xA7\xD0\xB5\xD0\xBC/g" file.txt

HEX-коды можно так же посмотреть в просмотрщике FAR'а (F4)

Всего записей: 2074 | Зарегистр. 31-03-2004 | Отправлено: 08:47 10-10-2018 | Исправлено: MAGNet, 08:48 10-10-2018
MAGNet



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

Код:
win_iconv.exe -c -f UTF-8 -t CP1251 "in.utf8" |  sed-4.5-x64.exe -i "s/Что/Чем/g" | win_iconv.exe -c -f CP1251 -t  UTF-8 > "out.utf8"

Всего записей: 2074 | Зарегистр. 31-03-2004 | Отправлено: 05:15 11-10-2018
Denis_Kokyev



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MAGNet
Да проблем то как и чем кодировать нет, проблема в том, что у меня это не работает.
Про брутальный метод - думал, но не особо понимал как это реализовать. Благодаря Вашему примеру нашёл онлайн конвертер в UTF-8 на этом и остановился. Батник теперь у меня как и обрабатываемый файл - одного формата, всё работает как надо. И собирать слова / выражения по буковкам в фаре не надо.
Почему пришлось отказаться от использования консольной утилиты  win_iconv.exe.
Обратил внимание, что как то криво происходит замена после конверта - на некоторых словах пропадают буквы. Я бы понял, еслиб во всём файле эти буквы пропали, но нет. Может быть даже в одном слове буква в начале присутствовать, а в середине - отсутствовать. Причем до обработки SEDом - всё с буковками в порядке - то бишь утилита iconv обрабатывает файл правильно. Что то c SED потом не то. Попробую потом на других версиях SED. Или это связано как то с BOM...  
Но надоело уже экспериментировать  - с брутальным методом вроде пашет и на том хорошо!
Спасибо Вам за помощь!

Всего записей: 1074 | Зарегистр. 24-02-2003 | Отправлено: 12:49 11-10-2018 | Исправлено: Denis_Kokyev, 12:56 11-10-2018
MAGNet



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

Цитата:
Батник теперь у меня как и обрабатываемый файл - одного формата, всё работает как надо.

Всего записей: 2074 | Зарегистр. 31-03-2004 | Отправлено: 13:11 11-10-2018
Victor_VG



Tracker Mod
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вчера cURL обновили до версии 7.62.0.Из новых свойств появилась поддержка DOH - DNS-other-HTTPS, исправлено много ошибок. Официальная сборка для Win32/Win64 собрана в MinGW64 с поддержкой OpenSSL 1.1.1 и WinSSL, обновлены некоторые библиотеки:
 
curl 7.62.0 Win32/Win64 MinGW-w64 standalone build by Viktor Szakets
 
Release date: 2018-10-31
 
Libs:
 
  libcurl/7.62.0 OpenSSL/1.1.1 (WinSSL) zlib/1.2.11 brotli/1.0.7 WinIDN libssh2/1.8.0 nghttp2/1.34.0
 
Protocols:
 
  dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
 
Features:
 
  AsynchDNS IDN IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL libz brotli TLS-SRP HTTP2 HTTPS-proxy MultiSSL

 
первые впечатления хорошие, на UNIX я её еще не собирал - приятель как обычно обещал прислать оптимизированные под наше железо патчи под Tru64 UNIX AXP и демона. С ними и посмотрю.

----------
Жив курилка! (Р. Ролан, "Кола Брюньон")
Xeon E5 2697v2/C602/128 GB PC3-14900L/GTX 1660 Ti, Xeon E5-2697v2/C602J/128 Gb PC3-14900L/GTX 1660 Ti

Всего записей: 33290 | Зарегистр. 31-07-2002 | Отправлено: 12:57 01-11-2018
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи, может я какую чушь спрашиваю или элементарщину - ну вот не знаю.
Freebsd, оболочка - sh.
Надо зайти из хост1 на хост2 по ssh, запустить там, допустим, /usr/abcd.sh, и отключиться, но чтобы /usr/abcd.sh продолжал выполнятся. аутентификация ssh - по ключам.
Интерактивно, в принципе, я это могу сделать - через запуск screen (при этом ещё и сам screen останется висеть).
Но надо, чтобы это делалось по расписанию. Желательно - сугубо средствами ОС, без доппакетов.
Возможно?

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 07:44 03-11-2018
U235

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

Код:
$ ssh root@192.168.1.1  'bash -s /usr/abcd.sh&'

Не уверен, но возможно как-то так..
Если надо по расписанию, то может имеет смысл использовать cron на хосте2?

Всего записей: 885 | Зарегистр. 14-12-2005 | Отправлено: 08:35 03-11-2018 | Исправлено: U235, 08:36 03-11-2018
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cron нельзя, в параметрах выполнения передаётся генерируемый хостом 1 пароль, а хост 2 крутится на внешнем хостинге.
sh -s не подходит, он запускает ДОЧЕРНИЙ процесс.  
А надо типа как запустил форк, отключился от него, самоубился. А форк продолжает крутится.
но как это в шелле реализовать - не знаю..
 
Добавлено:
Поправочка: невнимательно прочёл ответ U235.
Вроде работает, но как-то странно..

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 12:09 03-11-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
Я давно, конечно фрю не видел, но nohup ещё ни кто не отменял.
 
ssh host2 "nohup /my/super/command >>/var/log/mysuppercommand.log 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:30 03-11-2018
dvk54

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
почитал про nohup, но приведённый Вами пример не работает:
 
#ssh host2 "nohup /root/u.sh>/var/log/test.log 2>&1 &"
"Неоднозначное перенаправление вывода."
 
#ssh host2 "nohup /root/u.sh>/var/log/test.log &"
- нормально, так, как и надо.
 
З.Ы.Я фрю вижу каждый день уже давно, но всего в ней не знаю. Она велика.
З.Ы.2 Спасибо!

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 16:13 03-11-2018 | Исправлено: dvk54, 16:14 03-11-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
Если там есть bash, то там сокращённо перенаправлять так: &>>/var/log/log.log
 
Ещё хочу обратить Ваше внимание на то, что Вы изменили перенаправление с дозаписью в файл в его перетирание: > vs >>

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:06 03-11-2018 | Исправлено: Alukardd, 18:06 03-11-2018
dvk54

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

Код:
 
ssh host2 'nohup /usr/local/etc/ar.sh 123 &'
 

ar.sh:

Код:
#!/bin/sh
portsdb -u
/usr/local/bin/rar a -inul -r -m5 -agYYYY-MM-DD_HHmm -p$1 /var/r.rar /usr/local &
 

 
2. запуск из u.sh portsdb -u - не работает. Пробовал и так
/usr/local/sbin/portsdb -u
и так
/usr/local/bin/ruby24 /usr/local/sbin/portsdb -u
3. запуск rar из u.sh - тоже не работает. Вывод rar блокирует закрытие сессии. Правда, если закрыть по ctl-c - продолжает выполнятся.
 

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 09:57 04-11-2018 | Исправлено: dvk54, 09:58 04-11-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
Во-первых, & внутри скрипта уже лишний.
Во-вторых, Что значит "не работает? В лог-то хоть что-то попадает? Ну или вам в консоль, хотя бы.
В-третьих, вообще-то, переписывать ни чего не надо, всё и так должно работать, будь то sh или bash.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 19:45 04-11-2018
dvk54

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

Код:
 
root@host1:~ # ssh host2 'nohup /bin/sh -s /root/u.sh >> /var/log/test.log 2>&1 &'
Неоднозначное перенаправление вывода.
root@host1:~ # ssh host2 "nohup /bin/sh -s /root/u.sh >> /var/log/test.log 2>&1 &"
Неоднозначное перенаправление вывода.
root@host1:~ #
 

"В-третьих" - ну вот не работает...
 
а portsdb отрабатывает вот как:
root@host1:~ # ssh host2 '"nohup cd /usr/ports&&portsdb -uU &"'
на хосте2 в htop, на пару секунд возникает картина:

Код:
 
  PID USER      PRI  NI  VIRT   RES S CPU% MEM%   TIME+  Command
    0 root      -16   0     0   272 S  0.0  0.0  4:01.50 kernel
    1 root       52   0  5428  1152 S  0.0  0.1  0:00.04 L- /sbin/init --
 7880 root       52   0  7484  3460 S  1.5  0.2  0:00.00    +- csh -c nohup cd /usr/ports&&portsdb -uU &
 7882 root       72   0 14944  9136 R  4.9  0.5  0:00.15    ¦  L- /usr/local/bin/ruby24 /usr/local/sbin/portsdb -uU
 

и всё. в логах ничего нет. на консоли host2 - ничего не выводится.
я чего-то главного не понимаю, похоже

Всего записей: 178 | Зарегистр. 18-06-2005 | Отправлено: 20:15 04-11-2018 | Исправлено: dvk54, 20:27 04-11-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
А зачем вы по ssh ещё дополнительно вызываете /bin/sh?
Да ещё и зачем-то с ключлм -s, это же stdin читать, а  у Вас его нету.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:42 04-11-2018
CKOPnuOH



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здравствуйте уважаемые Гуру!
 
ASE_DAG

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

 
И снова я
Прошло не мало времени и наш с Вами написанный скрипт исправно работает по сей день.
 
Параллельно ему трудился еще один скрипт но на sh:

Код:
 
#!/bin/sh
 
DIR=/usr/local/etc
RCFG=/usr/local/etc/rinetd.conf
 
ping -n -c 1 -s 1 172.17.2.10 >/dev/null 2>&1
    if [ $? -ne 0 ]; then
    ping -n -c 1 -s 1 172.17.2.11 >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        if [ -f $DIR/.default.key ]; then
        rm $DIR/.default.key
        fi
        if [ -f $DIR/.reserve.key ]; then
        rm $DIR/.reserve.key
        fi
        date | xargs echo >> $DIR/vpn_error.log
    else
        if [ -f $DIR/.default.key ]; then
        rm $DIR/.default.key
        fi
        if [ -f $DIR/.reserve.key ]; then
        else
        echo > $RCFG
        echo logfile /var/log/rinetd.log >> $RCFG
        echo >> $RCFG
        echo 0.0.0.0 3389    172.17.2.11    50000 >> $RCFG
        echo >> $RCFG
        service rinetd restart
        date | xargs echo > $DIR/.reserve.key
        fi
    fi
    else
    if [ -f $DIR/.reserve.key ]; then
        rm $DIR/.reserve.key
    fi
    if [ -f $DIR/.default.key ]; then
    else
        echo > $RCFG
        echo logfile /var/log/rinetd.log >> $RCFG
        echo >> $RCFG
        echo 0.0.0.0 3389    172.17.2.10    50000 >> $RCFG
        echo >> $RCFG
        service rinetd restart
        date | xargs echo > $DIR/.default.key
    fi
    fi
 
 

 
Который проверял наличия пинга двух тунелей и в зависимости от их работоспособности конфигурировал rinetd.
 
Вообщем в последнее время второй скрипт стал себя как-то странно вести. ОЧЕНЬ! МНОГО!! ложных срабатываний.
И решил я его переписать на что-то новое по типу Вашей серии:

Код:
 
if ping -c "$c" "$host" \
| awk -v c="$c" \
'$3 == "transmitted," && c == $1 && $1 == $4 { success = 1 }
END { if (!success) exit 3 }'
then
echo 'OK'
else
echo 'FAIL'
fi  
 

Но так как мои знания awk скудны - прошу помочь перевести скрипт из sh в скрипт awk который был написан ранее.
 
ADD. Имеется ввиду объединить оба скрипта в один.  
 
Добавлено:
Сами print-ы да передергивания rinetd я переписать то смогу, а вот как правильно и в каком месте того скрипта прописать проверку пинга на подобие Вашего скрипта - что-то собразить не получается.

Всего записей: 339 | Зарегистр. 28-05-2004 | Отправлено: 08:55 06-11-2018 | Исправлено: CKOPnuOH, 08:59 06-11-2018
redson



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как реализовать в bash скрипте логирование ошибок (плохих errorlevel) при выполнение команд. Например при выполнение команды, произошла ошибка, нужно сохранить ошибку в error.log
 
Например сейчас я после каждой команды, пишу условие:
 
#если errorlevel больше 0, то пишем в лог ошибок
if [[ $? -gt 0 ]];then
echo -e >> $ERROR_LOG
echo -e "Erorr!!! Problem ! (`date +%Y_%m_%d-%H_%M_%S`)" >> $ERROR_LOG
 
все работает отлично, но в скрипте получается много строк, хочется как то по компактней

Всего записей: 1336 | Зарегистр. 23-04-2007 | Отправлено: 10:04 07-11-2018 | Исправлено: redson, 10:07 07-11-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redson
ну начнём с того что сам stderr команды надо писать в лог.
Это просто exec 2>"$ERROR_LOG" в начале скрипта.
 
А вообще можете что-то типа такого использовать

Код:
 

#!/bin/bash
 
ERROR_LOG="/tmp/errlog"
 
exec 2>>"$ERROR_LOG"
 
function err() {
  echo -e "[$(date +%Y_%m_%d-%H_%M_%S)] ERROR: $*" >&2
}
 
function run() {
  $*
  if [[ $? -ne 0 ]]; then
    err "Command failed: '$*'"
  fi
}
 
run true
run false
run ls -l
run false 2

 


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 18:12 07-11-2018
Alukardd



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

Код:

ERROR_LOG="/tmp/errlog2"
exec 2> >( cat | xargs -I {} echo -e "[$(date +%Y_%m_%d-%H_%M_%S)] ERROR: {}" >>"$ERROR_LOG"; )


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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 00:26 08-11-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Возможно кто-нибудь подскажет: как скачать при помощи curl?
https://urlhaus.abuse.ch/downloads/csv/
https://urlhaus.abuse.ch/downloads/text/

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 14:30 14-12-2018
karavan



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

Код:
curl -s https://urlhaus.abuse.ch/downloads/text/ > urlhaus.abuse.ch.txt

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 14:45 14-12-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan,
Спасибо. Буду со своим curlrc разбираться, ибо с ним не работает.

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 15:36 14-12-2018
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Выпуск GNU Grep 3.2 и Sed 4.6

Всего записей: 4961 | Зарегистр. 05-01-2006 | Отправлено: 09:20 22-12-2018
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Прошу совета по корректировке скрипта с целью ускорения его работы.
Задача:
Есть файл с миллионом записей FQDN, которые необходимо отресолвить и если есть значение типа A или CNAME, то сложить в отдельный файлик.
Ресолв осуществляется на локально установленном unbound.
Сам скрипт:
 
 
Проблема в том, что я не понимаю причин, по которым скрипт обрабатывает не более 10-15 входных строк за секунду.

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



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

Код:
MAX_JOBS=15; cat /tmp/domains | parallel --jobs=$MAX_JOBS -I {{}} 'dig +short {{}} @127.0.0.1;' >> /tmp/result.file

Ключи parallel: -k, --lb и --group добавлять по желанию после прочтения man'а.
 
Добавлено:
К томуже какой continue внутри subshell'а в if?.. Он там просто не отработает же.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 16:36 24-12-2018
karavan



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

Цитата:
Ключи parallel

Спасибо!

Цитата:
какой continue внутри subshell'а в if?

Да, прочитав вопрос, осознал казус. Самое интересное, что оно работало ))
Правда, недолго, через 15-20 тысяч доменов родитель загружал проц на 100, а дети (ps, grep и wc) об'являлись зомбиками.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 18:36 24-12-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ссылка для примера:
https://raw.githubusercontent.com/carsonoid/sublime_man_page_support/master/Man%20Page/Man%20Page.sublime-syntax
при помощи wget скачивается как Man Page.sublime-syntax
при помощи curl как Man%20Page.sublime-syntax
добавлял ключи -O, -J безуспешно. Как заставить curl скачивать с именем без "%20"?

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 12:48 29-12-2018
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
los
Ну как бы об этом сказано прямо в man curl
There is no URL decoding done on the file name. If it has %20 or other URL encoded parts of the name, they will end up as-is as file name.
 
Добавлено:
Как с этим потом работать в bash'е?
Есть весьма простой ответ и на чистой bash'е — https://stackoverflow.com/questions/6250698/how-to-decode-url-encoded-string-in-shell#answer-37840948

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:57 29-12-2018
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd,
Благодарю. Буду для таких ссылок использовать wget

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 15:38 29-12-2018
mithridat1



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

Всего записей: 4961 | Зарегистр. 05-01-2006 | Отправлено: 13:29 08-01-2019
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кто-нибудь использует программы bmake, bsdmake и т.п.?
Нужна помощь с настройкой.

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 15:50 02-03-2019
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, помогите советом плиз...
 
Хотел сделать пинговалку заданного диапазона, но не по IP-адресу, а по имени:

Код:
 
#!/bin/bash
for (( count=000; count<131; count++ ))
do
ping -c 1 host-$count
done
 

Идея в том, чтобы пинговалка начинала с имени host-000, далее host-001 и т.д., но она упорно не воспринимает впереди стоящие нули.
Вопрос. Как заставить скрипт делать то что мне нужно?

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 11:40 16-03-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
newhk
ping -c 1 host-$(printf '%03d' $count)
 
Добавлено:
Ну или так
Код:
#!/bin/bash
for i in {000..202}; do
    ping -c 1 host-$i
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.

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

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

Код:
ping -c 1 host-`printf '%03d' $count`

Всего записей: 885 | Зарегистр. 14-12-2005 | Отправлено: 13:47 16-03-2019 | Исправлено: U235, 13:55 16-03-2019
newhk



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


Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 22:55 16-03-2019
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Некоторое назад пришлось решать следующую задачу:
Цитата:
Составление списка каталогов в текущей папке, обрабатываются пробелы в именах
Нашел изящное решение посредством утилиты awk:
Цитата:
ls -l | grep '^d' | awk '{print substr($0, index($0,$9))}'
...но эйфория длилась недолго. Оказалось, что awk работает неверно
Цитата:
...and doesn't work if any field before ninth contains the same value as the ninth
Я почти сразу обнаружил на конкретном примере
Цитата:
Исходные данные Результат работы команды    
drwxrwxr-x. 2 User User  4096 Jul 28  2018 1 18 1    
drwxrwxr-x. 2 User User  4096 Jul 28  2018 Assembly Assembly    
drwxrwxr-x. 3 User User 12288 Jul 28  2018 C++ C++
Я воспользовался утилитой sed
Решение:
ls -l | grep '^d' | sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
 
Вопрос: ошибка в утилите awk исправлена? У меня она версии
Цитата:
GNU Awk 3.1.7


----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 09:37 17-03-2019 | Исправлено: TeXpert, 09:48 17-03-2019
Alex_Piggy

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

Цитата:
Составление списка каталогов в текущей папке, обрабатываются пробелы в именах

А чем плох find?
find . -maxdepth 1 -type d

Цитата:
ls -l | grep '^d' | awk '{print substr($0, index($0,$9))}'  
...но эйфория длилась недолго. Оказалось, что awk работает неверно

Почему Вы считаете, что ошибка в awk?
index($0,$9) - находит первое вхождение текста из $9 в $0. Это не найти 9 столбец. Хотя бы index($0, FS $9 FS)

Цитата:
У меня она версии  GNU Awk 3.1.7

Как бы 10 лет прошло... Посмотрите 4.6 Reading Fixed-Width Data
UPD. Прошу прощения. Ctrl-V+Enter отправили недописанное сообщение.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 11:38 17-03-2019 | Исправлено: Alex_Piggy, 11:47 17-03-2019
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
Цитата:
А чем плох find?
find . -maxdepth 1 -type d
Наверное, ничем, только надо отсеивать скрытые, плюс надо чистить ненужные приставки "./"
Цитата:
Почему Вы считаете, что ошибка в awk?
А Вы последуйте по ссылке, которую я привел, почитайте, какую задачу там решали --- вывести поля, начиная с 9-й, а не только
Цитата:
Это не найти 9 столбец

Цитата:
Как бы 10 лет прошло...
Как ни странно, в моем Scientific Linux 6.9 такая старая версия. Стало быть, так обстоят дела у многих, не только у меня

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 12:54 17-03-2019
Alex_Piggy

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

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

Почему ВЫ считаете, что причина ошибки в самом awk, а не в логике скрипта? Я вижу ошибку в скрипте.

Цитата:
вывести поля, начиная с 9-й, а не только

У awk нет возможности определить положение поля. Разве что регекспом - как в том же sed.
ls -l | awk "{match($0, /^\s*(\S+\s+){8}(.*)$/ ,arr); print arr[2];}"
Но и на sed тогда можно также
ls -l | sed -re "s/^\s*(\S+\s+){8}(.*)$/\2/"
Выгода awk будет разве что если использовать поля с заданной шириной (Fixed-Width Data)
PS. То решение, которое Вы использовали -  съест двойные пробелы в именах.

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 14:15 17-03-2019 | Исправлено: Alex_Piggy, 14:16 17-03-2019
los

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert,
если не стоит задача использовать только стандартный программы, то для данной задачи удобно использовать fd
https://github.com/sharkdp/fd
 
   

Всего записей: 7362 | Зарегистр. 08-09-2001 | Отправлено: 15:47 17-03-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert
По-поводу исходной проблемы:
Код:
find . -mindepth 1 -maxdepth 1 -type d ! -path './.*' -printf '%P\n'

По-поводу awk: решение с substr и index не кажется изящным, ответ с использованием NF куда прозрачнее и надёжнее.

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

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



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, привет!
Нужна помощь в скрипте, который загружает правила в Iptables
Хочу, чтобы в рамках определенного времени доступ в интернет блокировался на определенный хост.
Делаю так:

Код:
 
# Переменные
# Начало
MinDate=`date -d "10:00" +%H:%M`
# Конец
MaxDate=`date -d "15:00" +%H:%M`
# Текущая дата
CurDate=`date +%H:%M`
 
# Задаем условие
if (( $MinDate < $CurDate < $MaxDate )); then  
    iptables -I FORWARD 1 -d 172.23.11.152 -j REJECT  
fi
 

Но bash выдает ошибку:
-bash: ((: 10:00 < 12:06 < 15:00 : синтаксическая ошибка в выражении (неверный маркер «:00 < 12:06 < 15:00 »)
 
Экранирование ломает переменную.
Пробовал указывать явно:
 
if (( $('date -d "10:00" +%H:%M') < $CurDate < $MaxDate )); then  
    iptables -I FORWARD 1 -d 172.23.11.152 -j REJECT
fi
 
Тот же результат.
Подскажте пожалуйста, как построить выражение, чтобы оно работало?
Или, быть может, есть элегантнее решение?
 
Пробовал делать так:
iptables -I FORWARD 1 -s 172.23.11.152 -m time --timestart 10:00 --timestop 15:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
Не работает. Т.е. ка-будто его нет вовсе...
 
Если сделать: iptables -I FORWARD 1 -s 172.23.11.160 -j REJECT - работает.
 
А еще, мне непонятно, почему, если сделать так:
iptables -I FORWARD 1 -s 172.23.11.152 -d eth1 -m time --timestart 10:00 --timestop 15:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
Система ругается, что такого интерфейса нет, хотя он есть, это точно...
 

Код:
 
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.11.11.11  netmask 255.255.254.0  broadcast 11.11.10.255
        inet6 fe80::215:5dff:fe0b:640c  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:0b:64:0c  txqueuelen 1000  (Ethernet)
        RX packets 256999269  bytes 252484553854 (252.4 GB)
        RX errors 0  dropped 259399  overruns 0  frame 0
        TX packets 95268664  bytes 35405775114 (35.4 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 

ОСь - Ubuntu server 18.04.02
 
Уточнение.
Правило:
iptables -I FORWARD 1 -s 172.23.11.152 -m time --timestart 10:00 --timestop 15:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
заработало, только не так как мне нужно.
По факту, ему пофиг на параметры времени. Он начал блокировать все постоянно.
Т.е., так же как правило: iptables -I FORWARD 1 -s 172.23.11.160 -j REJECT
Есть идеи?

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 19:48 01-04-2019 | Исправлено: newhk, 22:24 01-04-2019
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В связи с полученной информацией, вопрос меняется.
На форуме убунту мне ответили, что в ядро не встроен модуль времени, типа нужно пропатчить и все будет ОК.
Но как пропатчить и где взять тот самый патч-модуль, почему-то молчат.
Изрыл интернет, но как-то не находиться...
 
Установил livepatch
 

Код:
 
snap install canonical-livepatch
canonical-livepatch enable [TOKEN]
 

 
Вместо "TOKEN" вставил свой сгенерированный ID
 
Версия ядра - 4.15.0-47
Если что.

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 08:30 04-04-2019
karavan



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

Цитата:
Есть идеи?

В кроне правило на запуск скрипта:
0 10,15 * * 1,2,3,4,5 /path/to/script
В скрипте делаем проверку на время в какое произошло исполнение, на основании чего принимаем решение об удалении правила, либо о его применении.
Далее проверка текущих правил на необходимость делать действие.
Если правило надо было добавить, но оно уже есть, то ничего не делаем.
Если правило надо было удалить, а удалять нечего, то также ничего не делаем.
Во всех остальных случаях делаем действие.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 10:39 04-04-2019
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan
Спасибо, но я вроде как нашел решение, но еще не до конца...
 
Подскажете как ему указать правильное время?
Опция --kerneltz не работает.
Т.е. указывая правило
 

Код:
 
$IPT -I FORWARD 1 -s 172.23.11.152 -m time --timestart 10:00 --timestop 15:00 --weekdays Mon,Tue,Wed,Thu,Fri --kerneltz -j REJECT
 

 
Мы имеем правило
 

Код:
 
$IPT -I FORWARD 1 -s 172.23.11.152 -m time --timestart 10:00 --timestop 15:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
 

 
Соответственно, чтобы оно заработало, нужно отнимать 3 часа (время по Мосвке).
 
Если что, так тоже не работает местное время

Код:
 
$IPT -I FORWARD 1 -s 172.23.11.152 -m time --kerneltz --timestart 10:00 --timestop 15:00 --weekdays Mon,Tue,Wed,Thu,Fri -j REJECT
 

 
Добавлено:
Хотелось бы все-таки допилить, чтобы было православно и без костылей.

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 12:12 04-04-2019
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Неужели никто не сталкивался с ситуацией, когда IPTables использует время по Гринвичу и ему все равно на параметр --kerneltz ?

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 14:49 04-04-2019
newhk



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отвечу сам...
 
Вдруг кому пригодится.
Решение https://www.linuxquestions.org/questions/slackware-14/iptables-m-time-option-doesn%27t-update-when-the-clock-changes-937031/
Если правило работает по гринвичу, то надо настроить системные часы выполнив команду

Код:
 
hwclock --localtime --systz
 

 
После чего правило будет работать корректно и не придется отнимать (3 часа от нужного времени, как у меня было)

Всего записей: 400 | Зарегистр. 02-02-2009 | Отправлено: 18:17 04-04-2019 | Исправлено: newhk, 18:18 04-04-2019
redson



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
помогите составить регулярку, необходимо убрать рандомные цифры внутри квадратных скобок [pid *] и сами скобки
 
есть записи в файле:
 
Fri Apr 26 06:41:59 2019 [pid 5805] [user2] OK LOGIN: Client "192.168.50.30"
Fri Apr 26 07:12:00 2019 [pid 6809] [user4] OK LOGIN: Client "192.168.50.34"
 
хочу вот такой результат:
 
Fri Apr 26 06:41:59 2019 pid [user2] OK LOGIN: Client "192.168.50.30"
Fri Apr 26 07:12:00 2019 pid [user4] OK LOGIN: Client "192.168.50.34"
 
т.е [pid *] превратился в pid

Всего записей: 1336 | Зарегистр. 23-04-2007 | Отправлено: 14:17 26-04-2019 | Исправлено: redson, 14:39 26-04-2019
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
redson
https://regex101.com/r/C26daj/1

Код:
 
$ echo 'Fri Apr 26 06:41:59 2019 [pid 5805] [user2] OK LOGIN: Client "192.168.50.30"' | sed 's/\[pid [0-9]\+\]/pid/'
Fri Apr 26 06:41:59 2019 pid [user2] OK LOGIN: Client "192.168.50.30"
 

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 16:02 26-04-2019 | Исправлено: karavan, 16:03 26-04-2019
YuS_2



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

Цитата:
убрать рандомные цифры внутри квадратных скобок [pid *] и сами скобки

https://regex101.com/r/05KSAq/1

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:06 26-04-2019
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дано:
s1=10
var=1
Где s1 и var переменные.
Нужно через $var получить 10. Система  - программа Termux на телефоне,эжмулятор терминала.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:19 28-09-2019
karavan



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

Цитата:
Дано:
s1=10
var=1
Где s1 и var переменные.
Нужно через $var получить 10.  


Код:
$ s1=10
$ var=1; echo $var
1
$ var=${s1}; echo $var
10
 

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

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 16:46 28-09-2019
king_stiven

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

Цитата:
потому что спрашивать тоже надо уметь.

Можно использовать букву "s" и "$var". Остальное нельзя, цифру "1" нельзя.

Цитата:
var=${s1}


Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 22:14 28-09-2019
zertyuiop



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может кто поможет. Занялся научными расчетами и решил использовать для этих целей облако с Linux. Встала такая задача: в директории находится несколько поддиректорий с input-файлами, и, возможно, результатами расчетов (файл .frd). Требуется при запуске компьютера просканировать директории на наличие файла расчетов (.frd) и, если он отсутствует, запустить процесс-солвер, а потом постпроцессор, при этом количество одновременных расчетов не может превышать определенное количество (это зависит от количества ядер, обычно количество ядер - 1). По мере надобности могут добавляться дополнительные директории с input-файлами, их тоже надо сканировать. По окончании всех расчетов необходимо отключить машину. При этом, если при запуске несделанных расчетов не найдено, необходимо просто завершить скрипт. Я в скриптах новичок, поэтому не знаю, как подобное можно реализовать.

Всего записей: 350 | Зарегистр. 25-08-2012 | Отправлено: 22:31 28-09-2019
karavan



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

Цитата:
Можно использовать букву "s" и "$var". Остальное нельзя, цифру "1" нельзя.

Попробуйте сформулировать задачу в полном объеме, ограничьте мою фантазию.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 00:39 29-09-2019
king_stiven

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

Цитата:
Попробуйте сформулировать задачу в полном объеме, ограничьте мою фантазию.

 
var=$$var  
 
Двойное разименование переменной нужно.

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 07:04 29-09-2019
king_stiven

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот, Alex_Piggy мне подсказал:
 
echo $(eval echo "\$s$var")
или
ref=s$var
echo ${!ref}

Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 23:44 02-10-2019
MihailM



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

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 01:20 03-10-2019 | Исправлено: MihailM, 12:57 03-10-2019
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
MihailM
Батник? - спрашивать сюда.
 
Если нет, то так:

Цитата:
каким знаком в пути заменить пробелы в батнике
Взять в кавычки точно так, как сделал в сообщении:
Цитата:
"каталог один"  

Код:
$ mkdir "Folder one"
$ cd "Folder one"
$ pwd
/tmp/Folder one


Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 01:32 03-10-2019 | Исправлено: karavan, 01:34 03-10-2019
MihailM



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
karavan, соррь и вправду перепутал темы, как так %)))
p.s.  а я там и ищу своё сообщение ))  

Всего записей: 2498 | Зарегистр. 19-10-2003 | Отправлено: 12:57 03-10-2019 | Исправлено: MihailM, 13:22 03-10-2019
VecH



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
подскажите пожалуйста как качать в curl эти линки с сохранением имени при скачивании
"https://download.mozilla.org/?product=firefox-esr-latest&os=win&lang=ru"
 
 
при скачивании через wget проблем нет:

Код:
wget --no-check-certificate --content-disposition "https://download.mozilla.org/?product=firefox-esr-latest&os=win&lang=ru"

А в curl скачивает html файлик, редирект не перхватывает
 
ps.
Код:
curl -V
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL

Всего записей: 2452 | Зарегистр. 18-02-2003 | Отправлено: 11:09 26-10-2019 | Исправлено: VecH, 12:53 26-10-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
VecH
Должно бы было сработать curl -JOL, но нет, он не работает для данной ссылки.
Потому что ключ -J полагается только на заголовок Content-Disposition. Почему этот ключ помогает wget'у я не могу сказать, исходя из man'а тоже не должен бы.
А ключ -O с какого-то перепуга работает именно для той ссылке что Вы скормили curl'у. И 302 redirect его уже не волнует.
 
Если очень хочется то можно это скриптануть с 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.

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 14:09 26-10-2019 | Исправлено: Alukardd, 14:33 26-10-2019
karavan



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
VecH
Самый простой вариант, который у меня получился для curl, но не для windows:

Код:
curl -so- "https://download.mozilla.org/?product=firefox-esr-latest&os=win&lang=ru" | cut -d'"' -f2 | xargs curl -sO

Как верно заметил Alukardd, отсутствие заголовка Content-Disposition напрягает.

Всего записей: 1962 | Зарегистр. 02-12-2011 | Отправлено: 15:23 26-10-2019
VecH



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Для меня это тоже было неожиданностью, проще завернуть это в WSL

Всего записей: 2452 | Зарегистр. 18-02-2003 | Отправлено: 20:20 26-10-2019
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую всех.
Затупил на следующей задаче. Если не сложно, помогите.
 
Есть один огромный бинарный файл. В нем, помимо прочего мусора напихано куча PDF файлов.
Задача - вытащить эти файлы. Т.е. разделить файл на количество PDF и сохранить их.
 
Там есть стринги типа:
 
Начало PDF:
 

Код:
klejfjkhg|kgpgjue984876t8><F8>llfkgj%PDF-1.4

 
Конец PDF

Код:
 
%%EOF

 
В итоге, я думал, надо выделить все, что стоит между %PDF и следующим %PDF, обрезать все, что стоит перед %PDF (ну или наоборот) и перенаправить каждый PDF в отдельный файл.
 
Заранее спасибо!

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 19:51 07-11-2019 | Исправлено: CrownRU, 19:52 07-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
мб имеет смысл смонтировать файл как loop девайс и прогнать по нему scalpel, выбрав в конфиге pdf?

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 21:18 07-11-2019
Alex_Piggy

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

Код:
awk 'BEGIN{RS="%PDF-";FS="%%EOF";}{print RS $1 FS > "out" NR-1 ".pdf";}' input.dat

UPD: Похоже не годиться... Слишком много памяти требует ~ 5 x input.dat

Всего записей: 1893 | Зарегистр. 07-08-2002 | Отправлено: 21:23 07-11-2019 | Исправлено: Alex_Piggy, 21:29 07-11-2019
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо камрады!
Кажись сам домучал.
Вот так заработало.
 
Делим файл

Код:
csplit FILE /%PDF/ {*}  

 
Стираем в стринге все слева от %PDF
perl надо использовать, потому как окаянный sed не работает с бинарными файлами.

Код:
perl -pi -e 's/^.*%PDF/%PDF/' xx*

 
Прибавляем pdf расширение.

Код:
find . -name "xx*" -exec mv {}{,.pdf} \;

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 21:46 07-11-2019 | Исправлено: CrownRU, 22:05 07-11-2019
Baltazar500



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как в awk split выдать все результирующие сразу, а не по одной ?
Код:
echo 'abc=123&cde=456&fgh=789'|awk '{split($0,a,"&"); a[1]}'
Пробовал a[0], но это похоже не то. Подозреваю, как-то через for внутри awk, но для меня это пока слишком сильное колдунство

Всего записей: 2117 | Зарегистр. 19-09-2011 | Отправлено: 19:23 09-11-2019 | Исправлено: Baltazar500, 19:23 09-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
Цитата:
Подозреваю, как-то через for внутри awk, но для меня это пока слишком сильное колдунство
это же простой вопрос для гугла, не требующий какой-то специфики Вашего вопроса...
Код:
echo 'abc=123&cde=456&fgh=789'| awk '{split($0, a, "&"); for (k in a) print a[k]}'

,но конкретно этот пример, лучше записать по другому
Код:
echo 'abc=123&cde=456&fgh=789'| awk -F'&' '{for (i=1;i<=NF;i++) print $i}'
или даже так
Код:
echo 'abc=123&cde=456&fgh=789'| awk 'BEGIN{RS="&"} 1'

предпочтительный вариант из этих трёх зависит от того что ещё вы собираетесь делать в данной программе.

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

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



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd,
Цитата:
это же простой вопрос для гугла, не требующий какой-то специфики Вашего вопроса...
ну я хз Гугл по запросу
Цитата:
awk split print all outputs
выдавал много примеров, но похожего на мой не было. Либо был, но я ввиду небольшого опыта работы с awk не нашёл необходимого.
Цитата:
предпочтительный вариант из этих трёх зависит от того что ещё вы собираетесь делать в данной программе.
Ну вариантов тут 2 - один grep'ать нужный результат, а второй - пускать в awk второй круг обработки с разделителем "=".
 
А в чём отличия между этими примерами ?
 
p.s. Спасибо. С awk приходится отдельно от баша разбираться, т.к. это язык в языке Зато он в отличии от прочих тулз позволяет намного шире манипулировать текстом

Всего записей: 2117 | Зарегистр. 19-09-2011 | Отправлено: 00:15 10-11-2019 | Исправлено: Baltazar500, 00:23 10-11-2019
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Baltazar500
Цитата:
Ну вариантов тут 2 - один grep'ать нужный результат, а второй - пускать в awk второй круг обработки с разделителем "=".
эм, всё надо делать за один проход awk, если опишите, то смогу помочь
 
p.s. я последнее время всё чаще использую perl, вместо awk.

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

Всего записей: 6564 | Зарегистр. 28-08-2008 | Отправлено: 13:35 10-11-2019
Открыть новую тему     Написать ответ в эту тему

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