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 编辑
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
ret_list = []
flag = False
with open('log.txt', 'r') as f:
my_str = ''
for line in f.readlines():
if re.search(r'^\[.*\], line):
flag = False
my_str += ' ' + line.strip()
else:
if not flag:
my_str += ' ' + line.strip()
flag = True
ret_list.append(my_str)
my_str = ''
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 编辑
再造个轮子。
import os, re
res_dict = {}
regexdomain = re.compile(r'\[(?P<domain>.*)\]')
regexip = re.compile(r'(?P<ip>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
with open('log.txt', 'r') as f:
for line in f.readlines():
domain = regexdomain.search(line)
ip = regexip.search(line)
if domain:
key = domain.group('domain')
elif ip:
res_dict.setdefault(key, ip.group('ip'))
print(res_dict)
复制代码
作者:
TasteOracle
时间:
2014-01-16 10:47
回复
1#
liheng
[root@source ~]# awk -v RS="\n\n" '{gsub(/\[|\]/,"",$1);print $1"\t"$2}' file
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
复制代码
作者:
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 编辑
[root@localhost 桌面]# sed -rn '/\[.*\]/{N;s/\n/ /;s/\[|\]//g;p}' file
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
复制代码
正在学习python,还不会处理,先来个sed的。
作者:
reyleon
时间:
2014-01-17 13:54
awk 'BEGIN{RS="\n\n";FS="\n"}{$0=$1"\t"$2}1' file
复制代码
作者:
reyleon
时间:
2014-01-17 13:56
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