一致する2つのパターン間の行数が必要です。

一致する2つのパターン間の行数が必要です。

私の入力は次のとおりです -

[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:43 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 200 - 7
[11/Jul/2016:13:40:47 +0000] "POST --" 500 - 7
[11/Jul/2016:13:41:48 +0000] "POST --" 200 - 7
[11/Jul/2016:13:41:49 +0000] "POST --" 500 - 7
[11/Jul/2016:13:42:12 +0000] "POST --" 500 - 7

13:40から13:41までの行数を入力したいです。この場合、カウントは6です。

私は次のオプションを試しました

echo sed -n '/^START_TIME/,/^END_TIME/ p' somelogfile.log | wc -l

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l

しかし、私はいつも1を取得します。

誰かがこれを確認し、ここで何が間違っているかを教えてもらえますか?

答え1

echo1行だけが生成され計算されますwc

終了タイムスタンプが存在せず、13:41:43使用されるアンカー(^および)$が制限されすぎます。

echo以下を削除してみてください。

sed -n '/13:40:43/,/13:41:49/p' somelogfile.log | wc -l

答え2

年代順が語彙順と等しい場合は、次のことができます。

awk '$0>="[11/Jul/2016:13:40:00" && $0<="[11/Jul/2016:13:41:59"' file | wc -l

これにより、値が最初の日付以上で、2番目の日付以下かどうかを確認します。awkコマンドが与えられない場合、その行だけがawk印刷されます。

答え3

このコマンドを見てみましょう。

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
  • echoパイプを通して何が行われ、何が進行するのか考えてみましょうwc(ただしないでくださいwc)。これはあなたがいつも1つを得る理由を説明します1

  • 作成した正規表現は行の先頭^と末尾に固定されていますが、$もちろんそのタイムスタンプだけが行にあるわけではないので、アンカーを削除する必要があります。

  • 終了条件は、例に存在しないタイムスタンプを探すため、一致範囲が終了せず、最初の一致から始まり、すべてが印刷されます。

このようなものが望むことができます(3現在の質問に表示されている入力ファイルを使用して出力)

sed -ne '/13:40:47/,/13:41:48/p' somelogfile.log | wc -l

関連情報