The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"скрипт на sed'e"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы WEB технологии (Public)
Изначальное сообщение [Проследить за развитием треда]

"скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 13-Июл-05, 06:58  (MSK)
Здравствуйте.

С перлом знаком плохо, потому пытаюсь все сделать на sed'e
Задача - найти в файле прямой зоны нужную строку и заменить в ней IP адрес, например:

ns              A       192.168.196.2
заменить на
ns              A       192.168.196.20

Делаю такой регексп в скрипте:

/bin/sed -e 's/^'$1'/'$1'   A    '$2'/' < zone_file

$1 и $2 - это параметры ком. строки для скрипта, содержащие соответственно имя и IP адрес

В результате получаю такое:

ns       A       192.168.1.2       A       192.168.196.20

т.е. строка просто добавляется. Как это победить?
Спасибо.

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "скрипт на sed'e" 
Сообщение от allez Искать по авторуВ закладки(ok) on 13-Июл-05, 07:16  (MSK)
>Делаю такой регексп в скрипте:
>
>/bin/sed -e 's/^'$1'/'$1'   A    '$2'/' < zone_file
>
>
>$1 и $2 - это параметры ком. строки для скрипта, содержащие соответственно
>имя и IP адрес
>
>В результате получаю такое:
>
>ns       A      192.168.1.2       A       192.168.196.20
>
>т.е. строка просто добавляется. Как это победить?
>Спасибо.


Строка добавляется потому, что вы отдалй sed'у такую команду. Посмотрите
внимательнее на приведенную вами строку. И опишите вашу задачу подробнее,
а то сначала пишете, что вам нужно заменить IP-адреса, а несколькими
строками ниже выясняется, что вы пытаетесь добавить адрес к имени машины.
Неувязочка получается. В общем, приведите фрагмент исходного файла и то,
как он должен выглядеть после обработки.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 13-Июл-05, 07:36  (MSK)
>Строка добавляется потому, что вы отдалй sed'у такую команду. Посмотрите
>внимательнее на приведенную вами строку. И опишите вашу задачу подробнее,
>а то сначала пишете, что вам нужно заменить IP-адреса, а несколькими
>строками ниже выясняется, что вы пытаетесь добавить адрес к имени машины.
>Неувязочка получается. В общем, приведите фрагмент исходного файла и то,
>как он должен выглядеть после обработки.

Мне нужно именно заменить IP адрес, но в скрипт я передаю только два парметра - имя и соотв. ему IP-адрес. Пусть в прямой зоне есть запись вида:

ns              A       192.168.196.2

Мне нужно заменить например на:

ns              A       192.168.196.22

То есть в скрипт передаю два параметра:
#dparse.sh ns 192.168.196.22

т.е. новый IP адрес.

Видимо я неверно задал рег. выражение? Как будет правильно?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "скрипт на sed'e" 
Сообщение от allez Искать по авторуВ закладки(ok) on 13-Июл-05, 08:29  (MSK)
Правильно будет так:
sed -e "s/^$1.*/$1    A     $2/g" < zone_file

Обратите внимание на точку со звездочкой (.*) после переменной. В таком
виде данная конструкция означает "заменить всю строку,начинающуюся с $1".
В вашем первоначальном варианте sed должен был заменить лишь часть строки
($1) на эту же часть плюс "A" плюс значение переменной $2 ($1  A  $2).

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 13-Июл-05, 08:55  (MSK)
>Правильно будет так:
>sed -e "s/^$1.*/$1    A     $2/g"
>< zone_file
>
>Обратите внимание на точку со звездочкой (.*) после переменной. В таком
>виде данная конструкция означает "заменить всю строку,начинающуюся с $1".
>В вашем первоначальном варианте sed должен был заменить лишь часть строки
>($1) на эту же часть плюс "A" плюс значение переменной $2 ($1
> A  $2).
Большое спасибо!
Тогда еще спрошу: а как sed'ом выловить серийный номер в зоне и увеличить его?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 13-Июл-05, 07:41  (MSK)
Вот фрагмент:

; example
@       IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
                        199802151       ; serial, todays date + todays serial #
                        8H              ; refresh, seconds
                        2H              ; retry, seconds
                        1W              ; expire, seconds
                        1D )            ; minimum, seconds
;
                NS      ns              ; Internet адрес сервера имен
                MX      10 mail.linux.bogus     ; Основной почтовый сервер
                MX      20 mail.friend.bogus.   ; Дополнительный почтовый сервер
;
localhost       A       127.0.0.1
ns              A       192.168.196.2
mail            A       192.168.196.4

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "скрипт на sed'e" 
Сообщение от Simps Искать по авторуВ закладки(??) on 13-Июл-05, 09:50  (MSK)
>Вот фрагмент:
>
>; example
>@       IN    
> SOA     ns.linux.bogus. hostmaster.linux.bogus. (
>            
>          
> 199802151       ; serial, todays
>date + todays serial #
>            
>          
> 8H          
>    ; refresh, seconds
>            
>          
> 2H          
>    ; retry, seconds
>            
>          
> 1W          
>    ; expire, seconds
>            
>          
> 1D )        
>   ; minimum, seconds
>;
>            
>    NS      ns
>          
>  ; Internet адрес сервера имен
>            
>    MX      10
>mail.linux.bogus     ; Основной почтовый сервер
>            
>    MX      20
>mail.friend.bogus.   ; Дополнительный почтовый сервер
>;
>localhost       A    
>  127.0.0.1
>ns            
>  A       192.168.196.2
>mail            
>A       192.168.196.4

Лучше писать на асемблере, будет намного проще ...
А если чесно пиши лучше на perl

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 13-Июл-05, 10:28  (MSK)
>
>Лучше писать на асемблере, будет намного проще ...
:-)
>А если чесно пиши лучше на perl
Перл не очень хорошо знаю. Сейчас пытаюсь перевести этот скрипт перл.

Тогда подскажи как сделать следующее.

Пусть SOA запись выглядит одной строкой так:

@  IN SOA ns.lin.bogus. hostmaster.lin.bogus. ( 199802151 8H 2H 1W 1D )

как перлом выкусить часть строки, определяющую серийный номер и заменить только часть?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "скрипт на sed'e" 
Сообщение от allez Искать по авторуВ закладки(ok) on 13-Июл-05, 12:43  (MSK)
>Перл не очень хорошо знаю. Сейчас пытаюсь перевести этот скрипт перл.
>
>Тогда подскажи как сделать следующее.
>
>Пусть SOA запись выглядит одной строкой так:
>
>@  IN SOA ns.lin.bogus. hostmaster.lin.bogus. ( 199802151 8H 2H 1W 1D
>)
>
>как перлом выкусить часть строки, определяющую серийный номер и заменить только часть?
>

Да для вашей задачи и bash пока достаточно. Но изучение Perl - вещь
стоящая ;-). Вот вам скриптик, который выделяет и печатает этот номер:

#!/bin/bash

while read STRING
do
  if [ "echo STRING | grep ^@" != "" ]
  then
    SERIAL=`echo $STRING | gawk -F"(" '{print $2}' | gawk -F")" '{print $1}'`
    echo $SERIAL
  fi
done < $1

Имя файла скрипту скармливается как параметр: ./script.sh zone_file.

А что именно вы хотите заменить в номере?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 13-Июл-05, 16:44  (MSK)
>Да для вашей задачи и bash пока достаточно. Но изучение Perl -
>вещь
>стоящая ;-). Вот вам скриптик, который выделяет и печатает этот номер:
>
>#!/bin/bash
>
>while read STRING
>do
>  if [ "echo STRING | grep ^@" != "" ]
>
>  then
>    SERIAL=`echo $STRING | gawk -F"(" '{print $2}' |
>gawk -F")" '{print $1}'`
>    echo $SERIAL
>  fi
>done < $1
>
>Имя файла скрипту скармливается как параметр: ./script.sh zone_file.
>
>А что именно вы хотите заменить в номере?
Вообще мне нужно увеличить серийный номер, чтобы перегрузить named и изменения вступили бы в силу.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "скрипт на sed'e" 
Сообщение от allez Искать по авторуВ закладки(ok) on 14-Июл-05, 10:39  (MSK)
>Вообще мне нужно увеличить серийный номер, чтобы перегрузить named и изменения вступили
>бы в силу.

В таком случае нужно слегка изменить скрипт:
======================================================
#!/bin/bash
                                                                                                              
declare -i SERIAL NEWSERIAL # Объявим SERIAL и NEWSERIAL как целочисленные переменные
                                                                                                              
while read STRING
do
  if [ "echo STRING | grep ^@" != "" ]
  then
    # Поместим в SERIAL серийный номер
    SERIAL=`echo $STRING | gawk -F"(" '{print $2}' | gawk -F")" '{print $1}' | gawk '{print $1}'`
    echo $SERIAL
    NEWSERIAL=$SERIAL*2  # Умножим серийный номер на 2
    echo $NEWSERIAL
    echo $STRING | sed "s/$SERIAL/$NEWSERIAL/" >> new_zone_file
   continue
  fi
echo $STRING >> new_zone_file
done < $1
======================================================

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 14-Июл-05, 17:50  (MSK)
>>Вообще мне нужно увеличить серийный номер, чтобы перегрузить named и изменения вступили
>>бы в силу.
>
>В таком случае нужно слегка изменить скрипт:
>======================================================
>#!/bin/bash
>
>declare -i SERIAL NEWSERIAL # Объявим SERIAL и NEWSERIAL как целочисленные переменные
>
>
>while read STRING
>do
>  if [ "echo STRING | grep ^@" != "" ]
>
>  then
>    # Поместим в SERIAL серийный номер
>    SERIAL=`echo $STRING | gawk -F"(" '{print $2}' |
>gawk -F")" '{print $1}' | gawk '{print $1}'`
>    echo $SERIAL
>    NEWSERIAL=$SERIAL*2  # Умножим серийный номер на 2
>
>    echo $NEWSERIAL
>    echo $STRING | sed "s/$SERIAL/$NEWSERIAL/" >> new_zone_file
>   continue
>  fi
>echo $STRING >> new_zone_file
>done < $1
>======================================================
Большое спасибо! Написал сам на /bin/sh+sed :)
Теперь хотелось бы поместить этот срипт в качестве cgi на свой localhost веб-сервер (для личного пользования). Такое возможно, или же скрипт подлежит полной переделке?
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "скрипт на sed'e" 
Сообщение от Сергей Петров emailИскать по авторуВ закладки on 14-Июл-05, 20:50  (MSK)
Я так предполагаю что возможно =)

1. Пишешь какой-нить такой Html:
**********************************************
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>dparse</title>
<meta http-equiv=Content-Type content="text/html; charset=Windows-1251">
</head>

<body>
<form method='GET' action='/cgi-bin/dparse.sh' name='base_edit_person'>
<table border=1>
<tr> <td>name</td> <td><input name='name'></td> </tr>
<tr> <td>ip</td> <td><input name='ip'></td> </tr>
</table>
<input type='submit' name='submit' value='Change ip'>
</form>

</body>
</html>

**********************************************

2. засовываешь его в htdocs твоего веб сервера.

3. твой скприпт кладешь в cgi-bin директорию твоего же веб сервера.

4. честно говоря, я не знаю, как можно на sh+sed вылавливать значения паратметвов, но уверен что это возможно... =) Вообщем вылавшиваешь параметы и используешь их в скрипте.... Сорри, что не могу дать тебе полного решнеия, но думаю этого будет достачточно, чтобы ты смог решить проблему.

PS переходи на perl - рулез полный =) (в нем я точно знаю, как параметры перехватывать =)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 15-Июл-05, 05:15  (MSK)
><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
>
><html>
><head>
> <title>dparse</title>
> <meta http-equiv=Content-Type content="text/html; charset=Windows-1251">
></head>
>
><body>
><form method='GET' action='/cgi-bin/dparse.sh' name='base_edit_person'>
><table border=1>
><tr> <td>name</td> <td><input name='name'></td> </tr>
><tr> <td>ip</td> <td><input name='ip'></td> </tr>
></table>
><input type='submit' name='submit' value='Change ip'>
></form>
>
></body>
></html>
Спасибо, примерно так и предполагал. Но минус в том, что необходимо ручками заполнять поля. А можно ли как-то это обойти? Например, передавать необходимые скрипту параметры в http запросе, что-то вроде такого:
http://localhost/cgi-bin/parse.cgi?name=foo.bar?value=192.168.1.1


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "скрипт на sed'e" 
Сообщение от allez Искать по авторуВ закладки(ok) on 15-Июл-05, 08:15  (MSK)

>Спасибо, примерно так и предполагал. Но минус в том, что необходимо ручками
>заполнять поля. А можно ли как-то это обойти? Например, передавать необходимые
>скрипту параметры в http запросе, что-то вроде такого:
>http://localhost/cgi-bin/parse.cgi?name=foo.bar?value=192.168.1.1

Да какие проблемы, укажите в форме использование метода GET, а в скрипте
используйте стандартные переменные CGI (в частности, QUERY_STRING, в ней
содержатся параметры, передаваемые скрипту из формы)

P.S. Писать несложные CGI-скрипты на bash можно и это неплохо освещено в
книге Д. Тейнсли "Linux и Unix: программирование в shell" (http://books.dore.ru/bs/f1bid409.html).
Но, конечно, Perl для CGI-программирования подходит куда лучше благодаря
своим очень широким возможностям и расширяемости.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

15. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 15-Июл-05, 08:47  (MSK)
>Да какие проблемы, укажите в форме использование метода GET, а в скрипте
>
>используйте стандартные переменные CGI (в частности, QUERY_STRING, в ней
>содержатся параметры, передаваемые скрипту из формы)
>
>P.S. Писать несложные CGI-скрипты на bash можно и это неплохо освещено в
>
>книге Д. Тейнсли "Linux и Unix: программирование в shell" (http://books.dore.ru/bs/f1bid409.html).
>Но, конечно, Perl для CGI-программирования подходит куда лучше благодаря
>своим очень широким возможностям и расширяемости.
Что есть почитать (то что доступно в Сети) по теории CGI?
Например если cgi будет написан на C, то как ему передавать параметры, как argv[] или более хитрый способ?
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

16. "скрипт на sed'e" 
Сообщение от allez Искать по авторуВ закладки(ok) on 15-Июл-05, 09:06  (MSK)
>Что есть почитать (то что доступно в Сети) по теории CGI?
>Например если cgi будет написан на C, то как ему передавать параметры,
>как argv[] или более хитрый способ?

Что касается "почитать", даже и не подскажу, уж извините. Я по бумажным
книжкам учился. Поэтому ничем, кроме посыла в поиск (http://www.google.com/search?q=cgi+programming+guide) тут не помогу.
На Си CGI-скриптов я не писал, но думаю, что argv[] подойдет. По крайней мере скрипты на Перле получают параметры точно так же, через массив @ARGV.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

17. "скрипт на sed'e" 
Сообщение от roman Искать по авторуВ закладки(??) on 15-Июл-05, 10:08  (MSK)
(http://www.google.com/search?q=cgi+programming+guide) тут не помогу.
>
>На Си CGI-скриптов я не писал, но думаю, что argv[] подойдет. По
>крайней мере скрипты на Перле получают параметры точно так же, через
>массив @ARGV.
Большое спасибо за ответы!
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру