はじめに
LinuxやC言語を中心に学習中の42tokyoの生徒です。
Linuxコマンドを学習している際にawkの使い方がいまいち理解できなかったので、改めて調べてみました。
前提
awkについて、網羅的に理解できる内容にはなっていないこと最初にお断りをしておきます。私のような初学者が、少しでもawkについて理解を深めるための参考になればと思い調べたことを記載しております。
awkの基本形
<説明>
コマンドラインもしくは入力のファイルパスからテキストを受け取り、行ごとに処理される。パターンにマッチした行はアクションに記載の処理が実行される。
awk 'パターン { アクション }' [入力のファイルパス]
よく上記のように書かれていますが、これをみてもよく分かりませんよね。(私がそうでした。)以下に例を載せて記載しておりますので、徐々に分かるようになると思います。
パターン
awkの”パターン”には4種類あります。それぞれの使い方例について以下に記載いたします。
①評価式
②正規表現
③BEGIN
④END
事前準備① sample.txtを用意
以下、説明しやすいように、「sample.txt」を用意しました。
sample.txt
apple 1
banana 2
grape 3
事前準備② $1、$2、$0
$1は各行の1列目、$2は各行の2列目、$0は全ての列を表します。
例1
awk '{print $1}
-出力結果-
apple
banana
grape
例2
awk '{print $2}
-出力結果-
1
2
3
例3
awk '{print $0}
-出力結果-
apple 1
banana 2
grape 3
パターン①:評価式
条件に合致した行が処理されます。
awk '$1 == "apple" {print $2}' sample.txt
-出力結果-
1
パターン②:正規表現
正規表現に合致した行が処理されます。
awk '$1 ~ /apple/ {print $0}' sample.txt
-出力結果-
apple 1
<補足>
~: 正規表現でマッチするかどうかを判定する演算子
/正規表現/: 正規表現をスラッシュで囲む
パターン③:BEGIN
awkの処理が開始される前に一度だけ実行されます。
awk 'BEGIN { count = 0 } { count++ } END { print "行数:", count }' sample.txt
-出力結果-
4
パターン④:END
awkの処理が終わる際に一度だけ実行されます。
awk '{print $0} END { print "完了" }' sample.txt
-出力結果-
apple 1
banana 2
grape 3
完了
awkの組み込み変数
awkと一緒に利用できる変数が用意されています。
レコード関連の変数
変数 | 意味 |
---|---|
NR | 処理中の現在のレコード番号(行番号)。1から始まる |
FNR | ファイルごとのレコード番号。複数のファイルを処理する際に、各ファイルの先頭からカウントが再開される。 |
NF | 現在のレコードのフィールド数(列数) |
ファイル関連の変数
変数 | 意味 |
---|---|
FILENAME | 現在処理しているファイルの名前 |
ARGC | コマンドライン引数の個数 |
ARGV | コマンドライン引数の配列 |
区切り文字関連の変数
変数 | 意味 |
---|---|
FS | フィールドの区切り文字(デフォルトはスペースやタブ) |
OFS | 出力時のフィールド区切り文字 |
RS | レコードの区切り文字(デフォルトは改行) |
ORS | 出力時のレコード区切り文字 |
その他変数
変数 | 意味 |
---|---|
CONVFMT | 数値を文字列に変換する際のフォーマット(デフォルトは %.6g) |
ENVIRON | 環境変数を配列として格納したもの。ENVIRON["PATH"] のようにアクセス可能 |
OFMT | 数値を出力する際のフォーマット(デフォルトは %.6g) |
IGNORECASE | 大文字小文字を区別しない場合は1を設定する(デフォルトは0で、区別あり) |
awkのオプション
-F '文字列'
フィールド区切り文字を指定するオプション。デフォルトはスペースやタブだが、カンマやコロンなど任意の文字列に変更可能。
使用例
awk -F ',' '{print $1, $2}' file.txt # カンマ区切りのCSVファイルを読み取る
-v 変数名=値
スクリプト内で使う変数を外部から設定するオプション。awk のスクリプト内で使用する変数を直接渡せます。
使用例
awk -v threshold=10 '{if ($1 > threshold) print $1}' file.txt
-f ファイル名
実行する awk のスクリプトを別ファイルに保存して、ファイルを指定して実行するオプション。長いスクリプトや再利用可能なスクリプトを書く際に便利です!
使用例
awk -f script.awk sample.txt
※通常 .awk 拡張子を付けるのが一般的。拡張子自体は必須ではないので、script.txt でも動作はしますが、.awk を使うことが推奨とのことです。
終わりに
少しでも参考になれば嬉しいです。今後もLinux、C言語の学習に邁進いたします。