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

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dimmer123
$ T='13:42'
$ date -d "3 hours $T" '+%H:%M'
16:42


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

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

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

Всего записей: 98 | Зарегистр. 17-09-2007 | Отправлено: 00:10 21-06-2013
yrkrus



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго всем дня!
Подскажите как можно передать переменную ${date} в скрипт, а дальше в лог
типа такого:
 
#!/bin/sh
dat="date"
echo "сегодня $dat" >> /var/log/log.log
 
 

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 22:10 25-06-2013 | Исправлено: yrkrus, 22:14 25-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yrkrus
Извините, но я не понял, чего вы хотите. То, что привели как «типа такое», вполне работоспособно (хотя и бессмысленно).

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:14 25-06-2013 | Исправлено: ASE_DAG, 22:18 25-06-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yrkrus
Если я правильно понял то простейший вариант будет выглядеть так:
#!/bin/bash
dat="$1"
echo "сегодня $dat" >> /tmp/testscript.log

 
И вызывать его, например, так: /tmp/testscript $(date '+%D')

----------
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 | Отправлено: 10:22 26-06-2013
AltTab



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго всем дня!
 
Прошу совета у сообшества.
Ubnutu server 12.04.
Есть скрипт, которым архивирую данные на виндовой машине. Перенес с учетом логики скрипта, как мог, в меру своих скудных знаний, на sh. И получаю картину: если запускать скрипт построчно, копируя строки из редактора в консоль, все выходит отлично. Но как только пробую готовый скрипт запустить - не выходит каменный цветок.
 
Если напрямую запускать

Код:
 
# /opt/share/public/_/arc_base.sh
-su: /opt/share/public/_/arc_base.sh: /bin/bash^M: плохой интерпретатор: Нет такого файла или каталога
 

 
Если через sh 'скрипт' - море ошибок и нет толку. Скрыто:
Подробнее...
 
Причем в точке назначения создаются две папки с текущей датой и точкой и двумя точками. То есть, к примеру, сегодня:
2013-06-26.
2013-06-26..
 
и скрипт не выполняет практически никакой работы, только создает пустые архивы.
 
Сам скрипт:
 
Подробнее...
 
Пожалуйста, тыкните носом, что там не так? Спасибо!

----------
Все, я пошел...
Шалабудабуда...

Всего записей: 247 | Зарегистр. 07-06-2004 | Отправлено: 15:24 26-06-2013 | Исправлено: AltTab, 15:25 26-06-2013
Sphinx114



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Надо сохранить скрипт в Unix-кодировке, вы видимо в винде писали. Они переносом строк различаются.
Гугл подсказывает:
# apt-get install dos2unix
# dos2unix /opt/share/public/_/arc_base.sh
 
Можно так: gedit ->сохранить как -> конец строки Unix

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AltTab
> /bin/bash^M: плохой интерпретатор
Дык у вас мусор в конце каждой строки. Символ \r (он же ^M, он же carriage return (CR) — возврат каретки).  
 
Последовательность \r\n — это MSDOS’овский способ перевода строки. Вам же надо использовать просто \n.
 
В Виме можно поменять формат строк так:
:set fileformat=unix

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 15:59 26-06-2013
mithridat1



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

Цитата:
В Виме можно поменять формат строк так:
:set fileformat=unix

Или в командной строке,с помощью tr -d "\r"

Всего записей: 5025 | Зарегистр. 05-01-2006 | Отправлено: 16:02 26-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
#!/bin/bash
dat="$1"
echo "сегодня $dat" >> /tmp/testscript.log

 
И вызывать его, например, так: /tmp/testscript $(date '+%D')
 
Ну и в чем тут смысл? Чему не просто
 
#!/bin/bash
echo "сегодня $(date '+%F')" >> /tmp/testscript.log

 
или даже
 
#!/bin/bash
date '+сегодня %F' >> /tmp/testscript.log

 
 
Добавлено:
mithridat1
> tr -d "\r"
Не вполне корректно на самом деле. Ни dos, ни unix формат текстовых файлов не запрещает использовать \r равно как и любой другой доступный символ, т. е. он может встречаться не только в конце строки.
 
А вообще, очевидно, есть тысяча и один способ это сделать, в т. ч. не имея под рукой особых средств, например:
$ awk -v RS='\r\n' -v ORS='\n' '1' arc_base.sh  > arc_base.unix.sh
$ sed -i 's/\r$//' arc_base.sh
но ни к чему их все здесь приводить, поскольку т-щу AltTab’у будет куда полезнее узнать, где задается формат в его любимом текстовом редакторе, и им и воспользоваться.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 16:02 26-06-2013 | Исправлено: ASE_DAG, 16:25 26-06-2013
Alukardd



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

----------
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 | Отправлено: 17:10 26-06-2013
yrkrus



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

Всего записей: 379 | Зарегистр. 30-11-2010 | Отправлено: 22:05 26-06-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yrkrus
Замечательно. Только есть мнение, что пояснять надо не «немного», а как можно подробнее. По крайней мере мне так и не понятно, чавой вы таки от нас хотите.
 
Как вывести в произвольном контексте текущую дату, я написал выше. Если есть вопросы — задавайте.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 01:46 27-06-2013 | Исправлено: ASE_DAG, 01:47 27-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 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