Linuxのawkコマンドでテキストの加工とパターン処理を行う方法!基本的な使い方とオプションを解説!

数あるLinuxのコマンドの中でも、テキストファイルを自在に加工できる使い勝手のいいコマンドが、sedとgrep、そしてawkです。本記事では、コマンドラインから簡単にさまざまなテキスト処理ができる、Linuxのawkコマンドについて説明します。

目次

  1. 1Linux awkはどんな事ができるコマンド?
  2. awkコマンドとは?
  3. awkコマンドの書式とは?
  4. 2Linux awkの基本的な使い方
  5. 一部の列のみの値を取り出す
  6. 行全体を表示する
  7. 処理中の列を取得する
  8. 処理中の行を取得する
  9. 3Linuxのawkコマンドで使えるオプション
  10. テキスト加工に使える主なオプションの使い方
  11. -Fオプションでのパターン処理の使い方
  12. 4Linuxのawkコマンドで使える変数と関数について
  13. パターン処理に使える変数と関数の一覧
  14. 使用例
  15. 5Linuxのawkコマンドでテキスト加工をやってみよう

Linux awkはどんな事ができるコマンド?

最近ではただLinuxを使うだけであれば、GUIのおかげでほとんどコマンドに当たらずともさまざまな処理が可能となっています。しかし、Linuxをシェル上のワンラインで扱うのであれば、awkはテキストのパターン処理を実行させるために手放すことのできないコマンドとなります。

awkコマンドとは?

awkコマンドは、スペースやカンマで区切られた、表型のテキストの加工処理が得意なコマンドです。現在ではExcelなどの表計算ソフトのお陰で、こうした表型のテキストから適当なデータを見つけたり並べ替えたりするのも簡単になりましたが、awkコマンドはこれをLinuxのターミナル画面で実行させられるコマンドです。

こう説明すると、ExcelやLibreOfficeのCalcを使えばいいのではないか、という意見も出てきますが、アプリを立ち上げてファイルを読み込みその上でデータを処理してそれを書き出す、というプロセスを踏むより、シェルのワンラインでテキストファイルを加工し、別ファイルに保存できるawkの軽快さの方が楽な場合は少なくありません。

しかも、パイプ処理をすればわざわざファイルに書き出す必要もなく、ほかのコマンドの出力結果をすぐにawkで加工してしまえます。しかもよく使うテキスト加工であれば、そのままシェルスクリプトにまとめることも簡単ですし、LinuxのみならずWindowsのMingwやMacにも標準装備されているため、スクリプトをコピーすれば、どこでも利用できます。

awkコマンドの書式とは?

Linuxにおいて、awkはシェル上で以下の書式で実行します。
 

  • awk [オプション] [コマンド] [ファイル]

「オプション」と「コマンド」については、のちほど「Linuxのawkコマンドで使えるオプション」および「Linuxのawkコマンドで使える変数と関数について」の章で説明します。なお、[]内は省略可能です。

Windows10でLinuxを使う方法!WSLをインストールする方法を解説!
Windows10ではLinuxを正式に使うことができるようになりました。インストール方法は...

Linux awkの基本的な使い方

Linuxでawkが扱うテキストは、主にスペースやカンマなどで区切られた複数行のデータです。それぞれの行のデータをフィールド(列)といい、各行をレコードと呼びます。たとえば上図のlsの出力結果なども、フィールドで構成されたレコードが並んだawkが扱うに便利なデータとなります。まずはこのデータを使って、awkの基本的な使い方を見ていきます。

一部の列のみの値を取り出す

最初にお伝えするのは、awkを使って各行(レコード)から任意の列(フィールド)を取り出す使い方です。awkでは各フィールドは頭から数えた数で示され、n番目のフィールドを$nと記します。したがって、printコマンドを使えば必要な列の値のみを出力できます。

awk '{print $n}'

これを元に、シェル上で先のデータからファイルサイズとファイル名だけを取り出すなら、ファイルサイズは5番目の、ファイル名は9番目のフィールド(列)にありますから、「ls -lh | awk '{print $5,$9}'」でこのふたつのフィールドだけが出力されます。

行全体を表示する

つづいて、フィールド(列)を表示するのではなく、シェル上である文字を含んだレコード(行)のみを出力する使い方をお教えします。Linuxのawkでは、正規表現を使った文字列を「/」で挟むことで、検索文字列として指定できます。したがって、先のデータから「sh」を含むファイル名のレコードのみを出力するなら、

ls -lh | awk '/sh/'

と入力すれば、以下のように出力されます。

同様に数値の比較も可能です。この場合は文字列の代わりにフィールドの数値を比較します。たとえば100KB以上のファイルを出力させるのなら、シェル上に

ls -l | awk '102400<=$5'

と入力することで、以下のように出力されます。

さらに、ファイル名だけを表示したい場合は、前節の「print $n」を併用して、ファイル名である9番目のフィールドだけを表示させるよう、以下のようにします。

ls -lh | awk '/sh/{print $9}'

なお、0番目のフィールド「$0」を指定するとすべてのフィールドが表示されます。そのため、「ls -lh | awk '/sh/{print $0}'」「ls -lh | awk '/sh/'」と同じ結果を返します。以上の検索文字列と、フィールドを指定したprintコマンドを併用することで、awkを使って自在にデータを加工できます。

処理中の列を取得する

Linuxのawkには、フィールドの位置を指定する「$n」以外にも多くの組み込み変数があります。その中にはフィールド(列)の数をカウントする「NF」という組み込み変数もあります。これを使うと、レコード(行)ごとの列の数を表示させることができます。以下がその入力コマンドと出力例です。

ls -lh | awk '{print NF}'

処理中の行を取得する

awkには、フィールド(列)の数をカウントする「NF」同様、レコード(行)の数を表示させる組み込み変数「NR」もあります。以下がその入力コマンドと出力例です。

$ ls -lh | awk '{print NR, $0}'

関連するまとめ

関連するキーワード

この記事のライター
julyten
PDAの頃から携帯機器やPC関係を扱ってきた旧きプロレス愛好家。

人気の記事

新着まとめ