Chinaunix

标题: python 文本处理 [打印本页]

作者: liheng    时间: 2014-01-15 18:41
标题: python 文本处理
[www.aa.com]
192.168.10.10
192.168.10.11
192.168.10.12
192.168.10.13

[mail.aa.com]
192.168.10.14
192.168.10.15
192.168.10.16

[db.aa.com]
192.168.10.17
192.168.10.18

[oa.aa.com]
192.168.10.19
192.168.10.20
192.168.10.21
192.168.10.22
192.168.25.14
192.168.10.25

日志内容见上

要求使用python ,从每个域中取出一个ip和对应的域名
效果如下:
www.aa.com  192.168.10.10
mail.aa.com    192.168.10.14
db.aa.com      192.168.10.17
oa.aa.com      192.168.10.19

请各位大神指教,谢谢!

作者: q1208c    时间: 2014-01-15 19:21
ConfigParse
作者: cnvbird    时间: 2014-01-15 19:43
本帖最后由 cnvbird 于 2014-01-15 19:47 编辑
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-

  3. import re

  4. ret_list = []
  5. flag = False
  6. with open('log.txt', 'r') as f:
  7.     my_str = ''
  8.     for line in f.readlines():
  9.         if re.search(r'^\[.*\], line):
  10.             flag = False
  11.             my_str += ' ' + line.strip()
  12.         else:
  13.             if not flag:
  14.                 my_str += ' ' + line.strip()
  15.                 flag = True
  16.                 ret_list.append(my_str)
  17.                 my_str = ''
  18.    
  19. print ret_list
复制代码

作者: cnvbird    时间: 2014-01-15 19:48
[' [www.aa.com] 192.168.10.10', ' [mail.aa.com] 192.168.10.14', ' [db.aa.com] 192.168.10.17', ' [oa.aa.com] 192.168.10.19']
亲!满足你吗?
作者: xmchenb    时间: 2014-01-16 09:42
不用重复造轮子吧,2楼建议挺好
作者: liheng    时间: 2014-01-16 09:56
本帖最后由 liheng 于 2014-01-16 10:02 编辑

很感谢各位大神的热心帮助。这里我贴下我的解决方法:


#!/usr/bin/env python
# -*- coding:utf-8 -*-
file = open("log.log", 'r')
all_domain = []
new_domain= {}

while 1:
    line= file.readline()
    all_domain.append(line.strip('\n'))
    if not line:
        break
    pass
n = 0
for d in all_domain:
    n += 1
    if "]" in d:
        new_domain[d] = all_domain[n]

for(k,v) in new_domain.items():
    print k,v


思路大致是:先读到一个list里面,再遍历,如果某一个字符串是"]"结尾的,就取它以及它的下一个字符串,扔到一个dict里面

再次感谢大家的热帮助,谢谢!

作者: ssfjhh    时间: 2014-01-16 10:11
本帖最后由 ssfjhh 于 2014-01-16 10:12 编辑

再造个轮子。
  1. import os, re
  2. res_dict = {}
  3. regexdomain = re.compile(r'\[(?P<domain>.*)\]')
  4. regexip = re.compile(r'(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
  5. with open('log.txt', 'r') as f:
  6.     for line in f.readlines():
  7.         domain = regexdomain.search(line)
  8.         ip = regexip.search(line)
  9.         if domain:
  10.             key = domain.group('domain')
  11.         elif ip:
  12.             res_dict.setdefault(key, ip.group('ip'))

  13. print(res_dict)
复制代码

作者: TasteOracle    时间: 2014-01-16 10:47
回复 1# liheng
  1. [root@source ~]# awk -v RS="\n\n" '{gsub(/\[|\]/,"",$1);print $1"\t"$2}' file
  2. www.aa.com        192.168.10.10
  3. mail.aa.com        192.168.10.14
  4. db.aa.com        192.168.10.17
  5. oa.aa.com        192.168.10.19
复制代码

作者: cnvbird    时间: 2014-01-16 11:38
高手!!!!
作者: ssfjhh    时间: 2014-01-16 14:22
回复 8# TasteOracle


    擦,一行搞定,这是来砸场子的吗?
作者: wang390750    时间: 2014-01-16 16:45
本帖最后由 wang390750 于 2014-01-16 16:50 编辑
  1. [root@localhost 桌面]# sed -rn '/\[.*\]/{N;s/\n/ /;s/\[|\]//g;p}' file
  2. www.aa.com 192.168.10.10
  3. mail.aa.com 192.168.10.14
  4. db.aa.com         192.168.10.17
  5. oa.aa.com         192.168.10.19
复制代码
正在学习python,还不会处理,先来个sed的。
作者: reyleon    时间: 2014-01-17 13:54
  1. awk 'BEGIN{RS="\n\n";FS="\n"}{$0=$1"\t"$2}1' file
复制代码

作者: reyleon    时间: 2014-01-17 13:56
  1. sed -n '/\[/{N;s/\n/ /;p}' file
复制代码
@wang390750
作者: 没够的Python    时间: 2014-01-20 17:53
都是高手哇,学习了。
作者: liheng    时间: 2014-01-20 21:36
呵呵。。。。没想到一个话题引出来这么大神,真是受教了。
这其实也证明了awk 与sed 对于文本处理的功能真是非常强大 ,没有做不到,只有想不到。
作者: mode1943    时间: 2014-01-22 14:07
如果是ini文件的话 直接使用configparser模块




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2