ライオン :
私は、次の形式の行数とアクセスログを持っています:
1.2.3.4:443 - - [11/Mar/2020:09:41:05 +0100] RESPONSE_CODE:[200] AGE: [-] CACHE_MISS: [-] CACHE-STATUS: [-] SIZE: [1288] RESPONSE_TIME: [2/2125012] (microseconds) WAS:[was.internal:9444] "PUT /kudosboards/node/a8740540-801a-43a6-822a-d58a2424fd3f HTTP/1.1" 200 REFERER: "https://ihs.internal/kudosboards/"
私はちょうどので、この例では、応答時間を取得したいです2/2125012
。私の考えは、他のグループにその前/後の正規表現グループの括弧の内容と一致するパターン、およびすべてのものを書くことでした。だから、僕はこの値で行全体を置き換えることができます:
^(.*)RESPONSE_TIME: \[([^\]]+)(.*)$
使用101regexを例入力文字列で、それが予想されるように、第2グループとして``私gavae:
Group 2 2/2125012
で、このパターンを使用するにはegrep
、私はこのようなブラケットをエスケープ:
$ sed 's#^\(.*\)RESPONSE_TIME: \[\([\^\]]+\)\(.*\)$#\2#g' testfile
1.2.3.4:443 - - [11/Mar/2020:09:41:05 +0100] RESPONSE_CODE:[200] AGE: [-] CACHE_MISS: [-] CACHE-STATUS: [-] SIZE: [1288] RESPONSE_TIME: [2/2125012] (microseconds) WAS:[was.internal:9444] "PUT /kudosboards/node/a8740540-801a-43a6-822a-d58a2424fd3f HTTP/1.1" 200 REFERER: "https://ihs.internal/kudosboards/"
なぜ何も交換していませんか?私はエスケープ(
と[
。
角括弧とは何かを持っているようです。
$ sed 's#^\(.*\)RESPONSE_TIME: \[\(.*\)\] (micro\(.*\)$#\2#g' testfile
2/2125012
これが働いていました。しかし、これらのパターンは非常に具体的ではありません。私は、例えばを持っていることによってそれをより具体的に作りたい[0-9]+/[0-9]+
の代わりに、括弧内のパターンのための(.*)
ワイルドカードパターン。
Wiktor第Stribiżav:
あなたのパターンはPOSIX BRE / EREの使用に関連する問題が含まれています:[\^\]]+
どちらかである文字と一致する^
か]
して、+
CHAR(デモ)。あなたは使用する必要があります*
(一致する0回以上の出現に)の代わりに+
、または\+
GNUでsed
、または\{1,\}
一般的なPOSIX BREに。
あなたは固定してもよいsed
使用してコマンドを
sed -n 's#.*RESPONSE_TIME: \[\([^]]*\).*#\1#p' testfile
参照してくださいオンラインsed
デモを。
細部
-n
デフォルトのライン出力を-suppresses.*RESPONSE_TIME: \[\([^]]*\).*
-任意の0+文字、一致してRESPONSE_TIME:
、スペース、[
グループ1には、キャプチャ以外の任意のゼロ個以上の文字を]
、その後、残りの文字列にマッチします\1
- グループ1の値との一致を置き換えp
- 置換の結果を出力します。