🐧

AWKの基本ポイント15項目

2023/04/17に公開

awkは非常に強力なテキスト処理ツールであり、習得するとLinuxのテキスト処理が大幅に効率化されます。
以下に、効率よくawkを習得するために学ぶべき15の項目と具体例を示します。


  1. 基本構文とフィールド処理: awkは、テキストファイルを行単位で処理し、各行をフィールドに分割して操作します。 具体例:
echo "apple 3 red" | awk '{print $1, $3}'

この例では、各行の1番目と3番目のフィールドを出力します。結果は "apple red" となります。


  1. 条件分岐とループ: awkは、if文やforループなどの制御構造を使用して、より複雑な処理を行うことができます。 具体例:
echo -e "1\n2\n3\n4\n5" | awk '{if ($1 % 2 == 0) print $1}'

この例では、偶数の行だけを出力します。結果は "2" と "4" となります。


  1. パターンマッチング: awkは、正規表現を使用してテキストのパターンマッチングを行うことができます。 具体例:
echo -e "apple\nbanana\norange" | awk '/an/ {print $1}'

この例では、"an" を含む行だけを出力します。結果は "banana" と"orange"になります。


  1. 組み込み関数: awkには、テキスト処理に役立つ多くの組み込み関数が用意されています。 具体例:
echo "OpenAI" | awk '{print tolower($1)}'

この例では、入力文字列を小文字に変換して出力します。結果は "openai" となります。


  1. BEGINとENDブロック: awkでは、BEGINブロックとENDブロックを使用して、テキスト処理の前後に特定の処理を行うことができます。これは集計処理や初期化などに役立ちます。 具体例:
echo -e "1\n2\n3\n4\n5" | awk 'BEGIN {sum=0} {sum+=$1} END {print sum}'

この例では、すべての行の数値を合計して出力します。結果は "15" となります。


  1. 変数と演算子: awkでは、変数を使用してデータを保存し、演算子を使って算術演算や文字列操作を行います。 具体例:
echo "3 4" | awk '{sum=$1+$2; product=$1*$2; print "Sum:", sum, "Product:", product}'

この例では、各行の2つの数字を加算し、乗算した結果を出力します。結果は "Sum: 7 Product: 12" となります。


  1. 配列: awkは連想配列をサポートしており、データの整理や集計に役立ちます。 具体例:
echo -e "apple\nbanana\napple\norange\nbanana" | awk '{count[$1]++} END {for (fruit in count) print fruit, count[fruit]}'

この例では、各果物の出現回数をカウントし、結果を出力します。


  1. 外部コマンドとの連携: awkは、他のLinuxコマンドと連携して、より複雑なテキスト処理を実現できます。 具体例:
cat sample.txt | awk '/Error/ {print $0}' | wc -l

この例では、sample.txt内の"Error"という文字列を含む行の数をカウントします。


  1. ファイルの読み書き: awkでは、ファイルの読み込みや書き込みを行うことができます。 具体例:
awk 'BEGIN {while (getline < "input.txt") {print $1 > "output.txt"}}'

この例では、input.txtファイルから各行の1番目のフィールドを抽出し、output.txtファイルに書き込みます。


  1. ユーザー定義関数: awkでは、独自の関数を定義して再利用することができます。これにより、コードの整理や再利用性が向上します。 具体例:
awk 'function square(x) {return x*x} {print $1, "squared is", square($1)}' numbers.txt

この例では、入力ファイルnumbers.txtから各行の数値を読み取り、2乗した値を出力します。


  1. フィールドセパレータの変更: awkでは、フィールドセパレータ(FS)を変更することで、カスタム区切り文字でフィールドを分割できます。 具体例:
echo "apple:5:red" | awk -F':' '{print $1, $3}'

この例では、コロン (:) をフィールドセパレータに設定し、1番目と3番目のフィールドを出力します。結果は "apple red" となります。


  1. 出力フィールドセパレータの変更: awkでは、出力フィールドセパレータ(OFS)を変更して、出力時の区切り文字をカスタマイズできます。 具体例:
echo "apple 3 red" | awk 'BEGIN {OFS=" - "} {print $1, $3}'

この例では、出力フィールドセパレータを " - " に設定し、1番目と3番目のフィールドを出力します。結果は "apple - red" となります。


  1. レコードセパレータの変更: awkでは、レコードセパレータ(RS)を変更することで、カスタム行区切り文字でレコードを分割できます。 具体例:
echo -e "apple#banana#orange" | awk 'BEGIN {RS="#"} {print $1}'

この例では、ハッシュ (#) をレコードセパレータに設定し、各レコードを別々に出力します。


  1. 正規表現によるフィールド分割: awkでは、正規表現をフィールドセパレータとして使用できます。これにより、複数の区切り文字に対応したフィールド分割が可能です。 具体例:
echo "apple,5:red" | awk -F'[,:]' '{print $1, $3}'

この例では、コロン (:) とコンマ (,) の両方をフィールドセパレータとして使用し、1番目と3番目のフィールドを出力します。結果は "apple red" となります。


  1. パターン範囲指定: awkでは、特定のパターンの範囲内のみを処理することができます。これにより、特定の範囲の行のみを対象に処理を行うことができます。 具体例:
cat sample.txt | awk '/START/,/END/ {print $0}'

この例では、sample.txt内で "START" というパターンから "END" というパターンまでの範囲の行を出力します。これにより、特定の範囲のテキストのみを対象に処理を行うことができます。

Discussion