無効な行を含まないログファイルからクエリを抽出する

無効な行を含まないログファイルからクエリを抽出する

次のようなログファイルがあります。

query1 startQuery
query1 do something
query1 do something else
query2 startQuery
query1 do something banned
query2 do something
query3 startQuery
query2 endQuery 1000
query3 something else to do
query1 endQuery 2003
query3 do something
query4 startQuery
query4 endQuery 100
query3 endQuery 1434

私が見つけた最も長い実行クエリは次のとおりです。

> grep "endQuery" logfile | awk '{print $3 " " $1}' | sort -nr | head -n 3
2003 query1
1434 query3
1000 query2

しかし、一部のタスクは時間がかかることが知られており、最も長く実行されるクエリを探しています。欲しくない次の操作が含まれます。たとえば、ログ行に「banned」という単語が含まれていない最も長い実行クエリを探したいとします。

この例では、次のように出力されます。

1434 query3
1000 query2
100 query4

実際、これらのログファイルにはサイズが大きく、多数のクエリが含まれます。

ベストアンサー1

grepまず、呼び出しが必要ないことに注意してください。awk呼び出しにシームレスに統合されます。

<logfile awk '/endQuery/ {print $3 " " $1}'

awk フェーズで禁止されたクエリをフィルタリングできます。進行中のクエリを配列に保存し、禁止されている場合は削除し、禁止されていないクエリのみを印刷します。

<logfile awk '
    $2 == "startQuery" {q[$1]=1}        # store the names of active queries
    q[$1] && /banned/ {delete q[$1]}    # delete banned queries
    $2 == "endQuery" {
        if (q[$1]) print $3, $1;        # only report non-banned queries
        delete q[$1];
    }
' | sort -nr | head -n 3

おすすめ記事