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

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

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

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

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

 

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

Всего записей: 288 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: ASE_DAG, 22:02 01-03-2017
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.

Всего записей: 6252 | Зарегистр. 28-08-2008 | Отправлено: 13:36 16-03-2019
U235

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

Код:
ping -c 1 host-`printf '%03d' $count`

Всего записей: 635 | Зарегистр. 14-12-2005 | Отправлено: 13:47 16-03-2019 | Исправлено: U235, 13:55 16-03-2019
newhk

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


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


----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3391 | Зарегистр. 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 отправили недописанное сообщение.

Всего записей: 1693 | Зарегистр. 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 такая старая версия. Стало быть, так обстоят дела у многих, не только у меня

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3391 | Зарегистр. 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. То решение, которое Вы использовали -  съест двойные пробелы в именах.

Всего записей: 1693 | Зарегистр. 07-08-2002 | Отправлено: 14:15 17-03-2019 | Исправлено: Alex_Piggy, 14:16 17-03-2019
los

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TeXpert,
если не стоит задача использовать только стандартный программы, то для данной задачи удобно использовать fd
https://github.com/sharkdp/fd
 
   

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

Всего записей: 6252 | Зарегистр. 28-08-2008 | Отправлено: 23:02 17-03-2019
newhk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, привет!
Нужна помощь в скрипте, который загружает правила в 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
Есть идеи?

Всего записей: 227 | Зарегистр. 02-02-2009 | Отправлено: 19:48 01-04-2019 | Исправлено: newhk, 22:24 01-04-2019
newhk

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

Код:
 
snap install canonical-livepatch
canonical-livepatch enable [TOKEN]
 

 
Вместо "TOKEN" вставил свой сгенерированный ID
 
Версия ядра - 4.15.0-47
Если что.

Всего записей: 227 | Зарегистр. 02-02-2009 | Отправлено: 08:30 04-04-2019
karavan



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

Цитата:
Есть идеи?

В кроне правило на запуск скрипта:
0 10,15 * * 1,2,3,4,5 /path/to/script
В скрипте делаем проверку на время в какое произошло исполнение, на основании чего принимаем решение об удалении правила, либо о его применении.
Далее проверка текущих правил на необходимость делать действие.
Если правило надо было добавить, но оно уже есть, то ничего не делаем.
Если правило надо было удалить, а удалять нечего, то также ничего не делаем.
Во всех остальных случаях делаем действие.

Всего записей: 1725 | Зарегистр. 02-12-2011 | Отправлено: 10:39 04-04-2019
newhk

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

 
Добавлено:
Хотелось бы все-таки допилить, чтобы было православно и без костылей.

Всего записей: 227 | Зарегистр. 02-02-2009 | Отправлено: 12:12 04-04-2019
newhk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Неужели никто не сталкивался с ситуацией, когда IPTables использует время по Гринвичу и ему все равно на параметр --kerneltz ?

Всего записей: 227 | Зарегистр. 02-02-2009 | Отправлено: 14:49 04-04-2019
newhk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отвечу сам...
 
Вдруг кому пригодится.
Решение https://www.linuxquestions.org/questions/slackware-14/iptables-m-time-option-doesn%27t-update-when-the-clock-changes-937031/
Если правило работает по гринвичу, то надо настроить системные часы выполнив команду

Код:
 
hwclock --localtime --systz
 

 
После чего правило будет работать корректно и не придется отнимать (3 часа от нужного времени, как у меня было)

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

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

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

Всего записей: 2523 | Зарегистр. 03-02-2009 | Отправлено: 19:06 26-04-2019
Открыть новую тему     Написать ответ в эту тему

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

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

Имя:
Пароль:
Сообщение

Для вставки имени, кликните на нем.

Опции сообщенияДобавить свою подпись
Подписаться на получение ответов по e-mail
Добавить тему в личные закладки
Разрешить смайлики?
Запретить коды


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

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2018

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru