1

私はapacheログからたくさんの時間を持っています...

96.99.193.124 - - [10/May/2012:22:59:29 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.124 - - [10/May/2012:22:59:56 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.125 - - [10/May/2012:22:59:56 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.125 - - [10/May/2012:23:00:00 +0000] 0 "GET / " 200 123 "-" "-"
96.29.193.125 - - [10/May/2012:23:00:00 +0000] 0 "GET / " 200 123 "-" "-"

日付のタイムスタンプを引き出すには、次のようにします。

sed -e 's;^.*\(\[.*\]\).*$;\1;' inputFileName > outputFileName

それは私に

[10/May/2012:22:59:29 +0000]
[10/May/2012:22:59:56 +0000]
[10/May/2012:22:59:56 +0000] 
[10/May/2012:22:59:56 +0000]
[10/May/2012:23:00:00 +0000] 
[10/May/2012:23:00:00 +0000]

秒の部分と角かっこと秒を削除して、次のようにします。

10/May/2012:22:59 
10/May/2012:22:59 
10/May/2012:22:59 
10/May/2012:23:00
10/May/2012:23:00

元のファイルから...ヒントはありますか?

4

7 に答える 7

2

これを試して

sed -e 's;^.*\[\([^+]*\).*\].*$;\1;' 

説明:

1-ブラケットをグループの外に置きます2-そして+何かを外に置きます

そしてそれは行われます。

于 2012-05-11T14:18:29.283 に答える
2

なぜだけではないのですか

 echo '96.99.193.124 - - [10/May/2012:22:59:29 +0000] 0 "GET / " 200 123 "-" "-""' \
 | sed 's/^.*\[//;s/ .*$//;s/...$//'

出力

10/May/2012:22:59

説明

       96.99.193.124 - - [10/May/2012:22:59:29 +0000] 0 "GET / " 200 123 "-" "-""'
      ^........pt1.......[                    ...............pt2.................$
                                           :.. (pt3)

各部分は余分な文字列の1つのチャンクを排除します

 pt1 s/^.*\]\[// 
     match/deletes everything up to the first [. 
     I use to `\[' to escape the normal meaning of that char in sed 
       as the beginning of a character class, i.e. `[a-z]` (for 1 example)
 pt2 s/ .*$//
     match/deletes everything from the first space char to the end of the line
 pt3 s/...$//
     match/deletes the last 3 chars form the end of the line.

でそれを思い出してくださいsed

  1. 's / matchpattern / replacepattern/'と最初の's'=置換は、利用可能な主要なツールの1つです。
  2. 正規表現の^charは、マッチングを行の先頭に固定します
  3. $ charは、正規表現の一致を行の終わりに固定します。

pt1だけを実行し、次にpt2、次にpt3を追加して、何が達成されているかを簡単に確認する必要があります。

これがお役に立てば幸いです。

于 2012-05-11T14:23:02.047 に答える
2

これはあなたのために働くかもしれません:

sed 's/.*\[\(.*\):.*/\1/' file

あなたはあなたの利点に貪欲を使うことができます、すなわち\(.*\):最後の前にすべてをつかみます:

于 2012-05-11T14:38:43.127 に答える
2
sed -e 's;^.*\[\(.\{17\}\).*\].*$;\1;'

このバージョンでは、開始ブラケットを検索し、抽出されたグループに次の17文字(対象の文字列)を明示的に含めます。

于 2012-05-11T14:39:59.270 に答える
1
sed 's/.*\[//;s/:.. .*//' infile > outfile

[の前に削除し、次に空白から削除します。2つのコマンド。

于 2012-05-11T14:51:41.337 に答える
1

別の方法grep -oP

grep -oP "\[\K[^\]\[ ]+" FILE

-Pgrepにスイッチがない場合は、試してくださいpcregrep

于 2012-05-11T14:22:38.757 に答える
1

パターンは次のとおりです。

\[(\d+/\w+/\d+:\d+:\d+)

ブラケットはアンカーとして使用されます。ここのマッチャーは非常に一般的です。たとえば、月は\w+文字または数字を含む任意の単語に一致するを使用してキャプチャされますが、その種類のApache行に対してこの順序を使用して結合されたすべてのマッチャーは、堅牢なパターンを提供します。

このパターンはライン全体で使用するため、最初にブラケット内のパーツをキャプチャする必要はありません。必要な最終的なデータをキャプチャするだけです。

于 2012-05-11T14:24:02.500 に答える