シェルで正規表現使って、ほしい箇所をキャプチャしたい時

Mac keyborad 20131101

apacheのログをチョットだけ解析したい時、とかがよくある。

ログの集計とかは日々のバッチで仕込んであるけど、たまに
「あ、今日のアクセスで○○の要素で一番おおいヤツなんだろう・・」とかとか。
まぁ本当はアナリティクスとかで予め確認できるようにすべきなのでしょうが、、 力技でササっと見たい時よくある。

よくあると言いつつも、半年に一回くらいの頻度なもんだからsedの使い方とかよう忘れるんですね。
ていうわけで戒めエントリー

sedを使おう

いつもgrepで気合いでなんとかなるけども、同じ行内でも正規表現でマッチングさせて必要な箇所だけ抜き出したい。
例えばリクエストパラメータの中でも必要な要素の集計とかとか。

他にもイケてる方法があれば是非教えていただきたいのですが、自分はsedでやる。

ポイントは、キャプチャしたい箇所の周りの()をバックスラッシュで囲う
sedの右側のエリアはバックスラッシュ+キャプチャしたい()の番号の箇所=

例)
$ grep ‘XXX’ /usr/local/apache/logs/access.log.YYYYMMDD | awk -F ‘”‘ ‘{print $4}’ | sed -e ’s/?XXX=\([^&]*\)&.*/\1/’

基本形は s/ / / で、意味は s/正規表現/置換文字/ てゆー
複数マッチする場合は s/ / /g
複数マッチするけど指定の番号のものだけ置換したい場合は s/ / /n (n:整数)

上のパタンだと、アクセスログのリクエストURLの中で最初に出てくるパラメータのXXX=valueを抜く

前の文字数と後ろの文字数が固定だったら削除っていう手も

たとえば以下だと、前から3文字を削除する。
正規表現の最初に「行頭マッチ」の ^ を入れるのがポイント

出力 | sed -e “s/^.\{3\}//”

で、こっちだと後ろ3文字を削除する。
正規表現の最後に「行末マッチ」の $ を入れるのがポイント

出力 | sed -e “s/.\{3\}$//”

そんな感じです

 

最近マクドナルド食べてないです。
年取ったからなのかしらないけど、全然マック行く気おきない。
毎日Macは使うけども。 おやすみなさい。

2013-11-03 | Posted in サーバー小ネタ(Linux)No Comments » 


関連記事

Comment





Comment



*