Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2013 13:29:32

Izya12
Зарегистрирован: 2013-08-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

С bash в python

Всем привет.
Пытаюсь переписать с bash скрипта:

#/bin/bash
. "/etc/CFG_FULL.cfg"
#nmap --excludefile $pwd/db_ip_exclude.txt -sn 192.168.212.0/22 | egrep -v "Host|nmap" | awk '{print $5}' > $pwd/db_ip_test.txt
cd $pwd/port_up_down
#ip=192.168.213.50
while read ip
do
cat /dev/null > $pwd/port_up_down/tmp/tmp_$ip.log
#/home/user/test/port_up_down/port_status.sh $ip
cat /var/log/remote/switches.log | grep -w $ip | grep Port | awk '{ print $7 }' | sort -n | uniq >> $pwd/port_up_down/tmp/tmp_$ip.log
cat /var/log/remote/switches.log.1 | grep -w $ip | grep Port | awk '{ print $7 }' | sort -n | uniq >> $pwd/port_up_down/tmp/tmp_$ip.log
zcat /var/log/remote/switches.log.2.gz | grep " $ip " | grep Port | awk '{ print $7 }' | sort -n | uniq >> $pwd/port_up_down/tmp/tmp_$ip.log
cat $pwd/port_up_down/tmp/tmp_$ip.log | sort -n | uniq > $pwd/port_up_down/log/$ip.log
done < $pwd/db_ip_test.txt
на python, и вот что у меня получилось:
#!/usr/bin/env python
from string import *
import MySQLdb
import operator
import array
fIP = open("db_ip_test.txt")
xString = fIP.readlines()
fIP.close()
nambers = len(xString)
xString = [xString.replace("\n","") for xString in xString]
for cntr in range(0,nambers):
    fOut = open("log/" + xString[cntr] + ".log", "w")
    print (xString[cntr])
    select_sql = "SELECT `msg` FROM `logs` WHERE host = '{0}' and msg LIKE '{1}' ORDER BY `logs`.`msg` ASC;"
    db = MySQLdb.connect(host="127.0.0.1",user="root",passwd="121788",db="syslog")
    cursor = db.cursor()
    cursor.execute(select_sql.format(xString[cntr],'Port% link%'))
    for k in cursor.fetchall():
      k = str(k)
      k = k.split()
      k = k[1]
      fOut.write(k + '\n')
      print (k)
    fOut.close()

То чего мне не хватает в python скрипте:
Сортировки данных не mysql и python.
Удаление дублей.
Мне не хватает sort -n | uniq
И выборки данных из базы только за 3 последних месяца, пойдет и 90 последних дней.

Пытался сделать мускульный запрос вот таким:
SELECT `msg` FROM `logs` WHERE host = '192.168.213.92' and msg LIKE 'Port%link%' and `datetime` between '2013-07-04 00:00:00' and '2013-08-04 23:59:59'
но этот запрос не работает, выводит ошибку “The column name ‘datetime’ is a MySQL reserved keyword.”
Хотя по отдельности запросы работают:
SELECT `msg` FROM `logs` WHERE host = '192.168.213.92' and msg LIKE 'Port%link%' 
SELECT `msg` FROM `logs` WHERE `datetime` between '2013-05-04 00:00:00' and '2013-08-04 23:59:59'
Может ктонить мне сможет помочь?

Отредактировано Izya12 (Авг. 20, 2013 13:31:14)

Офлайн

#2 Авг. 20, 2013 13:47:49

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

С bash в python

с numeric sort будет чуть посложнее, а вообще - примерно вот так:

sorted(set(open("db_ip_test.txt").read().splitlines()))

Кстати: за вставку в mysql через format в приличных домах обычно бьют канделябром.



Бейсик - не порок, Гвидо - не пророк

Офлайн

#3 Авг. 20, 2013 13:58:29

Izya12
Зарегистрирован: 2013-08-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

С bash в python

wbt
с numeric sort будет чуть посложнее, а вообще - примерно вот так:
Извините за то что не уточнил, сортировать и убирать дубли надо из получаемых данных, в данном примере это “k”
Пока что у меня выводятся вот такие данные
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
23
3
3

Офлайн

#4 Авг. 20, 2013 14:05:57

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

С bash в python

print sorted(set(open("db_ip_test.txt").read().splitlines()))
# ['11', '23', '3']

что такое k, и как оно берётся, я не совсем понимаю.

print list(cursor.fetchall()) что покажет?

      k = str(k)
      k = k.split()
      k = k[1]

вот это - это что?



Бейсик - не порок, Гвидо - не пророк

Офлайн

#5 Авг. 20, 2013 14:31:01

Izya12
Зарегистрирован: 2013-08-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

С bash в python

вот вывод скрипта что у меня получился
LOG python

Вот кусок файла db_ip_test.txt:

192.168.212.32
192.168.212.50
192.168.212.51
192.168.212.52

вот вывод лога /var/log/remote/switches.log:

Aug 20 18:08:13 192.168.213.134 INFO: Port 2 link down
Aug 20 17:08:15 192.168.33.215 342236: Aug 20 18:08:14.617 XMAO: %PIM-6-INVALID_RP_JOIN: Received (*, 224.1.1.160) Join from 192.168.46.2 for invalid RP 150.158.231.8
Aug 20 18:08:16 192.168.213.134 INFO: Port 2 link up, 10Mbps HALF duplex
Aug 20 18:08:27 192.168.213.134 INFO: Port 2 link down
Aug 20 18:08:32 192.168.213.134 INFO: Port 2 link up, 10Mbps HALF duplex
Aug 20 17:08:37 192.168.215.250 INFO: Port 32 link up, 100Mbps  FULL duplex
Aug 20 10:20:25 192.168.212.72 INFO: Port 17 link down
Aug 20 10:20:28 192.168.212.72 INFO: Port 17 link up, 10Mbps  FULL duplex
Aug 20 10:20:36 192.168.212.72 INFO: Port 17 link down
Aug 20 17:08:58 192.168.215.250 INFO: Port 32 link down
Aug 20 17:09:00 192.168.215.250 INFO: Port 32 link up, 100Mbps  FULL duplex
Aug 20 18:09:02 192.168.213.134 INFO: Port 2 link down
Aug 20 18:09:07 192.168.213.134 INFO: Port 2 link up, 10Mbps HALF duplex

дамп базы которую парсит скрипт:
DB

Офлайн

#6 Авг. 20, 2013 15:53:39

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

С bash в python

#!/usr/bin/env python
#-*- coding: utf8 -*-
import MySQLdb
def read_ip(fname):
    with open(fname) as fd:
        return set(fd.read().splitlines())
def main():
    query = 'SELECT msg FROM logs WHERE host = %s and msg LIKE %s ORDER BY msg ASC'
    db = MySQLdb.connect(host='127.0.0.1', user='root', passwd='121788', db='syslog')
    cursor = db.cursor()
    for ip in read_ip('db_ip_test.txt'):
        print ip
        cursor.execute(query, (ip, 'Port% link%'))
        result = set(map(lambda a: str(a).split()[1], cursor.fetchall()))
        with open('log/' + ip + '.log', 'w') as fd:
            fd.write('\n'.join(result)
main()
Не проверял, так как мускула под рукой нет.

Офлайн

#7 Авг. 21, 2013 06:09:33

Izya12
Зарегистрирован: 2013-08-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

С bash в python

s0rg
Огромное спасибо!!!
Вроде более менее работает, покрайней мере дублей нет, а это самое главное!
ЗЫ Извините за назойливость, но не могли бы вы объяснить данный код, а то я только учусь и хотелось бы понять полностью данный пример.

def read_ip(fname):
    """
    В данной функции заданно открытие файла (fname)
    и его построчное считывание
    :param fname:
    :return:
    """
    with open(fname) as fd:
        return set(fd.read().splitlines())
это вроде я понял
но
def main():
    """
    Здесь мы конектимся к базе и отправляем sql
    запрос, потом циклом собираем данные и убираем
    дубли и получившееся записываем в файл
    :rtype : object
    """
    query = 'SELECT msg FROM logs WHERE host = %s and msg LIKE %s ORDER BY msg ASC'
    db = MySQLdb.connect(host='127.0.0.1', user='root', passwd='121788', db='syslog')
    cursor = db.cursor()
    for ip in read_ip('../db_ip_test.txt'):
        print ip
        cursor.execute(query, (ip, 'Port% link%'))
        [b]result = set(map(lambda a: str(a).split()[1], cursor.fetchall()))[/b]
        with open('log/' + ip + '.log', 'w') as fd:
            fd.write('\n'.join(result))

Не понял то что жирным выделено, точнее что делает понял но вот как не понял

Отредактировано Izya12 (Авг. 21, 2013 07:09:13)

Офлайн

#8 Авг. 21, 2013 15:22:43

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

С bash в python

result = set(map(lambda a: str(a).split()[1], cursor.fetchall()))
Это тоже самое что и:
result = []
for row in cursor.fetchall():
    r = str(row)
    r = r.split()
    r = r[1]
    result.append(r)
result = set(result)
только короче. Так понятней?

Офлайн

#9 Авг. 21, 2013 20:56:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

С bash в python

Izya12
Пытаюсь переписать с bash скрипта:
напиши задание



Офлайн

#10 Авг. 22, 2013 05:31:04

Izya12
Зарегистрирован: 2013-08-20
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

С bash в python

s0rg
Огромное спасибо!!! Так на много понятней.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version