ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

awkの簡単な操作まとめ

awkコマンドを調べつつ簡単な操作を勉強したのでまとめておきます。

awkコマンドとは

AWK(オーク)は、プログラミング言語の一つ。 テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。 UNIX 上で開発された。

※wikipediaから引用

コマンドというよりは、コマンドっぽく使えるプログラミング言語らしいです。

使い方

今回はls -lの結果からawkを使っていろいろ情報を抜き出してみます。*1

環境はこんな感じ、今回はDockerの適当なコンテナを使って検証してます。

[root@d4068927bf5f ws]# ls -l
total 8
-rw-r--r-- 1 root root  0 Jun 20 14:49 bar.js
-rw-r--r-- 1 root root 44 Jun 20 14:50 foo.txt
-rw-r--r-- 1 root root  0 Jun 20 14:49 fuga.rb
-rw-r--r-- 1 root root 60 Jun 20 14:50 hoge.txt

試しにhogeが含まれた行のみを抜き出してみます。

[root@d4068927bf5f ws]# ls -l | awk '/hoge/ {print $0}'
-rw-r--r-- 1 root root 60 Jun 20 14:50 hoge.txt

抜き出せました。

awkにはスクリプトを引数として渡します、/hoge/{print $0}がスクリプト部分です。

スクリプトは前後半で探し方を決める「パターン」と表示の仕方を決める「アクション」に分かれます。

awk 'パターン {アクション}'

上記のコマンドを例にとると/hoge/がパターンです、正規表現でhogeにヒットする行を探しています。

{print $0}の部分がアクションで、パターン部分でヒットした行をどうするかを記述します、$0がそのヒットした行全てを表すので、printで標準出力しています。

ちなみに、$0は省略ができ、printはデフォルトのメソッドなため、下記のように書いても動きます。

[root@d4068927bf5f ws]# ls -l | awk '/hoge/'
-rw-r--r-- 1 root root 60 Jun 20 14:50 hoge.txt

欲しい情報のみを抜き出してみる

次はタイムスタンプのみを抜き出してみます。

$0の部分を$[任意の数字]にするとヒットした行において、空白区切りで任意の順番を抜き出すことができます。$8の場合は8つ目なので、タイムスタンプが取れます。

[root@d4068927bf5f ws]# ls -l | awk '{print $8}'

14:49
14:50
14:49
14:50

# パターンと組み合わせる
[root@d4068927bf5f ws]# ls -l | awk '/hoge/ {print $8}'
14:50

# 複数の情報が欲しい時はカンマ区切り
[root@d4068927bf5f ws]# ls -l | awk '{print $8, $9}'

14:49 bar.js
14:50 foo.txt
14:49 fuga.rb
14:50 hoge.txt

$[任意の数字]はパターンでも使えるので、任意の行を検索対象にすることができます。

# グループが"root"のファイルを抜き出してみる
[root@d4068927bf5f ws]# ls -l | awk '$4 ~ /root/ {print $3}'
root
root
root
root

ざっと調べたところ、こんな風に欲しい行の欲しい列の情報を抜き出すのがawkの基礎といった感じです。

これはまだ本当に上辺をなぞった感じで、「NRは行数を表す」といった組み込み変数も色々あってマスターすると崇められるとかそうでないとか。

また勉強が進んだらまとめてみます。では。

「シェル芸」に効く!AWK処方箋

「シェル芸」に効く!AWK処方箋

*1:ちなみにファイルの中身から情報を抜き出すときは'awk "script文" fileになります'