次の問題を想像してみてください。標準のApacheログがあります。特定のキーワードを含むリクエストURLをフィルタリングしたいです。とても簡単です。
$ grep "keyword" somedomain-access.log
これはうまく機能しますが、十分に強力ではありません。つまり、100% 必要に応じて動作しません。キーワードが「GET」であると仮定すると(ウェブサイトに応じて)、ほぼすべての行がgrepコマンドと一致します。
次のような前処理を行います。
$ cut -d" " -f['i'th field containing the url] somedomain-access.log |
grep "keyword"
これはもう少しうまくいきますが、今ではすべてのコンテキスト情報、つまりコマンドで削除した他のフィールドを失いますcut
。
今、この問題は私をますます悩ませています。もちろん、この特定のケースではawkを使用できますが、一般的に一般的なケースではコマンドだけではawk
不十分です。
シェル以外の言語では、オブジェクトのメンバーを確認して操作を実行するだけです。 Scalaで使用されているApacheロギングの例を再利用すると、
> // Preprocessed list of apache log into `records`
> val records = List(AccessLogRecord(...), AccessLogRecord(...), ...)
> val recordsWithKeyword = records.filter(_ => _.request == "keyword")
結果はまだリストであり、各エントリ(この場合はAccessLogRecord)には、日付、HTTPコードなどのすべてのコンテキスト情報が含まれています。
たとえば、特定のアプリケーションに依存せずにパイプ、リダイレクトなどを使用してコマンドラインで同じことを行うにはどうすればよいですかawk
?