我同意@ jan-steinman的观点,您应该将数据库用于此类任务。如其他答案所示,有很多方法可以将解决方案与shell脚本结合在一起,但是如果您要使用和维护代码的时间超过任何时间,那么这样做会导致很多痛苦。只是一个为期一天的一次性项目。
假设您在Linux机器上,则很可能默认情况下安装了Python,其中包括自Python v2.5起的sqlite3库。您可以使用以下方法检查Python版本:
% python -V
Python 2.7.2+
我建议使用sqlite3库,因为它是所有平台(包括Web浏览器内部!)都存在的基于文件的简单解决方案,并且不需要安装服务器。本质上是零配置和零维护。
下面是一个简单的python脚本,它将解析您作为示例给出的文件格式,然后执行一个简单的“全选”查询并输出存储在数据库中的所有内容。
#!/usr/bin/env python
import sqlite3
import sys
dbname = '/tmp/simple.db'
filename = '/tmp/input.txt'
with sqlite3.connect(dbname) as conn:
conn.execute('''create table if not exists people (key integer primary key, name text, job text)''')
with open(filename) as f:
for key in f:
key = key.strip()
name = f.next().strip()
job = f.next().strip()
try:
conn.execute('''insert into people values (?,?,?)''', (key, name, job))
except sqlite3.IntegrityError:
sys.stderr.write('record already exists: %s, %s, %s\n' % (key, name, job))
cur = conn.cursor()
# get all people
cur.execute('''select * from people''')
for row in cur:
print row
# get just two specific people
person_list = [1358726575123, 9973834728345]
cur.execute('''select * from people where key in (?,?)''', person_list)
for row in cur:
print row
# a more general way to get however many people are in the list
person_list = [1358726575123, 9973834728345]
template = ','.join(['?'] * len(person_list))
cur.execute('''select * from people where key in (%s)''' % (template), person_list)
for row in cur:
print row
是的,这意味着您需要学习一些SQL,但是从长远来看,这是值得的。另外,除了解析日志文件之外,您还可以将数据直接写入sqlite数据库。