Работа с sed (требуется помощь в использовании регулярных выражений)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

roleg
Сообщения: 38
ОС: ALT Linux 4

Работа с sed

Сообщение roleg »

Значит такая проблема:
скрипт по телнету со свитчей получает список активных IP MAC адресов, нужно правильно составить запрос к базе данных и добавить каждый IP и его MAC в таблицу с 4-мя полями ip, mac, date, time.

Пример без генерации sql кода:

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

#!/bin/bash

full=`netcat 192.168.129.5 23 < cmd | grep Dynamic | sed -e 's/System.........\(\)/\1/i' | sed -e 's/\(\)Dynamic/\1/i'`

# Авторизируемся на свитче и отправляем на стандартный ввод файл cmd содержащий (логин,пароль,комманды)
# фильтр grep-ом, получаемые строки типа (System         192.168.129.6    00-30-4F-24-6F-0C  Dynamic)
# чистим по краям слова System..Dynamic и заносим все остальное в переменную $full

ip=`echo $full | sed -e 's/\(\)[0-F][0-F]-[0-F][0-F]-[0-F][0-F]-[0-F][0-F]-[0-F][0-F]-[0-F][0-F]/\1/i'`

# собственно сама проблема, получаем ip адрес отсекая mac и заносим в переменную
# требуется в данной строке дописать или изменить какой-то кусок кода чтобы получить сразу же и
# mac в другую переменную, чтобы сгенерировать sql файл
# с запросом к базе данных типа:
# INSERT INTO `users` (
# `ip` ,  `mac` ,  `date` ,  `time`
# )VALUES(
# $ip, $mac,  $date,  $time
# )


Так как особо не владею тонкостями работы со скриптами, написал как мог. Прошу обьяснить как организовать парсинг сразу и mac-а или предложите другую идею.

в теме закреплен файл на котором можно потренироваться распарсить его на sql запросы к базе, а также скриптик который выполняет парсинг только ip адресов из файла
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
roleg
Сообщения: 38
ОС: ALT Linux 4

Re: Работа с sed

Сообщение roleg »

хотя бы предложите способ из одной строчки запарсить и ip и mac одновременно :unsure:
Спасибо сказали:
Аватара пользователя
Ariasp
Сообщения: 254
Статус: NixLander

Re: Работа с sed

Сообщение Ariasp »

roleg писал(а):
29.09.2008 16:41
full=`netcat 192.168.129.5 23 < cmd | grep Dynamic | sed -e 's/System.........\(\)/\1/i' | sed -e 's/\(\)Dynamic/\1/i'`

Так как особо не владею тонкостями работы со скриптами, написал как мог. Прошу обьяснить как организовать парсинг сразу и mac-а или предложите другую идею.

другая идея:

ip=`netcat 192.168.129.5 23 < cmd | grep Dynamic | awk '{print $2}'`
mac=`netcat 192.168.129.5 23 < cmd | grep Dynamic | awk '{print $3}'`
Спасибо сказали:
roleg
Сообщения: 38
ОС: ALT Linux 4

Re: Работа с sed

Сообщение roleg »

Ariasp писал(а):
29.09.2008 17:38
roleg писал(а):
29.09.2008 16:41
full=`netcat 192.168.129.5 23 < cmd | grep Dynamic | sed -e 's/System.........\(\)/\1/i' | sed -e 's/\(\)Dynamic/\1/i'`

Так как особо не владею тонкостями работы со скриптами, написал как мог. Прошу обьяснить как организовать парсинг сразу и mac-а или предложите другую идею.

другая идея:

ip=`netcat 192.168.129.5 23 < cmd | grep Dynamic | awk '{print $2}'`
mac=`netcat 192.168.129.5 23 < cmd | grep Dynamic | awk '{print $3}'`


если я так сделаю то нечего толком не изменится... на выводе netcat 192.168.129.5 23 < cmd будет куча строк, а мне нужно отдельно каждую строку обработать и отдельно к каждой создать INSERT запрос к базе. А данным способом я получу два отдельных ip и mac вывода и их сопоставить не получется :mellow:
мне нужно взять вывод netcat 192.168.129.5 23 < cmd и с каждой строки вывода создать запрос ip, mac в таком виде чтобы я смог его потом записать в базу данных через INSERT.

P.S. пробую ваш метод и все замечательно, но необходимо все же разобрать каждый запрос так чтобы:
$a=awk '{print $2}' и $b=awk '{print $3}' с каждой строкой в отдельности а затем в файлик db.sql отдельным запросом к паре ip, mac :happy:
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Работа с sed

Сообщение Ленивая Бестолочь »

если у вас количество пробелов в стоке "System 192.168.129.6 00-30-4F-24-6F-0C Dynamic"
фиксированное, то я бы советовал воспользоваться cut'ом:

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

echo "System         192.168.129.6    00-30-4F-24-6F-0C  Dynamic"| cut -d" " -f14
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
roleg
Сообщения: 38
ОС: ALT Linux 4

Re: Работа с sed

Сообщение roleg »

JIeHb писал(а):
29.09.2008 18:14
если у вас количество пробелов в стоке "System 192.168.129.6 00-30-4F-24-6F-0C Dynamic"
фиксированное, то я бы советовал воспользоваться cut'ом:

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

echo "System         192.168.129.6    00-30-4F-24-6F-0C  Dynamic"| cut -d" " -f14

спасибо за совет.. awk постом выше прекрастно рубит все пробелы но результат работы не получается собрать в кучу чтобы создать sql запрос.
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Работа с sed

Сообщение Ленивая Бестолочь »

тогда, наверно, я не понял в чем именно ваша проблемма, извиняюсь.
а в чем трудность запрос собрать?
если вы (не важно как) получили ip, mac и пр..
что-то, типа:

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

cat >/tmp/file <<EOF
 INSERT INTO `users` (
 `ip` ,  `mac` ,  `date` ,  `time`
 )VALUES(
 $ip, $mac,  $date,  $time
 )
EOF

чтобы получить файлик с sql
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
roleg
Сообщения: 38
ОС: ALT Linux 4

Re: Работа с sed

Сообщение roleg »

JIeHb писал(а):
29.09.2008 18:43
тогда, наверно, я не понял в чем именно ваша проблемма, извиняюсь.
а в чем трудность запрос собрать?
если вы (не важно как) получили ip, mac и пр..
что-то, типа:

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

cat >/tmp/file <<EOF
 INSERT INTO `users` (
 `ip` ,  `mac` ,  `date` ,  `time`
 )VALUES(
 $ip, $mac,  $date,  $time
 )
EOF

чтобы получить файлик с sql


например в цыкле for получаем первые 2 переменные ip, mac и заносим в базу затем повторяем для второй строчки, тоже парсим ip, mac и заносим в базу и т. д.

а вы мне предлагаете получить отдельно переменную со всеми айпишками и со всеми маками... как мне все это дело по отдельным запросам распихать сохранив структуру 1 запись в базу ip, mac?

я немного не правильно обьясняю.. :)
нужно взять из масива строк строчку.. разобрать на ip, mac
отправить готовый запрос к базе в sql файл и разобрать 2-ю строчку и т. д.
Спасибо сказали:
Аватара пользователя
Ariasp
Сообщения: 254
Статус: NixLander

Re: Работа с sed

Сообщение Ariasp »

roleg писал(а):
29.09.2008 18:05
на выводе netcat 192.168.129.5 23 < cmd будет куча строк, а мне нужно отдельно каждую строку обработать и отдельно к каждой создать INSERT запрос к базе.

тогда модификация
pair=`netcat 192.168.129.5 23 < cmd | grep Dynamic | awk '{print $2, $3}'`
дальше обрабатываешь $pair (хотя наверняка можно найти более изящный вариант)
Спасибо сказали:
roleg
Сообщения: 38
ОС: ALT Linux 4

Re: Работа с sed

Сообщение roleg »

Ariasp писал(а):
29.09.2008 19:02
roleg писал(а):
29.09.2008 18:05
на выводе netcat 192.168.129.5 23 < cmd будет куча строк, а мне нужно отдельно каждую строку обработать и отдельно к каждой создать INSERT запрос к базе.

тогда модификация
pair=`netcat 192.168.129.5 23 < cmd | grep Dynamic | awk '{print $2, $3}'`
дальше обрабатываешь $pair (хотя наверняка можно найти более изящный вариант)


в данном случае pair можно использовать как масив $pair[0],$pair[1] ?
извените за вопрос, просто я уже не могу проверить сейчас..
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Работа с sed

Сообщение Ленивая Бестолочь »

например в цыкле for получаем первые 2 переменные ip, mac и заносим в базу затем повторяем для второй строчки, тоже парсим ip, mac и заносим в базу и т. д.

а вы мне предлагаете получить отдельно переменную со всеми айпишками и со всеми маками... как мне все это дело по отдельным запросам распихать сохранив структуру 1 запись в базу ip, mac?

я немного не правильно обьясняю.. smile.gif
нужно взять из масива строк строчку.. разобрать на ip, mac
отправить готовый запрос к базе в sql файл и разобрать 2-ю строчку и т. д.


теперь кажется дошло.
(кажется)
тогда вам наверное стоит делать что-то на подобии:

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

while read x ip mac y;do

time=....
date=....
cat >/tmp/file <<EOF
INSERT INTO `users` (
`ip` ,  `mac` ,  `date` ,  `time`
)VALUES(
$ip, $mac,  $date,  $time
)
EOF

done < netcat 192.168.129.5 23 < cmd | grep Dynamic | sed -e 's/System.........\(\)/\1/i' | sed -e 's/\(\)Dynamic/\1/i'

(это я просто проиллюстрировать идею, не принимать за рабочий код ;) )
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
roleg
Сообщения: 38
ОС: ALT Linux 4

Re: Работа с sed

Сообщение roleg »

JIeHb

да, замечательно... ;) можно подробней?
начнем с того что у меня файлик с внутренностями:
System 192.168.129.1 00-1C-F0-20-73-C4 Dynamic
System 192.168.129.6 00-30-4F-24-6F-0C Dynamic
System 192.168.129.8 00-30-4F-27-79-4D Dynamic
как он превратится с помощью вашего метода в 3 запроса INSERT ?
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Работа с sed

Сообщение Ленивая Бестолочь »

пожалуйста:

вот эта конструкция:

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

while read system ip mac dynamic;do

done < <фаш файл>

это цикл, который построчно прочитает ваш файл, и для каждой строки у вас будут определены переменные
$system, $ip, $mac и $dynamic,
которые вы можете подставить куда душе угодно.

ваш пример:

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

sloth@misa:~/bash$ cat file
System 192.168.129.1 00-1C-F0-20-73-C4 Dynamic
System 192.168.129.6 00-30-4F-24-6F-0C Dynamic
System 192.168.129.8 00-30-4F-27-79-4D Dynamic

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

sloth@misa:~/bash$ cat parse
while read system ip mac dynamic;do
cat >>/tmp/file <<EOF
INSERT INTO \`users\` (
\`ip\` ,  \`mac\` ,  \`date\` ,  \`time\`
)VALUES(
$ip, $mac,  $date,  $time
)
EOF
done < file

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

sloth@misa:~/bash$ ./parse

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

sloth@misa:~/bash$ cat /tmp/file
INSERT INTO `users` (
`ip` ,  `mac` ,  `date` ,  `time`
)VALUES(
192.168.129.1, 00-1C-F0-20-73-C4,  ,
)
INSERT INTO `users` (
`ip` ,  `mac` ,  `date` ,  `time`
)VALUES(
192.168.129.6, 00-30-4F-24-6F-0C,  ,
)
INSERT INTO `users` (
`ip` ,  `mac` ,  `date` ,  `time`
)VALUES(
192.168.129.8, 00-30-4F-27-79-4D,  ,
)
sloth@misa:~/bash$


в общем примерно так :-[
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
roleg
Сообщения: 38
ОС: ALT Linux 4

Re: Работа с sed

Сообщение roleg »

JIeHb огромное тебе спасибо... действительно, я могу использовать данную конструкцию :laugh:
все дело в том что мало литературы по теме... или я плохо ищу :blush:

Спасибо JIeHb !!!

Тема закрыта :hammer:
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Работа с sed

Сообщение Ленивая Бестолочь »

не за что ;)
приятно помочь
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
HRonik
Сообщения: 140
ОС: Debian

Re: Работа с sed

Сообщение HRonik »

Советую почитать http://www.lissyara.su/?id=1496 это ман на русском ...
Спасибо сказали: