awkで行数・カラム数を取得する変数 | 瀬戸内の雲のように

awkで行数・カラム数を取得する変数

Posted: 2018-01-29


スポンサーリンク

目次

背景

最近はインフラエンジニアでもすっかりオンプレミスのサーバを使う機会が減っており、AWSなどのクラウドサービスを使うことが増えてきました。

 
そんな風に環境が変わっても、インフラエンジニアのトラブル対応の基本はそんなに変わらないと思います。トラブル対応の基本はやはりログ解析です。

 
前置きが長くなりましたが、そんなログ解析で一番使いやすいツールは個人的にはawkだと思っています。ということで今回はawkのTipsを1つ書きたいと思います。

概要

awkを使う時、行数とカラム数を使うことがよくあります。例えば、

  • 表形式的なデータを使う時、先頭行は項目名なので除外したい
  • カラム数が◯◯個の行にだけ処理をしたい などなど。

そんな時、awkさんはちゃんとビルトインの変数として用意してくれています。

詳細

ということで、使用例とともに説明します。
ちなみに、例で使う入力データはこんな感じです。

$ echo -e 'aaa bbb ccc\nddd eee fff\nggg hhh iii'
aaa bbb ccc
ddd eee fff
ggg hhh iii

1. 行数

現在の行数は NR という変数で取得できます。以下のように使います。

$ echo -e 'aaa bbb ccc\nddd eee fff\nggg hhh iii' | awk '{print NR}'
1
2
3

このように、print NR とすることで現在の行数を表示してくれます。

ファイル全体の行数を取得したければ、

$ echo -e 'aaa bbb ccc\nddd eee fff\nggg hhh iii' | awk 'END{print NR}'
3

とすれば取得できます。

なお、例に上げた「表形式的なデータを使う時、先頭行は項目名なので除外したい」という場合は、
条件としてNR>1のようにしてあげれば2行目以降のみを表示してくれます。

$ echo -e 'aaa bbb ccc\nddd eee fff\nggg hhh iii' | awk 'NR>1{print}'
ddd eee fff
ggg hhh iii

 

2.カラム数

次にカラム数です。こちらは NF という変数で取得できます。
以下のように使います。

$ echo -e 'aaa bbb ccc\nddd eee fff\nggg hhh iii' | awk '{print NF}'
3
3
3

このように出力されます。

ちなみに、末尾のカラムだけを表示させたければ以下のようにできます。

$ echo -e 'aaa bbb ccc\nddd eee fff\nggg hhh iii' | awk '{print $NF}'
ccc
fff
iii

この入力値において、$NFという変数は$3という意味と同じなので、末尾のカラムだけ表示されます。

まとめ

awkは非常に歴史あるツールですが、未だにログ解析などのテキスト処理においては最強だと(個人的に)信じています。


スポンサーリンク




コメント一覧


コメントを投稿する


お名前


コメント内容





TOP back