sedのではbashの行の正規表現と削除残りのちょうど特定のグループを表示します

ライオン :

私は、次の形式の行数とアクセスログを持っています:

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 - 置換の結果を出力します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=281118&siteId=1