1

次のような行を含む大きなログ ファイルがあります。

82.117.22.206 - - [08/Mar/2013:20:36:42 +0000] "GET /key/0/www.mysite.org.uk/ HTTP/1.0" 200 0 "-" "-"

そして、上記のパターンに一致する各行から、ip の82.117.22.206後にスペースとwww.mysite.org.ukそこからのテキストのみを抽出したいと考えています。IP とテキストは異なる場合があります。したがって、上記の行を指定すると、出力ファイルの行は次のようになります。

82.117.22.206 www.mysite.org.uk

出力ファイルに2つの同一の行が含まれないように、bashでgrepまたはその他のコマンドを使用して出力を一意にするにはどうすればよいですか? この種のシェル スクリプトについて詳しく学び始めるのに適した場所を紹介してもらえますか?

4

3 に答える 3

2

perlを使用すると、パーツをキャプチャできます

use strict;
use warnings;

if (m/^(\d+\.\d+\.\d+\.\d+)\s+-\s+-\s+\[.+?\]\s+\"GET\s+\/key\/0\/(.+?)\//) {
    print "$1 $2\n";
}

これを次のように呼び出します

perl -n script.pl logfile.txt | sort -u

これにより、必要なフィールドが抽出され、重複行が並べ替えられて削除されます。

于 2013-03-08T21:02:53.010 に答える
0

使用する正規表現がわかれば、次のようなことができます。

echo "Hello World" | grep "Hell" | sed 's/\(Hell\).*\(World\)/\1 \2/'

ただ、文字列をエコーする代わりに、ログを猫にします。

于 2013-03-08T21:07:23.400 に答える
0
grep -Po "^[\d.]*|[^/]*(?=/ HTTP)" file|sed 'N;s/\n/ /'
于 2013-03-08T21:12:17.673 に答える