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

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение отсюда: Ссылка
Alukardd
Не сработало оно почему то)
Всё равно выдаёт строки а не сами выражения.
Мне нужен обход всех папок без вывода сообщений лишних (grep -s), поэтому пробовал так:

Код:
egrep -hse "[a-z]{10}" ~/logs/* | sed -n '/[a-z]\{10\}/p' > /home/log.log  

Способ не дал ожидаемых результатов.
Я не так что-то понял? =)

Всего записей: 47 | Зарегистр. 03-07-2008 | Отправлено: 21:17 22-03-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alverspb
сорь забыл про отрезать лишнее)
sed -ne 's/\(.*\([a-z]\{10\}\).*\)/\2/gp' file > /home/tofile
 
p.s. блин вам удается заставить меня наконец-то сесть за sed))) всегда об этом мечтал))) а вообще то что нашел я и состряпал я, вы тоже могли бы сделать... у меня на это ушло минут 15-20...

----------
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:21 22-03-2011 | Исправлено: Alukardd, 23:23 22-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, alverspb
> sed -ne 's/\(.*\([a-z]\{10\}\).*\)/\2/gp' file > /home/tofile
Это конечно, замечательно (хотя и выведет только первое совпадение в строке), однако специально для решения поставленной задачи у Грепа есть ключ -o (--only-matching).
 
$ egrep -ho '[A-Z]{10}' ~/logs/*
 
alverspb
Обратите внимание, что регэксп забран в строгие кавычки.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
выведет он не первое а последнее... И это только из-за кривости моего выражения ибо ключ g подразумевает вывод всего. Хз как сделать это на 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.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 13:01 23-03-2011
alverspb



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, Alukardd
Спасибо мужики =)
Странно, но ключ -o у grep не везде описан, я ведь искал специально такой. Думал полюбэ должен быть.) Как обычно в man посмотреть не догадался)
За sed тоже спасибо, раньше с этой командой дела не имел вообще!)

Всего записей: 47 | Зарегистр. 03-07-2008 | Отправлено: 18:15 23-03-2011 | Исправлено: alverspb, 18:16 23-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как сделать инкремент в tcsh ?
 
Мне надо чтобы заработало такое:
 
 
#!/usr/bin/env tcsh
 
set start = 0
set stop = 10
 
while ( $start < $stop )
    echo "Проверка"
    $start++   # не работает
    set start = $start + 1 # не работает
end

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 13:21 27-03-2011 | Исправлено: SergeyKulikov, 13:24 27-03-2011
01MDM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
А let там нет? Попробуй:

Код:
 
let "start+=1"
let "start++"
(( start+=1 ))
(( start++ ))
 



----------
Вопросы в личке останутся без ответа

Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 13:44 27-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
01MDM, спасибо большое за Ваш ответ
Сейчас попробую Ваши способы. Но пока получится башевский способ:
set start = `expr $start + 1`
 
Добавлено:

Цитата:
 
let "start+=1"  
let "start++"  
(( start+=1 ))  
(( start++ ))
 

Такое не работает. Это всё из оболочки Korn

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 14:04 27-03-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
не знаю на счет tcsh, но в любом случае после let писать операции надо слитно (без пробелов!!!)!
x=1
let x=$x+1
let x++
и т.д.
в bash всё это работает.

----------
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:15 27-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd, спасибо большое
В баше действительно работает.
 
Я сейчас выбираю оболочку Самая популярная bash
Хотя многие хвалят Zsh, но она в последний раз обновлялась аж в 2009 году, а tcsh в 2007 году
Bash же обновлялся 13 февраля 2011 года
Выходит bash самая популярная и до сих пор разработки над ней идут.
 
Какую Вы можете посоветовать оболочку? Или всё-таки баш?

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 21:36 27-03-2011 | Исправлено: SergeyKulikov, 21:37 27-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> как сделать инкремент в tcsh?
 
> set i=0
> @ i++
> echo $i
1

 
Не?

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
всё возможно, лично я ни когда с этим шелом не работал...
 
SergeyKulikov
для простоты лучше использовать bash или есть такое чудо как fish shell.
а классика и всё-такое это - sh.
 
p.s. хотя я когда пишу скрипты и автоматом ставлю #!/bin/bash, честно хз что там bash специфичное, а что нет...

----------
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:20 27-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
Отсутствие регулярных минорных релизов у популярного продукта обычно говорит о его стабильности. Хотя за Cи-шелл я точно сказать не могу.
 
А вы собственно для чего выбираете оболочку? По-видимому, вы выбираете, что учить. Если так, то однозначно сначала Баш, а потом уже все остальное. Если надо, я разверну мысль.

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:31 27-03-2011
SergeyKulikov



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ASE_DAG, работает и Ваш способ. Спасибо большое
Alukardd, большое спасибо за совет
 
Только вот не знаю, что такое @ перед i++
 

Цитата:
По-видимому, вы выбираете, что учить.

Совершенно верно. Только начал изучать FreeBSD и хожу на курсы по фре в КПИ
 
Добавлено:
А какой язык программирования лучше учить? Учитель на курсах говорит, что Perl очень медленный, а друзья советуют Python.
 
Выучить отдельно какой-то язык программирования думаю надо, так как написание сценариев под оболочки - тут много чего не сделаешь.

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 13:03 28-03-2011 | Исправлено: SergeyKulikov, 13:05 28-03-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
Цитата:
написание сценариев под оболочки - тут много чего не сделаешь
ну это как сказать))) я помнится вместо Си батник написал в универе для лабы по курсу ОС.
Во фре же по дефолту csh - он кстати как следует из названия имеет синтаксис склонённый в сторону Си. В отличие от bash, который построен аналогично Алгол.

Цитата:
друзья советуют Python
я тоже очень хочу его выучить. C, Java, PHP как-то не греют меня. А вообще каждый язык хорош в своём. Perl конечно не быстрый, но ряд задач на нём очень хорошо решается...

----------
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 | Отправлено: 13:54 28-03-2011
SergeyKulikov



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

Код:
 
#!/usr/bin/env tcsh
 
while ( `getopts a:b:cde opt` )
    switch ( $opt )
        case a:
            echo "a равно $OPTARG"
        breaksw
 
        case b:
            echo "b равно $OPTARG"
        breaksw
 
        case c:
            echo "c ключ"
        breaksw
 
        case d:
            echo "d ключ"
        breaksw
 
        case e:
            echo "e ключ"
        breaksw
 
        default:
            echo "Используйте программу: $0 с ключами -c -d -e -a \"значение\" -b \"значение\""
        breaksw
    endsw
end
 

 
 
Помогите понять, как работать с getopts в tcsh
Мой пример не работает.
 
 
 
 
 
 
Добавлено:
Создал программку RR (ReRun), которая будет запускать нужную мне программу нужное количество раз.
Вот код программы:
 

Код:
 
#!/usr/bin/env tcsh
 
set start = 1
set comnd = $1
set stop  = $2
set sleep = $3
 
if ( $stop == "" ) then
    set stop = $start
    set stop2 = "yes"
else
    set stop2 = "no"
endif
 
if ( $sleep == "" ) then
    set sleep = 1
endif
 
while ( $start <= $stop )
    printf "\f\a"
    $comnd
    echo $start
    sleep $sleep
    @ start++
 
    if ( $stop2 == "yes" ) then
        set stop = $start
    endif
end
 

 
Но очень хотелось бы подкрутить сюда и getopts, чтобы задавать параметры так:
# rr -c 10 -p 2 "ls -lhFG /usr"
 
и тогда программа RR запустит 10 раз команду "ls -lhFG /usr" с паузами 2 секунды между повторами.
Пока программа работает без ключиков вот в таком стиле:
# "ls -lhFG /usr" 10 2
 
Заранее всем спасибо за ответ

Всего записей: 24 | Зарегистр. 09-02-2011 | Отправлено: 17:01 28-03-2011 | Исправлено: SergeyKulikov, 17:56 28-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SergeyKulikov
> что такое @ перед i++
Это особая сишелловская магия. :) Как еще на такой вопрос отвечать? Могу ман процитировать:
    @
       @ name = expr
       @ name[index] = expr
       @ name++|--
       @ name[index]++|--

Подробнее...
 
> как работать с getopts в tcsh
getopts — это встроенная команда Баша. Почему вы решили, что она есть в Тенекс-шелле?
 
Однако есть внешняя утилита getopt (см. man 1 getopt и пример использования), и есть возможность распарсить строку средствами самого шелла (скрипт не мой).
 
P.S. Простите за любопытство, вы вручную разукрашиваете посты?
 
Alukardd
> вместо Си батник написал в универе для лабы по курсу ОС
Месье знает толк?
 
Добавлено:
SergeyKulikov
> RR (ReRun), которая будет запускать нужную мне программу нужное количество раз
А что, во Фре watch не работает?
 
Добавлено:
А кстати, да.

Цитата:
Оказалось что watch в Linux и watch в FreeBSD это совершенно разные команды.
<...>
Ну а если хотите такую же функциональность watch в FreeBSD как и в Linux, то portinstall cmdwatch

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:55 29-03-2011 | Исправлено: ASE_DAG, 04:43 29-03-2011
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Месье знает толк?  
знает, знает)))
кстати говоря, выдерать информацию из системы батником или библиотеками сей примерно одинаково - батником даже по приятнее ибо они по сути для этого и предназначены... Правда запариться там пришлось с парсингом вывода, цикл FOR в батниках оставляет желать лучшего...

Цитата:
А что, во Фре watch не работает?
 
А кстати, да.  
оО, да бывают подставы...

----------
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 | Отправлено: 21:51 29-03-2011
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
> цикл FOR в батниках оставляет желать лучшего
Он там, если мне память не изменяет, только недавно появился. В «классических» батниках надо было использовать GOTO. И использовали ведь.
 
snikersmu (20:52 29-03-2011)
Цитата:
Доброго времени суток  
Нужна помощь. К примеру есть  
 
lease 192.168.1.70 {  
starts 2 2011/03/29 15:02:04;  
ends 4 2011/04/28 15:02:04;  
cltt 2 2011/03/29 15:02:04;  
binding state active;  
next binding state free;  
hardware ethernet 00:0c:29:70:78:9e;  
uid "\001\000\014)px\236";  
}  
 
Как сделать вывод IP адреса по мак адресу? (с помощью bash)  
К пример я задаю ему условие, что мак = 00:0c:29:70:78:9e , он мне должен выдать IP который соответствует этому маку.  
Заранее спасибо

 
Чисто на Баше, имхо, никак. А на авке (не без элемента быдлокодерства, зато коротко):
 
$ awk -v 'RS=}' '/00:0c:29:70:78:9e/{print $2}' lease.list
 
Добавлено:
Ага. Предвижу вопрос «как передать мак-адрес авку».
Если указанная строчка вписана в шелл-скрипт, то можно:
awk -v 'RS=}' '/'"$MAC"'/{print $2}'

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 03:02 30-03-2011 | Исправлено: ASE_DAG, 03:09 30-03-2011
snikersmu

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не работает. Выводит 2-ое слово из файла, ничего больше не делает

Всего записей: 5 | Зарегистр. 23-12-2008 | Отправлено: 03:08 30-03-2011
Открыть новую тему     Написать ответ в эту тему

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