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

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

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

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

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

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

Всего записей: 360 | Зарегистр. 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}. Надо другое решение.

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

Всего записей: 360 | Зарегистр. 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. Без этой конструкции появляется ненужный текст.

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

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

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

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

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

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