1

私は、いくつかのbashスクリプトも使用して、Pythonで次のことをしようとしています。Python でもっと簡単な方法がない限り。

次のようなデータを含むログ ファイルがあります。

16:14:59.027003 - WARN - Cancel Latency: 100ms - OrderId: 311yrsbj - On Venue: ABCD
16:14:59.027010 - WARN - Ack Latency: 25ms - OrderId: 311yrsbl - On Venue: EFGH
16:14:59.027201 - WARN - Ack Latency: 22ms - OrderId: 311yrsbn - On Venue: IJKL
16:14:59.027235 - WARN - Cancel Latency: 137ms - OrderId: 311yrsbp - On Venue: MNOP
16:14:59.027256 - WARN - Cancel Latency: 220ms - OrderId: 311yrsbr - On Venue: QRST
16:14:59.027293 - WARN - Ack Latency: 142ms - OrderId: 311yrsbt - On Venue: UVWX
16:14:59.027329 - WARN - Cancel Latency: 134ms - OrderId: 311yrsbv - On Venue: YZ  
16:14:59.027359 - WARN - Ack Latency: 75ms - OrderId: 311yrsbx - On Venue: ABCD
16:14:59.027401 - WARN - Cancel Latency: 66ms - OrderId: 311yrsbz - On Venue: ABCD
16:14:59.027426 - WARN - Cancel Latency: 212ms - OrderId: 311yrsc1 - On Venue: EFGH
16:14:59.027470 - WARN - Cancel Latency: 89ms - OrderId: 311yrsf7 - On Venue: IJKL  
16:14:59.027495 - WARN - Cancel Latency: 97ms - OrderId: 311yrsay - On Venue: IJKL

各行から最後のエントリを抽出し、一意の各エントリを使用してすべての行を検索し、それが表示され、.csv ファイルにエクスポートする必要があります。

次の bash スクリプトを使用して、一意の各エントリを取得しましたdate +%Y%m%d。awk '{print $14}' | ソート | ユニーク

ログ ファイルの上記のデータに基づいて、bash スクリプトは次の結果を返します。

ABCD
EFGH
IJKL
MNOP
QRST
UVWX
YZ

ここで、同じログ ファイル内の各結果を検索 (または grep) し、上位 10 件の結果を返したいと思います。これを行う別の bash スクリプトがありますが、FOR ループを使用してこれを行うにはどうすればよいですか? したがって、x の場合、ここで x = 上記の各エントリは、

grep x LogFile_ date +%Y%m%d.msg.log | awk '{print $7}' | 並べ替え -nr | ユニーク | 頭 -10

次に、結果を .csv ファイルに返します。結果は次のようになります (各フィールドが別の列に表示されます)。

Column-A  Column-B  Column-C  Column-D  
ABCD        2sxrb6ab    Cancel    46ms  
ABCD      2sxrb6af  Cancel    45ms  
ABCD      2sxrb6i2  Cancel    63ms  
ABCD      2sxrb6i3  Cancel    103ms  
EFGH      2sxrb6i4  Cancel    60ms  
EFGH      2sxrb6i7  Cancel    60ms  
IJKL      2sxrb6ie  Ack       74ms  
IJKL      2sxrb6if  Ack       74ms  
IJKL      2sxrb76s  Cancel    46ms  
MNOP      vcxrqrs5  Cancel    7651ms  

私は Python の初心者で、大学時代 (13 年前) からあまりコーディングをしていません。どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

0

あなたが思うほど簡潔ではないかもしれません...しかし、これであなたの問題を解決できると思います。実際のデータにより適切に対処するために、いくつかの try...catch を追加します。

import re
import os
import csv
import collections

# get all logfiles under current directory of course this pattern can be more
# sophisticated, but it's not our attention here, isn't it?
log_pattern = re.compile(r"LogFile_date[0-9]{8}.msg.log")
logfiles = [f for f in os.listdir('./') if log_pattern.match(f)]

# top n
nhead = 10
# used to parse useful fields
extract_pattern = re.compile(
    r'.*Cancel Latency: ([0-9]+ms) - OrderId: ([0-9a-z]+) - On Venue: ([A-Z]+)')
# container for final results
res = collections.defaultdict(list)

# parse out all interesting fields
for logfile in logfiles:
    with open(logfile, 'r') as logf:
        for line in logf:
            try:  # in case of blank line or line with no such fields.
                latency, orderid, venue = extract_pattern.match(line).groups()
            except AttributeError:
                continue
            res[venue].append((orderid, latency))

# write to csv
with open('res.csv', 'w') as resf:
    resc = csv.writer(resf, delimiter=' ')
    for venue in sorted(res.iterkeys()):  # sort by Venue
        entries = res[venue]
        entries.sort()  # sort by OrderId
        for i in range(0, nhead):
            try:
                resc.writerow([venue, entries[i][0], 'Cancel ' + entries[i][1]])
            except IndexError:  # nhead can not be satisfied
                break
于 2013-04-02T09:26:20.690 に答える