さわらブログ

さわら(@xhiroga)の技術ブログ

初めてのsedとawk

会社の若手勉強会でsedawkを勉強した。なんだこれ!めっちゃ便利じゃん!
あとで見返す用にメモ。

sedawkとは

文字列操作に特化したプログラミング言語。シェルから直接実行できて便利!プログラムをファイルとして外部定義することもOK。
文字列をマッチ → 操作 という書き方が共通している。エディタを開かなくても単純なファイル操作ができて嬉しい。

sed

文字列の置換に便利で、例えば空白区切のログをCSVファイルにするときに使ったりするそうだ。

コマンド

$ cat fishlist
Maguro, Tuna
Sake, Salmon
Katsuo, Bonito

$ sed 's/a/A/' fishlist
MAguro, Tuna
SAke, Salmon
KAtsuo, Bonito

sはsubstitute(置換)の略!

便利な使い方

-fコマンドでファイルに定義したsedプログラムを実行できる

$ vi a2A
s/a/A/g

$ sed -f a2A fishlist
MAguro, TunA
SAke, SAlmon
KAtsuo, Bonito

現場では、sedまで含めてシェルスクリプトにする → sed部分だけを外部ファイルにする、という使い方をしてる(発表者談)

パイプで処理を繋げられる

$ cat fishlist | sed 's/a/A/g' | sed 's/o/O/g' | sort

KAtsuO, BOnitO
MAgurO, TunA
SAke, SAlmOn

こういう複数の変換をかますスクリプト書くときって逐次で結果を確認したいと思うんだけど、シェルだとそれが便利にできる!良い! でかいファイルの場合はheadをかませば良さそうだ。

$ head -2  fishlist | sed 's/a/A/g'| sed 's/o/O/g' | sort
MAgurO, TunA
SAke, SAlmOn

catがわり

$ sed '' fishlist
Maguro, Tuna
Sake, Salmon
Katsuo, Bonito

これ役に立つ?笑

エディタを開かなくて良い

sedは入力ファイルを一行づつ処理するので、テキストエディタに全部を読み込む必要がない!素晴らしい!
でかいログの処理に便利そうだ。

awk

CSVのような構造化されたファイルの処理に強い。
ログを一部だけ出力したい時なんかに便利そうだ。

コマンド

マッチ部と操作の組み合わせを渡す。すごいのが、デフォルトで空白を文字列の区切りとして認識してくれること!
だから操作部で$1(マッチ行の一つ目の要素)みたいなことができるのだ。

$ awk '/u/ {print $1}' fishlist
Maguro,
Katsuo,

ちなみに$0で行全体。

$ awk '/u/ {print $0}' fishlist
Maguro, Tuna
Katsuo, Bonito

便利な使い方

-Fオブションで区切文字を変えられる。

$ awk -F ',' '/u/ {print $2}' fishlist
 Tuna
 Bonito

ログ編集で詰んだことがあったんで、現場で使えて便利だなーと思いました。