awkでテキスト処理ができたら

メソ
2024-10-04
2024-10-04

業務で決まったパターンのテキスト処理を行うことがあり、シェルスクリプトで書こうと思ったのですが、awkの方が少ない行数で書けるのではと思いました。

例えば、以下のような「ID<Tab>ドメイン<Tab>IPアドレス」が列挙されているテキストファイルがあるとします。

ID ドメイン XXX.XXX.XXX.XXX
ID ドメイン XXX.XXX.XXX.XXX
ID ドメイン XXX.XXX.XXX.XXX
ID ドメイン XXX.XXX.XXX.XXX
    :
    :

このテキストファイルからシェルスクリプトでドメイン名のみを抽出するには、以下のような記述になります。

#/bin/bash

while read line;

do
        ARRAY=(${line})
        echo ${ARRAY[1]}

done < "domain.txt"

同等の出力を得たい時、awkを使うとこのように記述できます。

$ awk -F $'\t' '{print $2}' domain.txt

-Fオプションで区切り文字を\t(タブ)で指定し、$2でdomain.txtの2つ目の要素を指定しています。

シェルスクリプトと同じようにechoを使うには、外部コマンドを呼び出すsystem関数を利用します。このような記述方法でも、同等の出力を得ることができます。

$ awk -F $'\t' '{system("echo "$2"")}' domain.txt

このように、awkはワンライナーで書くことができ便利ですが、シェルの利便性も考慮しながら使い分けできたらと思います。