регулярные выражения в шелл

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

регулярные выражения в шелл

Непрочитанное сообщение Alex Keda » 2009-01-05 19:08:33

сабж.
надо разобрать файл содержащий секции типа:

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

Account "h1526" {
        Owner root
        Domain xxx.ru
        Ip 78.x.x.122
        Preset ID50
        SSL off
        PHP fcgi
        CGI on
        SSI off
        DiskLimit 0
        UserLimit 0
        CPULimit 10
        MemLimit 16
        ProcLimit 3
        FtpLimit 1
        MailLimit 1
        DomainLimit 1
        WebDomainLimit 1
        MailDomainLimit 1
        DatabaseLimit 1
        DatabaseUserLimit 1
        BandwidthLimit 10000
        BandwidthUsage 0
}
В идеале, конечно в переменные, практически - хотя бы подробить на отдельные файлы по имени юзера (в примере - h1526) - дальше мона грепом выдернуть нужную строку...
пока додумался тока до

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

tr "\n" ";"
а вот дальше - идеи пропали... сделал всё в одну строку - а как побить на куски - даж не знаю =((
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: регулярные выражения в шелл

Непрочитанное сообщение hizel » 2009-01-05 19:33:19

да воспользуйся чем нибудь более высокоуровневым, например php ;)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: регулярные выражения в шелл

Непрочитанное сообщение zg » 2009-01-05 19:43:36

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

zg# cat 1.awk
#!/usr/bin/awk -f
{
  if ( $1== "Account" && $3== "{" )
  {
    section = $2
    gsub(/"/, "", $2);
    toFile = $2;
    print "Output " section " section to file " toFile;
  }
  if ( toFile ) print $0 > toFile;
  if ( $1 == "}" ) toFile = null;
}
zg#

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

zg# ./1.awk 1.txt
Output "h1526" section to file h1526
Output "h1523" section to file h1523
zg#

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

zg# cat h1523
Account h1523 {
        Owner root
        Domain xxx.ru
        Ip 78.x.x.122
        Preset ID50
        SSL off
        PHP fcgi
        CGI on
        SSI off
        DiskLimit 0
        UserLimit 0
        CPULimit 10
        MemLimit 16
        ProcLimit 3
        FtpLimit 1
        MailLimit 1
        DomainLimit 1
        WebDomainLimit 1
        MailDomainLimit 1
        DatabaseLimit 1
        DatabaseUserLimit 1
        BandwidthLimit 10000
        BandwidthUsage 0
}
zg#

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: регулярные выражения в шелл

Непрочитанное сообщение Alex Keda » 2009-01-05 20:37:51

бага какая-то

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

srv# ./test.awk /usr/local/ispmgr/etc/ispmgr.conf                                                                                                         ~
Output "host-foodru" section to file host-foodru
Output "h1003" section to file h1003
Output "h1004" section to file h1004
Output "h1009" section to file h1009
Output "h1018" section to file h1018
Output "h1028" section to file h1028
Output "dspam" section to file dspam
Output "h1081" section to file h1081
Output "h1082" section to file h1082
Output "h1092" section to file h1092
Output "h1103" section to file h1103
Output "h1117" section to file h1117
Output "h1126" section to file h1126
Output "h1129" section to file h1129
Output "h1130" section to file h1130
Output "h1135" section to file h1135
Output "h1114" section to file h1114
Output "h1138" section to file h1138
/usr/bin/awk: h1138 makes too many open files
 input record number 705, file /usr/local/ispmgr/etc/ispmgr.conf
 source line number 10

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

srv# ll | grep h1                                                                                                                                         ~
-rw-r--r--  1 root  wheel  -  336B  5 янв 20:32 h1003
-rw-r--r--  1 root  wheel  -  345B  5 янв 20:32 h1004
-rw-r--r--  1 root  wheel  -  340B  5 янв 20:32 h1009
-rw-r--r--  1 root  wheel  -  426B  5 янв 20:32 h1018
-rw-r--r--  1 root  wheel  -  335B  5 янв 20:32 h1028
-rw-r--r--  1 root  wheel  -  339B  5 янв 20:32 h1081
-rw-r--r--  1 root  wheel  -  423B  5 янв 20:32 h1082
-rw-r--r--  1 root  wheel  -  342B  5 янв 20:32 h1092
-rw-r--r--  1 root  wheel  -  335B  5 янв 20:32 h1103
-rw-r--r--  1 root  wheel  -  340B  5 янв 20:32 h1114
-rw-r--r--  1 root  wheel  -  336B  5 янв 20:32 h1117
-rw-r--r--  1 root  wheel  -  337B  5 янв 20:32 h1126
-rw-r--r--  1 root  wheel  -  340B  5 янв 20:32 h1129
-rw-r--r--  1 root  wheel  -  342B  5 янв 20:32 h1130
-rw-r--r--  1 root  wheel  -  336B  5 янв 20:32 h1135
srv# 
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: регулярные выражения в шелл

Непрочитанное сообщение zg » 2009-01-05 20:52:08

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

#!/usr/bin/awk -f
{
  if ( $1== "Account" && $3== "{" )
  {
    if ( toFile ) close(toFile);
    toFile = $2;
    gsub(/"/, "", toFile);
    print "Output " $2 " section to file " toFile;
  }
  if ( toFile ) print $0 > toFile;
  if ( $1 == "}" )
  {
    if ( toFile ) close(toFile);
    toFile = 0;
  }
}
?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: регулярные выражения в шелл

Непрочитанное сообщение Alex Keda » 2009-01-05 20:54:14

it's work!
thanks!
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Re: регулярные выражения в шелл

Непрочитанное сообщение Гость » 2009-01-05 21:28:21

lissyara писал(а):в переменные
ась?

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

#! /bin/sh

parse() {
    while read par val; do
	case $val in
	    *{*)
	        val=${val%\"*}
		val=${val#\"}
		root=$par
		tree=${root}_$val
#		cons=${root}_$tree

		roots="$roots $root"
		eval ${root}_trees=\"\$${root}_trees $tree\"

		while read par val; do
		    case $par in
			*}*) break
		    esac
		    branch=$par
		    leaf=$val

		    eval ${tree}_branches=\"\$${tree}_branches $branch\"
		    eval ${tree}_$branch=$leaf
		done
	esac
    done
}

for arg; {
    parse < $arg
}

echo roots=$roots

# show trees on root `Account'
echo Account_trees=$Account_trees

# show branches on tree `Account_h1526'
echo Account_h1526_branches=$Account_h1526_branches

# show leaf value on branch `Account_h1526_CGI'
echo Account_h1526_CGI=$Account_h1526_CGI

# test
echo Account_h1526_Owner=$Account_h1526_Owner
echo Account_dummy_Owner=$Account_dummy_Owner

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

(~). foo.sh data
roots= Account Account
Account_trees= Account_h1526 Account_dummy
Account_h1526_branches= Owner Domain Ip Preset SSL PHP CGI SSI DiskLimit UserLimit CPULimit MemLimit ProcLimit FtpLimit MailLimit DomainLimit WebDomainLimit MailDomainLimit DatabaseLimit DatabaseUserLimit BandwidthLimit BandwidthUsage
Account_h1526_CGI=on
Account_h1526_Owner=root
Account_dummy_Owner=luser

Гость
проходил мимо

Re: регулярные выражения в шелл

Непрочитанное сообщение Гость » 2009-01-05 21:30:47

Гость писал(а):roots= Account Account
упс, забыл засунуть алгоритм от дубликатов. Но я думаю сам разберешься как его сделать.

ps, awk в топку ;)

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: регулярные выражения в шелл

Непрочитанное сообщение zg » 2009-01-05 21:33:20

Гость писал(а):ps, awk в топку ;)
ну да, на еволах лучше -))))