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

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

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

 

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

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

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

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

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

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

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

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

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

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

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