BASH Scripting

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

Код: Выделить всё

[guest@station ~]$ echo -e "one\ntwo" | sed 's/one$/ /'

two
[guest@station ~]$

не, видишь там пробел и перевод строки, а надо чтобы только " two" осталось
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: BASH Scripting

Сообщение pcodr »

Folderx

Код: Выделить всё

echo -e "one\ntwo" | sed ':a;N;$!ba;s/one\n//g'


Нашел тут
remote system type is unix
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: BASH Scripting

Сообщение Folderx »

нормально, попробовал вставить в скрипт - не, там нужно думать, не так всё просто :)
ругается на s// типа не завершена, когда сформированные адресы подставляю в s/ / /
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

Код: Выделить всё

/key [7\.]/ {#семёрка или точка, ничего не выводим, а только сохраняем в буфере
    s/key ([7\.])/\1/
    H
    b
}
x
/^$/ {#буфер пуст, вывод строки
    x
    p
    b
    }
#буфер не пуст, там 7 и .
/(7\n\.\n){3}7$/ {
    r ip.txt
    s/.*//
    x
    p
    b
}
s/([7\.])/key \1/g
p
s/.*//
x
p


Folderx писал(а):
23.04.2009 07:36
ругается на s// типа не завершена, когда сформированные адресы подставляю в s/ / /

не умеет sed жрать по несколько строк. принципиально не умеет :)
но там есть буфер для этого.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

gcc писал(а):
22.04.2009 10:45
ключевая фукнция sub Replace

Folderx писал(а):
22.04.2009 11:06
а сделал через занос текста в переменную

дык выше уже есть код с массивом на bash, чем он вам не понравился?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
kma21
Сообщения: 874
Статус: Странный экспериментатор...

Re: BASH Scripting

Сообщение kma21 »

Народ, подскажите, скриптик, который считывает теги с MP3 и FLAC (теги ID3v2.4 (UTF-8)) и составлять такую табличку, которая записывается в текстовый файл с названием "Artist - Album"

(Таблица) писал(а):Artist - Album

Track1
Track2
...
TrackN
Спасибо сказали:
Gair
Сообщения: 3
ОС: Debian

Re: BASH Scripting

Сообщение Gair »

Ребят, подскажите, как реализовать аналог "cal"? Ничего в голову не приходит (
Спасибо сказали:
Аватара пользователя
kma21
Сообщения: 874
Статус: Странный экспериментатор...

Re: BASH Scripting

Сообщение kma21 »

"cal" это вроде календарь?? И в чЁм проблема??
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

kma21 писал(а):
06.05.2009 14:01
Народ, подскажите, скриптик, который считывает теги с MP3 и FLAC (теги ID3v2.4 (UTF-8)) и составлять такую табличку, которая записывается в текстовый файл с названием "Artist - Album"

дык... самому? берёте и выкусываете sed'ом ваши теги...
Gair писал(а):
06.05.2009 19:11
Ребят, подскажите, как реализовать аналог "cal"? Ничего в голову не приходит (
man date
man sed
читаем дату, и редактируем её... sed - это редактор... писать код лень ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Gair
Сообщения: 3
ОС: Debian

Re: BASH Scripting

Сообщение Gair »

2kma21:, проблема в том, что надо сделать свой cal *с блэкджеком и шлюхами*, скриптом на баше...

2drBatty:,То-то и оно, что man sed :( date - это то понятно. Но со скриптовыми языками напряг, вот и спросил, может кто поможет...
Спасибо сказали:
Аватара пользователя
kma21
Сообщения: 874
Статус: Странный экспериментатор...

Re: BASH Scripting

Сообщение kma21 »

drBatty, хотелось бы готового и грамотного решения и чтобы автоматизировать (всмысле только путь до папки менять).
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

Gair писал(а):
06.05.2009 20:51
Но со скриптовыми языками напряг, вот и спросил, может кто поможет...
странно... разве не ясно? надо код писать. Я же написал какие команды, что не понятного? Могу конечно код написать, но зачем мне его писать? Какой в этом смысл? Вас это ничему не научит, мне это ничего полезного для меня не даст, код в данном случае будет примитивным, и там вроде ничего интересного не вставить. в общем-то одна команда - s/что менять/на что менять/ даже и обсуждать тут нечего, примеры есть в info sed и info bash - изучайте. Если надо, могу выслать эти файлы(хотя они вроде в любой ОС должны быть). Не очень понятна сама постановка вопроса - зачем делать замену cal? Кстати, ИМХО грамотное решение: юзать вместо cal саму cal. К тому-же, про эту cal я от вас узнал, а не узнал-бы, жил бы так-же счастливо, лично мне она совсем не нужна, дату я и и так узнаю.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Gair
Сообщения: 3
ОС: Debian

Re: BASH Scripting

Сообщение Gair »

Начну с конца:
вместо cal юзать cal - здравая мысль, но в том суть задачи - реализовать скриптом на баше.
файлы - буду очень благодарен, если зальёте на что-нибудь типа ifolder.ru
смысл в том, что я а) разберусь как оно работает и б) сдам задание
зачем вам это писать - самый сложный вопрос, на него у меня нет вразумительного ответа. Разве что по доброте душевной или от нечего делать :)
непонятного - да собственно "как это реализовать" и только.
Ну и за команды - спасибо, буду копать сам...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

kma21 писал(а):
06.05.2009 23:19
хотелось бы готового и грамотного решения и чтобы автоматизировать (всмысле только путь до папки менять).
вы знаете, мне тоже захотелось :(
http://www.id3.org/id3v2.4.0-structure
формат-то довольно запутанный, это разбираться надо... Если сделаете, поделитесь? Хотя может проще найти какой-нибудь готовый конвертер?
нашёл!

drb /home/ftp/pub/music/mp3/televizor/1985_shevstvie_ryd$ mp3info 01.mp3 |iconv -f cp1251 -t utf-8

File: 01.mp3 Title: Люди в ожидании Track: 1 Artist: Телевизор Album: Шествие рыб Year: 1985 Comment: Genre: Rock [17]

ну а дальше уже совсем просто...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

Gair писал(а):
07.05.2009 01:57
файлы - буду очень благодарен, если зальёте
у вас их нет?
для вашего случая можно использовать формат даты, например вот та можно получить число(день месяца)

Shell

$ date "+%d 07

тогда не нужно никакой sed ничего выкусывать
т.е в скрипте будет так

Код: Выделить всё

m=`date "+%m"`
d=`date "+%d"`
(подробнее о формате см date --help)
ну а получив в переменных все данные я думаю не сложно будет и нарисовать командой echo

там ещё хитрость - екущую дату надо выводить с инверсией(чёрным по белому, а не белым по чёрному), это делается так:

Код: Выделить всё

echo -e "норма\033[7mинверсия\033[0m"

подробнее см http://www.opennet.ru/docs/BSD/pascal/syscons/ansi.html
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
kma21
Сообщения: 874
Статус: Странный экспериментатор...

Re: BASH Scripting

Сообщение kma21 »

drBatty, спасибо, это почти то, что нужно. Получается про каждый файл отдельный блок информации, но "ломать не сторить" и можно удалить лишнее. =)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: BASH Scripting

Сообщение sash-kan »

эк вы всё усложняете:
pcodr писал(а):
23.04.2009 05:14
Folderx

Код: Выделить всё

echo -e "one\ntwo" | sed ':a;N;$!ba;s/one\n//g'


Нашел тут
ведь ссылка совершенно про другое.

Folderx писал(а):
22.04.2009 22:38

Код: Выделить всё

[guest@station ~]$ echo -e "one\ntwo" | sed 's/one$/ /'

two
[guest@station ~]$

не, видишь там пробел и перевод строки, а надо чтобы только " two" осталось

Shell

$ echo -e "one\ntwo" | sed '/one/d' two $
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: BASH Scripting

Сообщение butch »

есть код. написанный только что. думал над одним вопросом с проверкой двух условий, по которым производится одно и тоже действие (участок кода с [ "$senddate" = "$TODAY" ] и [ -z "$senddate" ]).
код проверяет в текстовом файле наличие тэга Date (строка вида Date: 2009-05-15)
если его нет, или дата сегодняшняя - сразу кладем в папку назначения. вчерашней даты быть не может точна =)
если не сегодняшняя - в папку с именем даты.
в файликах - смски на отправку.
кто что может сказать по коду? я не так много писал еще скриптов, и советы выслушаю с удовольствием.

Код: Выделить всё

#!/bin/bash

#cheking date in sms and put them in date folders
#if no date in file - put them in today sending

IN="/var/spool/sms/in"
OUT="/var/spool/sms/bydate"
NODATE="/var/spool/sms/outgoing/"
TODAY=$(date +%F)
INFILES=$(ls $IN)

echo ==========================
date
echo in IN files: $INFILES
if [ "$INFILES" ]
then
 echo goin to parse files in IN
 cd $IN
 for i in $INFILES; do
  senddate=$(grep Date $i | awk '{ print $2 }')
  echo for $i send date is $senddate

  if [ [ "$senddate" = "$TODAY" ] -o [ -z "$senddate" ] ]
   then
    mv $i $NODATE
    echo date is today, or no date tag. moved to outgoing
  fi

#  if [ '$senddate' = '$TODAY' ]
#   then
#    mv $i $NODATE
#    echo send date is today!
#    continue
#  fi
#  if [ -z '$senddate' ]
#   then
#    mv $i $NODATE
#    echo no send date. wtf?
#    continue
#  fi

  mkdir -p $OUT/$senddate
  mv $i $OUT/$senddate
 done
else
 echo no files. nothing to do
fi
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: BASH Scripting

Сообщение butch »

как всегда пришлось разбираться самому.
есть великолепный материал о частых ошибках при скриптинге на баше.
нет такой ошибки, которую я бы не совершил =)))
советую к прочтению всем. если из манов более или менее становится понятно, как строить конструкции, то оттуда становится ясно, как их не нужно строить.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: BASH Scripting

Сообщение sash-kan »

butch писал(а):
18.05.2009 12:54
есть великолепный материал
как (слава богу) в нём указано, это вольный перевод http://wooledge.org:8000/BashPitfalls . не знаю, не совершил ли переводчик ошибок, но вот то, что перевод не полон — это точно.
да и вообще Greg's Wiki стоит почитать тем, кто «doing Unix shell scripting or system administration».
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: BASH Scripting

Сообщение butch »

sash-kan писал(а):
18.05.2009 20:08
как (слава богу) в нём указано, это вольный перевод http://wooledge.org:8000/BashPitfalls

да. слава богу указано =) оригинал в общем то мне и помог в большей степени разобраться со многими конструкциями =))
Спасибо сказали:
REXROM
Сообщения: 5

Re: BASH Scripting

Сообщение REXROM »

Здравствуйте!
На нескальких машинах нужно изменить файл fstab
конкретнее строчки /dev/cdrom....../mnt/cdrom....
/dev/floppy......./mnt/floppy....
и в конец добавить строчку /dev/flash...../mnt/flash....

Споткнулся на том что две строки на разных машинах находятся в разных строчках...(пытался использовать sed)
Идея в том что бы найти две указанные строчки и закоментировать их и потом добавить в конец файла три новых строки.
Смущает большое количество пробелов в искомых строках.
Как правильно должен выглядеть данный универсальный скрипт?
Заранее спасибо.
Спасибо сказали:
Аватара пользователя
butch
Сообщения: 331
ОС: :OC

Re: BASH Scripting

Сообщение butch »

REXROM писал(а):
17.06.2009 09:42
Смущает большое количество пробелов в искомых строках.

[:space:]?
REXROM писал(а):
17.06.2009 09:42
поткнулся на том что две строки на разных машинах находятся в разных строчках...(пытался использовать sed)

может быть проще
grep -v -E (одно_выржение|другое_выражение|третье) /etc/fstab > /tmp/newfstab && добавляем строки и заменяем fstab, сделав его копию, еще можно куда нить кинуть оригинал и получившийся новый файл (на мыло, к примеру)

ключ v забыл, для инвертирования =)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

REXROM писал(а):
17.06.2009 09:42
Идея в том что бы найти две указанные строчки и закоментировать их и потом добавить в конец файла три новых строки.
Смущает большое количество пробелов в искомых строках.

"много пробелов и/или табуляций" в sed пишется так:


Код: Выделить всё

sed -r 's/^\s*\/dev\/cdrom\s+\/mnt\/cdrom\s+$/\#&/' fstab


это - найти и закоментировать. (проверьте, если понравится - добавте ключ -i, тогда отредактируется.
а "добавить строчку в конец файла"
sed -r '$a строчка'


butch писал(а):
17.06.2009 10:22
[:space:]

это 1 пробельный символ.

Код: Выделить всё

[:space:]+

это 1 или больше таких символов.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
op@n
Сообщения: 2

Re: BASH Scripting

Сообщение op@n »

Народ подскажите как вывести $i-ую строку из текстового файла. Имеется ввиду что номер строки в переменной i
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: BASH Scripting

Сообщение pcodr »

op@n писал(а):
03.07.2009 17:35
Народ подскажите как вывести $i-ую строку из текстового файла. Имеется ввиду что номер строки в переменной i


Например так

Код: Выделить всё

for((a=0; a<$i; a++))
do
       read line
done < test.txt
echo "$line"
remote system type is unix
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: BASH Scripting

Сообщение Portnov »

/me прикинулся drBatty

sed -n '${i}p'
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: BASH Scripting

Сообщение watashiwa_daredeska »

Portnov писал(а):
03.07.2009 18:03
sed -n '${i}p'
Не взлетит.

sed -n "${i}p"
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: BASH Scripting

Сообщение Portnov »

А, ну да :)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: BASH Scripting

Сообщение drBatty »

watashiwa_darede... писал(а):
03.07.2009 18:05
sed -n "${i}p"

Portnov, watashiwa_darede..., нижеследующее не для вас. ;)
Для тех кто не понял:
$ в sed - это адрес, имеет смысл - "последняя строка"
потому запись sed '$КОМАНДА'
выполнит команду, но только для последней строки.
а вот если заключить строчку в "нестрогие кавычки", то сначала эту строку обработает bash, для которого $ имеет другой смысл - это начало переменной, и в таком случае bash поменяет переменную на её значение. Тут надо-бы проследить, что там в этой переменной, т.е. не брать переменные непонятно откуда, а то враг может и закрыть кавычки, и написать свою команду, которая и будет выполнена. Потому - нестрогие кавычки - опасны.... Хотя и применение строгих не даёт 100% гарантии. :(

В данном случае нужно сначала проверить, является ли $i числом, например подходит ли оно под шаблон /[[:digit:]]+/, и если подходит - то можно выполнять.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: