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

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

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

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

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

 

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

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



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

Код:
#!/usr/bin/perl
 
$myinput = 'we hav very sl inter';
$myregex = 'we ha(?:v(?:e)?)? ve(?:r(?:y)?)? sl(?:o(?:w)?)? in(?:t(?:e(?:r(?:n(?:e(?:t)?)?)?)?)?)?';
print 'Y' if $myinput =~ $myregex;


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

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

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

Код:
#!/bin/bash
# This only works thanks to a sane structure of host sections
echo '' > users.txt
 
for H in $(awk '/^host/{print $2}' < dhcpd.conf);  
do  
    M=$(grep -A 1 " ${H} " dhcpd.conf \
        | awk '/hardware ethernet /{gsub(";","",$3); print $3}') ; # get the MAC address
 
    A=$(grep -A 2 " ${H} " dhcpd.conf \
        | awk '/fixed-address /{gsub(";","",$2); print $2}') ;     # get the associated IP
    N=$(echo "" | awk -v n=${H} '{print tolower(n);}');
    echo 4,${N},${M},${A}  >> users.txt
done

Заранее благодарен.

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



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
armaturator
Что вообще за изврат... Не проще ли это было чистым awk получить?

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

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



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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
armaturator
> Здесь, на первый взгляд, только элементы синтаксиса на позиксные заменить
Ну, то есть ${var} на $var, $(cmd) на `cmd`, да здесь и все, вроде бы.
 
А вообще, как заметил т. Алукард, это не мешало бы и переписать.


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Кстати, как там ваш QRegExp поживает?
времени не было, завтра доберусь. А можно его прокомментировать? Я сначала думал что ? должен стоять для целых групп (), но у Вас не так. Так же я не понимаю что делает :. В awk у меня оно на вскидку не отработало как надо.
gawk '{print $0 ~ /so(?:m(?:e)?)? stri(?:n(?:g)?)?/ ? "Y" : "N";}' <<< "some string"
На QRegExp не было возможности еще проверить, как уже сказал - завтра.
 
Или ?: кострукция это if??? Правда мне от этого не стало понятнее как прочесть regexp.
 
Добавлено:
ВАЙ! В awk я добился результата, завтра в программе все с QRegExp проверю.
Надо просто удалить все ваши ?: - как я уже сказал хз что они там делают. И оставить просто вложенный конструкции (m)?, где m следующий символ. И обязательно ограничить начало и конец ^$.

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

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 23:22 18-05-2012 | Исправлено: Alukardd, 00:15 19-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> Или ?: кострукция это if?
> ?: - как я уже сказал хз что они там делают

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

 
> В awk у меня оно на вскидку не отработало
А с чего ему работать? АВК не поддерживает PCRE, остановившсь в развитии на ERE. Зачем вы вообще его взяли? Я же на Перле пример привел.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Я же на Перле пример привел.
это я вижу.
Цитата:
АВК не поддерживает PCRE, остановившсь в развитии на ERE
а вот это честно, новость для меня.
 
Проверил - в QRegExp пашет и с ?: и без него. По скольку скорость мне не важна (сравнение с единичной строкой, а не по большому объёму данных) я воспользуюсь лучше удобочитаемостью...
Спасибо.

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

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 15:13 19-05-2012
ASE_DAG



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

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

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



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

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

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



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

Код:
#!/usr/bin/perl
$mystr = 'we have very slow internet';
@words = split (' ', $mystr);
for my $j (0 .. $#words) {
    @chars = split ('', $words[$j]);
    for my $i (0 .. 1) {
        print $chars[$i];
    }
    for my $i (2 .. $#chars) {
        print '(?:' . $chars[$i];
    }
    print ')?' x ($#chars-1);
    print ' ';
}


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

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



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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть некий файл fstab. В нём разделы прописаны по UUID. Начальная версия этого файла неизменна. Все дальнейшие действия производятся над его копией.
С помощью скрипта создается три раздела. Естественно надо, чтобы их UUID фигурировали в копии файла fstab.
Данную задачу я реализовал двумя способами:
1. С помощью tune2fs менял UUID разделов с фс ext4, вытаскивая их из исходного файла fstab. А UUID свопа задавал при создании. Однако кривизна решения в том, что нет уникальности id разделов, что не принципиально, но и не все версии mkswap поддерживают параметр -U.
2. Выдёргиваем из fstab UUID и полностью переписываем fstab с нуля. В этом случае получается какой-то громоздкий код, а хочется ещё и красивости решения.
Конечно можно воспользоваться sed`ом, но тогда кода всё равно будет не меньше. Да и три раза придётся перечитывать файл. Как быть?


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

Всего записей: 6714 | Зарегистр. 29-04-2009 | Отправлено: 17:15 20-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Извините, я не понял проблемы. Чего вы вообще хотите сделать?

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Упрощаем.
В файле fstab есть три "левых" UUID. Их надо заменить на три текущих. Как сделать это практичнее?

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

Всего записей: 6714 | Зарегистр. 29-04-2009 | Отправлено: 18:26 20-05-2012
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
> Как сделать это практичнее?
Практичнее использовать метки, а не UUID’ы.

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Практичнее использовать метки, а не UUID’ы.
uuid обычно всегда есть, в отличии от метки...
 
urodliv
изначально суть задачи и наши действия тоже не понял...
Цитата:
Упрощаем.
В файле fstab есть три "левых" UUID. Их надо заменить на три текущих. Как сделать это практичнее?
упрощение, кажется, чрезмерно... Откуда взять соответствие левых и текущих, что бы менять?

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

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 01:06 21-05-2012
urodliv



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

Цитата:
Откуда взять соответствие левых и текущих, что бы менять?

Допустим в исходном файле есть есть три интересующие записи:
UUID=сссссссс-сссс-сссс-сссс-сссссссссссс         /               ext4    errors=remount-ro 0       1
UUID=hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhh   /home           ext4    defaults        0       2
UUID=ssssss-ssss-ssss-ssss-ssssssssssss     none            swap    sw              0       0
 
И допустим, что после создания разделов команда blkid -s UUID выдаёт:
/dev/[hs]da1: UUID="86d14270-3dc2-45c4-a7b3-6ed19f97ec6d"  
/dev/[hs]da2: UUID="04c07c50-f807-4b2e-b3c8-3cade70ba247"  
/dev/[hs]da3: UUID="0e8fe39f-1b56-4d1d-b013-81c5bc3d6008"
 
Заранее известно, что /dev/[hs]da1 всегда своп-раздел, /dev/[hs]da2 - корневой раздел, а /dev/[hs]da3 - "домашний" раздел. Вот и надо поменять UUID`ы из fstab`а значениями из blkid.

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

Всего записей: 6714 | Зарегистр. 29-04-2009 | Отправлено: 01:44 21-05-2012
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
urodliv
Ну тогда я вижу это так:
  • Новые uuid - /tmp/new_uuid_file
    Код:
    /dev/sda1: UUID="AAA"
    /dev/sdb1: UUID="BBB"

  • То, что заранее известно оформлено в файле /tmp/correlations:
    Код:
    /dev/sda1: /home
    /dev/sdb1: swap

  • Скрипт выглядит так:
    Код:
    #!/usr/bin/awk -f
    function ltrim(s) { sub(/^[ \t]+/, "", s); return s }
    function rtrim(s) { sub(/[ \t]+$/, "", s); return s }
    function trim(s)  { return rtrim(ltrim(s)); }
    BEGIN {
        file = "/tmp/new_uuid_file";
        cor="/tmp/correlation"
        FS=":";
        # reading correlation of mount points and partions
        while (getline < cor) {
            c[trim($1)] = trim($2);
        }
        while (getline < file) {
            uuid[trim($1) in c ? c[trim($1)] :""] = trim($2);
        }
        FS="[[:blank:]]+";
    }
    /^[^#]/{
        if ($2 in uuid)
            gsub(/.*/,uuid[$2],$1);
        if ($3 in uuid)
            gsub(/.*/,uuid[$3],$1);
        print;
    }
    /^#/{print;}
    Запускать так: /tmp/script.awk /etc/fstab
    Весь результат вывалится на stdout.
     
     
     
    Добавлено:
    Скажем так - код получился весьма не маленький, зато по каждому файлу пробежались ровно один раз. :-D

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

  • Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 20:12 21-05-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 154

    Компьютерный форум 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