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

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

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

 

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

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

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый вечер, ASE_DAG
Прошу прощения. Убрал "-r", не заменив "+" на "\+". Да, теперь ожидаемо работает 7 секунд.
sed -e "s/[A-Z]\+/\L\u\0\E/g"
sed -r -e "s/[A-Z]+/\L\u\0\E/g"  
Подробнее...

Цитата:
Вопрос т-ща Krist’а был про средства Баша.

К сожалению, я этого не понял. Думал что речь идет про стандартные средства системы. (Неправильно расшифровал "как перевести все в lowercase средствами bash через awk понятно")

Всего записей: 1898 | Зарегистр. 07-08-2002 | Отправлено: 18:33 02-05-2013 | Исправлено: Alex_Piggy, 18:37 02-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
> Неправильно расшифровал "как перевести все в lowercase средствами bash через awk понятно"
Да не обязательно, может быть и я неправильно понял, что там пытался спросить т. Крист; пусть он лучше сам повнятнее скажет, что имел в виду.
 
> $ sed -r -e 's/[A-Z]+/\L\u\0\E/g' file
А вообще, меня всегда восхищают решения на Седе и те, кто умеет их писать, а еще более те, кто умеет их читать. :-)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:15 02-05-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вообще это будет часть скрипта bash, извиняюсь, что некорректно поставил вопрос, в принципе оба варианта просто отличные и как говорится главное что работают. Кроме того  соглашусь, не то что писать, а читать sed для меня сложно, надо лезть в мануалы.
 
Большое спасибо!

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 21:28 02-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
> в принципе оба варианта просто отличные
Так чем вас АВК-то тогда не устроил?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:33 02-05-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да устроил только не мог до конца адаптировать однострочник на awk для "капитализации", сейчас в приниципе уже и его доделал )

Код:
 
Admin@microsof-582458 /home
$ cat input
Lorem ipsum dolor sit AMET, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim VENIAM, quis nostrud exercitation ULLAMCO  laboris nisi ut aliquip ex ea commodo consequat.
 
Admin@microsof-582458 /home
$ awk '{for(i=1;i<=NF;i++) {if (match($i, /[A-Z]+/)) {$i=toupper(substr($i,1,1)) tolower(substr($i,2))}} print $0}' input
Lorem ipsum dolor sit Amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim Veniam, quis nostrud exercitation Ullamco laboris nisi ut aliquip ex ea commodo consequat.
 

 
awk все таки попроще sed(a)

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 11:37 03-05-2013 | Исправлено: Krist, 11:41 03-05-2013
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
# print -l test TEST teST TEst | awk '{for(i=1;i<=NF;i++) {if (match($i, /[A-Z]+/)) {$i=toupper(substr($i,1,1)) tolower(substr($i,2))}} print $0}'
test
Test
Test
Test
#

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 13:23 03-05-2013
galleon2005



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите пожалуйста, не могу разобраться.
Нужно преобразовать строку с текстом в число.
Например,  из первоначального выражения - "145.4 TB" мне нужно получить просто "145.4"

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 14:53 05-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
galleon2005
> Нужно преобразовать строку с текстом в число.  
Если речь о типизации переменных, то в Баше нет числовых типов.
 
> из первоначального выражения - "145.4 TB" мне нужно получить просто "145.4"
Если речь просто о разборе строки, то не понимаю проблемы.
$ read VALUE UNIT <<< "145.4 TB"
$ echo $VALUE
145.4



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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:57 05-05-2013
galleon2005



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Извиняюсь, мне это нужно для обработки snmp ответа от устройства в Zabbix.
Zabbix запущен на сервере с freebsd.
 
Например, для значения "1.46 TB" я выполняю команду:
snmpwalk -c public -v2c 192.168.67.10 .1.3.6.1.4.1.24681.1.2.17.1.5.1 | sed 's/[^0-9]*//g'
 
но в результате, я не могу получить значение "1.46"

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 15:18 05-05-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
galleon2005
У меня нет под рукой Zabbix’а, чтоб видеть, что он возвращает.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:23 05-05-2013 | Исправлено: ASE_DAG, 15:27 05-05-2013
galleon2005



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Здесь дело даже не в Zabbix, до него не доходит.
Сначала, с помощью команды snmpwalk, я получаю значение какого-либо параметра  (напр. "1.46 TB" ).
Потом нужно обработать это значение  с помощью sed, для получения только цифр ( 1.46 )  
И только потом скормить это значение Zabbix.

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 15:33 05-05-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый день, galleon2005
sed -e "s/^\([0-9.,]*\).*/\1/"
Или ?
sed -e "s/^\([0-9.,]*\)[^0-9.,].*/\1/"

Всего записей: 1898 | Зарегистр. 07-08-2002 | Отправлено: 15:52 05-05-2013 | Исправлено: Alex_Piggy, 16:00 05-05-2013
galleon2005



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

Всего записей: 219 | Зарегистр. 08-03-2006 | Отправлено: 16:29 05-05-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здавствуйте, может кто подскажет: как заменить в тексте на одно слово множество различных слов из файла с образцами не различая строчные и заглавные
Например в тексте:
июль август сентябрь
декабрь Март апрель июль
июнь сентябрь ноябрь февраль
Апрель ноябрь март
Заменить слова  "(м|М)арт, (а|А)прель" на "месяц".
Я понимаю можно воспользоваться однострочником
 sed -e 's/март\|апрель/месяц/g'
или даже
 awk '{gsub(/март|апрель/,"месяц")}'
Но слов очень много больше тысячи, хотелось бы брать из построчного файла. Ничего не могу придумать лучше чем генерировать скриптом еще один скрипт, который разделит файл с заменямыми словами на части и по очереди обработать текст запихнув в некоторое количество однострочников
Может кто подскажет?

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 19:09 30-05-2013 | Исправлено: Krist, 19:25 30-05-2013
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Krist
Я бы сделал так:
1. Создал файл dict.txt вида
Апрель месяц
Март месяц
Январь месяц
итд
думаю это сможете, а потом
2. sed '/./!d;s/\([^ ]*\) *\(.*\)/\\|\1|s||\2|g/' dict.txt | sed -f - файлвкоторомнадоменять.txt

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 19:52 30-05-2013
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Добрый вечер, Krist
Или практически идентичный вариант - если менять все на одно слово (TEXTTOREPLACE). word.lst - список слов для замены, разделенных пробелами или табуляцией. text.txt - текст, который надо исправить.
sed -n -e "s/[^ \t]\+/\ns@\0@TEXTTOREPLACE@gi/gip" word.lst | sed -f - text.txt > result.txt
"i" - наверное таки надо.

Всего записей: 1898 | Зарегистр. 07-08-2002 | Отправлено: 21:22 30-05-2013
Krist



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо, первый вариант быстрее, но 2 операции, а второй тратит больше времени, но в 1 строкy

Код:
 
time sed '/./!d;s/\([^ ]*\) *\(.*\)/\\|\1|s||\2|g/' tils | sed -f - titleready > last
 
real    0m0.571s
user    0m0.539s
sys    0m0.005s
 
time sed -n -e "s/[^ \t]\+/\ns@\0@pillka@gi/gip" kils | sed -f - titleready > last2
 
real    0m1.826s
user    0m1.799s
sys    0m0.000s
 

 
Спасибо!!

Всего записей: 247 | Зарегистр. 07-03-2006 | Отправлено: 23:31 30-05-2013 | Исправлено: Krist, 00:20 31-05-2013
impe

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, помогите разобраться в своем же коде на BASH.
Разработать сценарий для переименования файлов из определенного каталога, имена которых удовлетворяют шаблону имя.окончание. После переименования файлы должны иметь имена вида ххх.окончание Здесь ххх - обозначает порядковый номер файла при переименовании. Дополнительно в текущем каталоге (из которого был запушен сценарий) должен быть создан файл с содержанием каталога переименованных фалов. Каждая строка файл - содержания  включает в себя порядковый номер и старое название файла и имеет следующий вид: ххх - имя. У пользователя запрашивается окончание, имя каталога с файлами для переименования, имя файла с содержанием (если оно пустое, то сдать содержание в файле имя каталога.content).


Код:
 
#!/bin/bash
DIR="$1"         
NAMELIST="$2"         
FORMAT="$3"
x=1
find $DIR -name "*.*" -exec basename {} \; | sed = >> $NAMELIST
 
for file in $DIR/*.$FORMAT
do
    mv $file $x.$FORMAT
    let x++
done
 

Всего записей: 2 | Зарегистр. 16-03-2012 | Отправлено: 13:45 04-06-2013
Sphinx114



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
impe, сделал чисто по заданию, вроде правильно работает:

Код:
#!/bin/bash
read -p 'Enter extension: ' ext
read -p 'Enter files directory: ' dir
read -p 'Enter name of contentfile: ' list
 
if [ -z "$list" ]; then list=`basename "$dir"`.content; fi
 
(
cd "$dir"
for file in *.$ext
do
 let x++
 echo $x - `basename "$file" .$ext`
 mv "$file" "$x.$ext"
done
)>"$list"


Цитата:
basename: неверный ключ — «s»
У фряшного basename ключи есть, на линухе нет. Значит надо что-то другое придумать.
Исправил: basename -s .$ext "$file" на basename "$file" .$ext

Цитата:
mv: не удалось выполнить stat для «*.txt»: Нет такого файла или каталога
хз, на фряхе работает.
На дебиане тоже работает:
 
root@localhost:~# /tmp/script.sh
Enter extension: txt
Enter files directory: /home/fred
Enter name of contentfile:
root@localhost:~# cat /tmp/fred.content
1 - asdf
2 - asdf asd
3 - qqq
root@localhost:~#

 
Изменил: >"`dirname "$0"`/$list" на >"$list" (неправильно прочитал задание)

Всего записей: 1201 | Зарегистр. 26-03-2011 | Отправлено: 16:29 04-06-2013 | Исправлено: Sphinx114, 07:58 05-06-2013
dimmer123

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Подскажите, как реализовать: в файле хранится время (часы:минуты), нужно к часам добавить 3 часа. Чтобы из 13:42 получилось 16:42.

Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 19:24 20-06-2013
Открыть новую тему     Написать ответ в эту тему

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