Linuxコマンド: awk
awk
は、テキスト処理やデータ解析に特化した強力なコマンドラインツールです。主に、パターンマッチングやフィールド単位でのデータ操作に使用されます。
基本構文
awk 'パターン { アクション }' ファイル名
- パターン: 処理対象となる行を指定する条件。
- アクション: 条件に一致する行に対して実行する操作。
- ファイル名: 処理対象のテキストファイル。
標準入力との組み合わせ
awk
は標準入力からデータを受け取ることもできます。
cat ファイル名 | awk 'パターン { アクション }'
基本の使用例
1. ファイルのすべての行を表示
awk '{ print }' ファイル名
出力: ファイルのすべての内容をそのまま出力します。
2. 特定の列(フィールド)を抽出
awk
は、スペースやタブで区切られた列を「フィールド」として認識します。
awk '{ print $1 }' ファイル名
出力: 各行の最初のフィールドを出力します。
-
$1
: 最初のフィールド -
$2
: 2番目のフィールド -
$0
: 行全体
3. 特定の条件に一致する行を表示
awk '$3 > 100 { print }' ファイル名
出力: 3番目のフィールドが100より大きい行を出力します。
オプション
-F
(フィールド区切り文字の指定)
フィールド区切り文字を指定します。デフォルトはスペースやタブです。
使用例: カンマ区切りファイルの処理
awk -F"," '{ print $2 }' ファイル名
例:
以下のようなデータが格納されたファイルがあるとします。
tarou,tanaka,satou
suzuki,tamagawa,oya
コマンドを実行すると、2番目のフィールドが出力されます。
入力:
awk -F"," '{ print $2 }' データファイル名
出力:
tanaka
tamagawa
-v
(変数の指定)
awk
スクリプト内で使用する変数をコマンドラインで指定できます。
使用例: 変数の使用
awk -v threshold=100 '$3 > threshold { print $0 }' ファイル名
出力: 3番目のフィールドが100より大きい行を出力します。
応用例: 動的な閾値の計算
以下のようなファイルがあるとします。
A,50
B,150
C,120
コマンド:
awk -F"," -v threshold=100 '$2 > threshold { print $1 }' データファイル名
出力:
B
C
-f
(スクリプトファイルの使用)
awk
スクリプトを外部ファイルとして保存し、そのファイルを指定して実行できます。
使用例: スクリプトファイルの実行
awk -f script.awk ファイル名
-W
(警告や動作モードの指定)
awk
の動作モードや警告レベルを指定します。
使用例: 非標準拡張の警告を有効化
awk -W lint '{ print $1 }' ファイル名
よく使われるパターンとアクション
1. 行番号を付与
awk '{ print NR, $0 }' ファイル名
出力: 各行の先頭に行番号を追加します。
-
NR
: 現在の行番号
2. 合計値を計算
awk '{ sum += $3 } END { print sum }' ファイル名
出力: 3番目のフィールドの合計を出力します。
-
END
: 入力処理が終了した後に実行されるアクション。
3. 平均値を計算
awk '{ sum += $3; count++ } END { print sum / count }' ファイル名
出力: 3番目のフィールドの平均値を出力します。
4. 特定の文字列を含む行を抽出
awk '/エラー/ { print }' ファイル名
出力: "エラー"という文字列を含む行を出力します。
5. 列の並び替え
awk '{ print $2, $1 }' ファイル名
出力: 1列目と2列目の順序を入れ替えます。
条件演算子
awk
ではさまざまな条件演算子を使用できます。
-
==
: 等しい -
!=
: 等しくない -
>
: 大きい -
<
: 小さい -
>=
: 以上 -
<=
: 以下
使用例
awk '$2 == "成功" { print }' ファイル名
出力: 2番目のフィールドが"成功"と等しい行を出力します。
応用例
1. ユーザーリストの表示(/etc/passwd
ファイル)
awk -F":" '{ print $1 }' /etc/passwd
出力: ユーザー名をリスト表示します。
2. スペース区切りのデータをCSV形式に変換
awk '{ print $1 "," $2 "," $3 }' ファイル名
出力: 各行をカンマ区切り形式で出力します。
3. 最大値の計算
awk 'max < $3 { max = $3 } END { print max }' ファイル名
出力: 3番目のフィールドの最大値を出力します。
4. ファイルのヘッダー行を無視
awk 'NR > 1 { print $0 }' ファイル名
出力: 2行目以降を出力します。
5. フィールドを条件に応じて加工
awk '$2 == "OK" { $3 = "Success"; print $0 }' ファイル名
出力: 2番目のフィールドが"OK"の場合、3番目のフィールドを"Success"に変更して行全体を出力します。