Найти - Пользователи
Полная версия: С bash в python
Начало » Python для новичков » С bash в python
1
Izya12
Всем привет.
Пытаюсь переписать с 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'
Может ктонить мне сможет помочь?
wbt
с numeric sort будет чуть посложнее, а вообще - примерно вот так:

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

Кстати: за вставку в mysql через format в приличных домах обычно бьют канделябром.
Izya12
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
wbt
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]

вот это - это что?
Izya12
вот вывод скрипта что у меня получился
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
s0rg
#!/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()
Не проверял, так как мускула под рукой нет.
Izya12
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))

Не понял то что жирным выделено, точнее что делает понял но вот как не понял
s0rg
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)
только короче. Так понятней?
py.user.next
Izya12
Пытаюсь переписать с bash скрипта:
напиши задание
Izya12
s0rg
Огромное спасибо!!! Так на много понятней.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB