16

サーバー ログから「 GET 」クエリを取得したいと考えています。

たとえば、これはサーバーログです

1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:32:27] code 404, message File not fo$
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:32:27] "GET /hello HTTP/1.1" 404 -   
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:41:57] code 404, message File not fo$
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:41:57] "GET /ss HTTP/1.1" 404 -

単純なgrepまたはawkで試してみると、

Adi:~ adi$ awk '/GET/, /HTTP/' serverlogs.txt

それは与える

1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:32:27] "GET /hello HTTP/1.1" 404 -
1.0.0.127.in-addr.arpa - - [10/Jun/2012 15:41:57] "GET /ss HTTP/1.1" 404 -

表示したいだけです:helloss

これを行う方法はありますか?

4

6 に答える 6

20

gnu grep があると仮定すると、perl スタイルの正規表現を使用して肯定的な後読みを行うことができます。

grep -oP '(?<=GET\s/)\w+' file

gnu grep がない場合は、sed のみを使用することをお勧めします。

sed -n '/^.*GET[[:space:]]\{1,\}\/\([-_[:alnum:]]\{1,\}\).*$/s//\1/p' file

たまたま gnu sed をお持ちの場合は、大幅に簡略化できます。

sed -n '/^.*GET\s\+\/\(\w\+\).*$/s//\1/p' file

ここでの結論は、これを達成するためにパイプは確かに必要ないということです。 grepまたはsed単独で十分です。

于 2012-06-10T19:58:56.540 に答える
11

この場合、ログ ファイルには既知の構造があるため、1 つのオプションはcut7 番目の列を引き出すために使用することです (フィールドはデフォルトでタブで示されます)。

grep GET log.txt | cut -f 7 
于 2012-06-10T19:43:40.553 に答える
4

grep を使用する場合は、パイプを使用します。

grep -o /he.* log.txt | grep -o [^/].*
grep -o /ss log.txt | grep -o [^/].*

[^/] は、grep 出力から ^ 記号の後の文字を抽出することを意味します

于 2014-03-07T04:06:22.310 に答える
2

多くの場合、単一の複雑な正規表現よりもパイプラインを使用する方が簡単です。これは、提供したデータで機能します。

fgrep GET /tmp/foo | 
    egrep -o 'GET (.*) HTTP' |
    sed -r 's/^GET \/(.+) HTTP/\1/'

このパイプラインは次の結果を返します。

hello
ss

仕事を成し遂げる方法は確かに他にもありますが、これは提供されたコーパスで明らかに機能します。

于 2012-06-10T19:51:15.830 に答える