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
は行数を表す」といった組み込み変数も色々あってマスターすると崇められるとかそうでないとか。
また勉強が進んだらまとめてみます。では。
- 作者: 斉藤博文
- 出版社/メーカー: 翔泳社
- 発売日: 2017/01/31
- メディア: Kindle版
- この商品を含むブログを見る
*1:ちなみにファイルの中身から情報を抜き出すときは'awk "script文" fileになります'