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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

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

digital422

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


UNIX Shell

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

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

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

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

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

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

 

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

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

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

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

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

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

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

Всего записей: 6563 | Зарегистр. 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
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru