Concordo com @ jan-steinman que você deve usar um banco de dados para esse tipo de tarefa. Há muitas maneiras de hackear uma solução com um script de shell, como as outras respostas mostram, mas fazê-lo dessa maneira levará a muita miséria se você for usar e manter o código por qualquer período de tempo maior que apenas um projeto de lançamento de um dia.
Supondo que você esteja em uma caixa do Linux, provavelmente você instalou o Python por padrão, o que inclui a biblioteca sqlite3 a partir do Python v2.5. Você pode verificar sua versão do Python com:
% python -V
Python 2.7.2+
Eu recomendo usar biblioteca sqlite3 porque é uma solução simples baseada em arquivo que existe para todas as plataformas (incluindo dentro do seu navegador da Web!) e não requer que um servidor seja instalado. Essencialmente, configuração zero e manutenção zero.
Abaixo está um script python simples que irá analisar o formato de arquivo que você deu como um exemplo e, em seguida, faz uma simples consulta "selecionar todos" e gera todos os resultados armazenados no banco de dados.
#!/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
Sim, isso significa que você precisará aprender um pouco de SQL , mas valerá a pena a longo prazo. Além disso, em vez de analisar seus arquivos de log, talvez você possa gravar dados diretamente no banco de dados sqlite.