スポンサーリンク
linuxでテキスト処理を行うのに一番便利なのはawkだと信じて疑わない私です。
しかし一方で学習コストが高いのもawkの特徴です。初めて見た時、「これ、何やってるんだろう。。?」と思った人は少なくないと思います。
今回はそんなawkをスマートに使うためのtipsをご紹介いたします。
awkには便利な組み込み関数がいくつも用意されていますが、私がよく使うのは、 NR
と NF
の二つです。
これはそれぞれ 行数
と カラム数
を表しております。
またNFについては $
を付けることで $カラム数
と言う意味、つまり 最後のカラムの文字列
と言う意味になります。
変数名 | 意味 |
---|---|
NR | 行数 |
NF | カラム数 |
$NF | 最後のカラムの文字列 |
それでは実際の使用例を説明します。
NRは行数を意味します。例えば 1行目はヘッダ行なので除外したい
と言うような場合に使います。
以下、例です。
特に何もつけずにvmstatを実行すると先頭行にヘッダが付きます。
$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 121828 128224 116340 276780 0 0 0 3 1 0 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 48 39 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 52 39 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 46 42 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 35 29 0 0 100 0 0
このような先頭行をawkを使うことで取り除くことができます。
$ vmstat 1 5 | awk 'NR>2{print}'
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 121828 128224 116340 276780 0 0 0 3 1 0 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 48 39 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 52 39 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 46 42 0 0 100 0 0
0 0 121828 128208 116340 276780 0 0 0 0 35 29 0 0 100 0 0
上記の NR>2
と言うのは 2行目以降から表示
と言う意味になります。
NFは行のカラム数を表します。使い方の例を示します。
echo 'a b c d' | awk '{print NF}'
4
上記のように入力が4カラムだったので 4 と表示されます。
先程のNFを応用すると、 最後のカラムを取得する
という使い方ができます。
echo 'a b c d' | awk '{print $NF}'
d
これは、 NF
を 4
と解釈するため、 $NF
を $4
として扱うということです。
この方法を使えば、十数カラムあるような長い行でもいちいち数えることなく最終行を表示することができます。
以上、awkのNRとNFの使い方でした。
スポンサーリンク