awkでのgsubを使った文字列置換(正規表現)
まえおき
bashなどのシェルスクリプトで、lsした結果とかをつかってファイルを集計したいときってありますよね。
そのときに、同じ種類のファイルをまとめて、ユニークにしたいときとかってありますよね(ソースはわい)
変数の置換(${AAA/BEF/AFT})でもできたりするんですが、より汎用的にやりたいので、今回はawkを使って実装したいとおもいますよ。
awkは慣れないとぶっちゃけ使いづらいんですが、パターンさえおぼえればわりと使えるので、使い方のひとつとして特にインフラ系を取り扱うエンジニアは知っておいたほうがよいかと思いますです。
準備
適当な場所にファイルをつくります。
今回の例は、ログファイルてきなものが分割されて出力されている環境で、ログファイルが何種類でているかを集計したいというタスクをなんとかするやつです。
000の部分は000-999くらいの範囲でスケールしても大丈夫なようにつくります。
1 2 3 4 5 6 7 |
$ touch aiueo_000.txt $ touch aiueo_001.txt $ touch aiueo_002.txt $ touch kakikukeko_000.txt $ touch kakikukeko_001.txt $ touch kakikukeko_002.txt |
作成
まずはls
1 2 |
$ ls aiueo_000.txt aiueo_001.txt aiueo_002.txt kakikukeko_000.txt kakikukeko_001.txt kakikukeko_002.txt |
こんなかんじでls結果が表示されます。
これを加工していきます。
awkを適用
1 2 3 4 5 6 7 |
$ ls | awk '{print $1}' aiueo_000.txt aiueo_001.txt aiueo_002.txt kakikukeko_000.txt kakikukeko_001.txt kakikukeko_002.txt |
とりあえず、枠だけつくります。
入ったものをそのまま出すだけのawkです。
数字の部分を置換
1 2 3 4 5 6 7 |
$ ls | awk '{gsub(/[0-9]+\./, ".", $1);print $1}' aiueo_.txt aiueo_.txt aiueo_.txt kakikukeko_.txt kakikukeko_.txt kakikukeko_.txt |
printの前に、0-9の繰り返し+"."にマッチしたら、"."に置換する処理を組み込みました。
数字の部分が消えて、同じ種類のログをまとめられるようになりました。
わざわざ、ドットまで置換対象にしている理由は、ログ名称に数値が含まれる場合はふつうにあるので、その部分を消さないようにするためです。
場合によっては、.txtまでを置換対象にしてもいいですし、そのあたりは自由にやるといいともいます。
集計する
1 2 3 |
$ ls | awk '{gsub(/[0-9]+\./, ".", $1);print $1}' | sort | uniq aiueo_.txt kakikukeko_.txt |
あとは、ソートしてユニークをとれば完了です。
ソートしているのは、ファイル名の順番がぐちゃぐちゃでも対応できるようにしているだけです。
あとは、wc -lとかしてカウントとってもいいですし、なんか別なことしてもいいと思います。
awk内で集計しちゃう方法もあるのですが、配列つかったりする必要があって面倒なので今回はやってないです。
タイムスタンプの最初と最後出したいとか、細かい集計要件があればawkの中で集計するほうが楽です。
今回は簡単にやりたかったので、そのあたりは別記事でやろうかとおもいます。(気が向いたとき)
ということでおわります。
スポンサードリンク
関連記事
-
[bash] grep・egrepコマンド
基本パターン ファイル中の文字列を検索 $ grep '[検索したい文字列]' 検索対象ファ
-
[bash] bash入門1
こんにちは、今回はbash入門ということで、全く知らない状態からbashを触ってみます。 一応
-
bashで並列処理する方法(xargs)
並列処理とは 通常、意識せずにプログラムを書くと、大体の場合はシングルプロセスの動作をするプ
-
[bash] cronでログインシェル(.bash_profile)の環境変数などを読み込ませる
こんにちは、今回もメモ。 cronでシェルを実行する際、普通にコマンドを書くと、ログインシェル
-
[bash] 文字列の分割(split処理)
bashで文字列をsplitする方法を紹介します。 例えば、以下の文字列をカンマ区切りでspl
-
[cron] dateコマンドをcronに書くときの注意点
dateコマンドの引数をcronにそのまま書くと怒られることへのメモ。 そのまま、
-
[bash] 文字列長を調べる
bashで変数に入っている文字列長を調べるときは以下のようにする。 ${#変数名} ●実
-
[bash] ファイルの中身を1行ずつ処理するループ処理(while文)
ファイルの中身を1行ずつ処理したい場合の処理です。 ファイル名を引数にとります。 #
-
[bash] if文の書き方
if文の書き方をメモります。 ●構文 ※カッコ([])と条件式の間のスペースが無いとエラーに
-
[bash] bash入門2 - viの使い方・代表的なコマンド一覧
こんにちは、今回はbash入門2としてviエディタの使い方を説明します。 bashの事始めはこ
スポンサードリンク
- PREV
- bashで並列処理する方法(xargs)
- NEXT
- CentOSにdockerをインストールしてみた