このファイルをどのように切り取って、特定の部分の固有の単語を見つけるのかわかりません。

このファイルをどのように切り取って、特定の部分の固有の単語を見つけるのかわかりません。

したがって、access_logというアクセスログエントリファイルがあり、Webサーバーからアクセスされたすべての一意のファイルを見つける必要があります。 access_log の形式は次のとおりです。これは単なる抜粋です。

66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /robots.txt HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /~robert/class2.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:30:19 -0600] "GET /~robert/class3.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
202.46.61.93 - - [14/Dec/2015:09:07:34 -0600] "GET / HTTP/1.1" 200 5208 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"

これらのファイル(たとえば、最初の「robots.txt」)は、GET、HEAD、またはPOSTワードの後に​​あります。区切り文字としてcutコマンドを使ってみましたが、うまくいきませんでした。ファイルを比較するためにフィールドを区切る方法を知りません。

編集:見つけました。 @ MichaelHomerさんが正しいです。私の構文が間違っているため、cutは機能しません。私はスペースを区切り記号として使用し、効果がありました。

ベストアンサー1

以下はあなたが提供した例の練習です。

awk指定できる列と行を印刷します。manその他の参考資料については、このページとGoogleを確認することをお勧めします。あなたの場合、区切り文字は各列を区切るスペースです。これまでに提供した内容によって、各行に異なるテキストが含まれているため、列の位置が異なるため、異なる場合がありますが、最初の3行の場合は次のように開始できます。

cat access_log | awk 'NR==1,NR==3 {print $7}' | sort -u

NR==1,NR==31〜3行を印刷してください。

{print $7}必要なファイル名である7番目の列を印刷します。各行のテキストが異なる場合があるため、常に7番目の列になるわけではありません。

sort -u一意の値を出力

出力は次のとおりです

/robots.txt
/~robert/class2.cgi
/~robert/class3.cgi

最後の部分はsort冗長性がないため、例に違いはありませんが、ファイルの残りの部分がそうである場合は、その特定の列の固有値のみを印刷します。

ファイル名のみを印刷するには、次のコマンドでパラメータを使用できますsubstrawk

cat access_log | awk 'NR==1 {print substr($7,2,10)} NR==2,NR==3 {print substr($7,10,10)}'

出力は次のとおりです。

robots.txt
class2.cgi
class3.cgi

説明する:

NR==1 {print substr($7,2,10)}フィールド 7 の最初の行の場合、位置 2 から始まり、10 文字が印刷されます。

NR==2,NR==3 {print substr($7,10,10)}フィールド7の2番目から3番目の行は10番目の位置から始まり、10文字が印刷されます。

ファイルの残りの部分は異なる場合があり、常に同じ位置にソートされていないため、列と値を変更する必要があるかもしれませんが、これは開始されます。時間がかかるように見えるかもしれませんが、調査すると正しい方向に行くことができます。

おすすめ記事