• このエントリーをはてなブックマークに追加

【linux豆知識】awkの便利な使い方:grep的に使う

  • このエントリーをはてなブックマークに追加

awk

zaco muraです。
サーバエンジニアになりたての頃、CLIで淀みなくコマンドを打って思い通りに使いこなす人がかっこいいと思っていました。中でも、awkを使いこなす人は特にすごいイメージがありました。(コマンドが直感的にわかりづらいので、”何やってんのかわかんないけど、なんかすごい!”的なすごさがあった)

そんなawkも少し使いこなせるようになってきて、最近ではその便利さに助けられています。今回はそんなawkの便利な使い方を1つ紹介します。

背景

ログ解析を行う人は、必ず”必要な行を抜き出すこと”と”必要なカラム(行の中の1部分)を抜き出すこと” を行うかと思います。そして、前者はgrep、後者はawkのように使い分けている方がいるかと思います。(私はそうでした)
こんな感じで↓

$ cat file1.txt
aaaa bbbbb cccc
dddd eeeee fffff

# 上の例で、"fffff"だけを抜き出したい場合、
$ grep "fffff" file1.txt | awk '{print $3}'
fffff

この書き方は何をやっているかイメージしやすいので良い点もありますが、膨大なログの処理では非常に遅くなってしまいますし(grepで全行を走査し、更にawkでもgrepの結果を全走査するので)、何よりコマンドが長くなってカッコ悪い。

実はawkだけでできます

こういった場合、実はawkだけでやりたいことが実現できます。
具体的には、”必要な行を抜き出すこと”はawkでもできるんです。

# "fffff"がある行だけを抜き出す
$ awk '$0~/fffff/{print $0}' file1.txt
dddd eeeee fffff

# 先程の例と同じで3カラム目だけを表示
$ awk '$0~/fffff/{print $3}' file1.txt
fffff

解説すると、awkはざっくり言うと1:条件を指定する部分2:処理を指定する部分 に分かれています。(本当はもうちょっと複雑ですが、それはまた別の機会に)
コマンドで示すと、

$ awk ‘$0~/fffff/{print $3}’ file1.txt

のようになります。

もう少し1:条件を指定する部分について説明すると、

$0 : 対象のカラム
~// : 正規表現(この場合では部分一致にしたかったので)
fffff : 検索対象の文字列

という内容になっています。

まとめると

awkを使うと柔軟かつ軽量にテキスト処理をすることができますので、とっつきづらいですが勉強する価値はあるかと思います。
他にも便利な使い方がありますので、また今度書こうと思います。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link