awk テキスト解析ツール#
説明:
awk
は、Linux/Unix 環境でテキストやデータを処理するためのプログラミング言語です。データは標準入力(stdin)、1 つまたは複数のファイル、または他のコマンドの出力から取得できます。ユーザー定義の関数や動的正規表現などの高度な機能をサポートしており、Linux/Unix 環境での強力なプログラミングツールです。コマンドラインで使用されますが、スクリプトとして使用されることが多いです。awk
には、配列や関数などの多くの組み込み機能があり、これは C 言語との共通点です。柔軟性がawk
の最大の利点です。
構文:
awk [option] 'PATTERN{ACTION STATEMENTS}' FILE
awk 実行プロセス#
awk プログラム構造#
構造 | 説明 |
---|---|
BEGIN{ awk-commands } | 省略可能で、awk がファイルを読み込む前に実行される内容が含まれます。 |
/pattern/{ awk-commands } | 省略可能で、入力の各行に対してこの部分のコードが 1 回実行され、/pattern/ を追加して入力行をフィルタリングできます。 |
END{ awk-commands } | 省略可能で、awk がファイルの読み込みを完了した後に実行される内容が含まれます。 |
例#
# 次のテキスト内容を準備
[root@localhost ~]# cat emp.txt
001 張三 1000 10
002 李四 2000 10
003 王五 3000 10
004 赵六 2000 20
005 小紅 1800 30
006 小麗 800 20
# awk コマンドでテキスト内容を出力
[root@localhost ~]# awk '{print}' emp.txt
# テキスト内容を出力し、表のヘッダーと表の末尾を追加(-------------------)
[root@localhost ~]# awk 'BEGIN{print "番号 名前 給与 部門"}{print}END{print "-------------------"}' emp.txt
番号 名前 給与 部門
001 張三 1000 10
002 李四 2000 10
003 王五 3000 10
004 赵六 2000 20
005 小紅 1800 30
006 小麗 800 20
-------------------
awk コマンドオプション#
オプション | 意味 |
---|---|
-F fs | 入力ファイルの区切り文字を指定(デフォルトは空白文字)、fs は文字列または正規表現です。 |
-v var=value | ユーザー定義変数に値を代入 |
-f scriptfile | スクリプトファイルから awk コマンドを読み込む |
awk の使用方法:
- コマンドライン使用
コマンドラインで直接
awk
コマンドを実行
awk '{print}' emp.txt
- awk スクリプト使用
awk コードをファイルに書き(一般的に .awk をファイル拡張子として使用)、-f オプションで実行
awk -f file.awk emp.txt
- shell スクリプト使用
awk コマンドをシェルスクリプトに書き、シェルスクリプトを実行
awk パターンと操作#
パターン | 意味 |
---|---|
/pattern/ | 正規表現 |
関係式 | 演算子を使用して操作 |
パターンマッチ式 | ~ (マッチ) !~ (不マッチ) |
操作は 1 つ以上のコマンド、関数、式で構成され、改行またはセミコロンで区切られます。
awk 正規表現範囲:
/start/,/end/
NR==1,NR==5
1 行目から 5 行目まで
例#
# emp.txt に '小' という文字を含む行を出力
[root@localhost ~]# awk '/小/' emp.txt
# '張' を含む行から '赵' を含む行まで出力
[root@localhost ~]# awk '/張/,/赵/' emp.txt
# 最初の3行を出力
[root@localhost ~]# awk 'NR<=3' emp.txt
[root@localhost ~]# awk 'NR==1,NR==3' emp.txt
[root@localhost ~]# awk 'NR>=1 && NR<=3' emp.txt
# パターンマッチの場合は出力
[root@localhost ~]# awk '666 ~ /[0-9]+/' emp.txt
パターンを使用した場合、行を出力するだけであれば、
awk
文の部分は省略可能です。
awk 変数#
組み込み変数(予定義変数)#
変数 | 意味 |
---|---|
$0 | 実行中の現在の行の内容 |
$n | 現在のレコードの第 n フィールド(分割後の第 n 列) |
NF | 現在の行のフィールド数、$NF は 1 行中の最後のフィールド |
NR | 現在の行の行番号 |
FS | 入力フィールドの区切り文字(デフォルトは空白文字、-v で指定可能) |
OFS | 出力フィールドの区切り文字(デフォルトは空白、-v で指定可能) |
RS | 入力レコードの区切り文字(デフォルトは改行、-v で指定可能) |
ORS | 出力レコードの区切り文字(デフォルトは改行、-v で指定可能) |
FILENAME | 現在のファイルのファイル名 |
ユーザー定義変数#
- -v オプションで定義
-v var=value
awk
プログラム内で定義
awk 'BEGIN{var=value}'
外部変数の渡し方#
-
-v
オプションを使用してawk
コマンドに外部変数を渡すことができます。 -
コマンドの最後に
var=value
を使用しても外部変数を渡すことができます。
例#
# emp.txt の各行の内容、行番号、フィールド数を出力
[root@localhost ~]# awk '{print $0,NR,NF}' emp.txt
# 第1列、最後の列、倒数第2列の内容を出力
[root@localhost ~]# awk '{print $1,$NF,$(NF-1)}' emp.txt
# テキスト内容を "部門 番号 名前 給与" の順序で出力
[root@localhost ~]# awk '{print $4,$1,$2,$3}' emp.txt
# 第3行の第2フィールドを出力
[root@localhost ~]# awk 'NR==3{print $2}' emp.txt
# 各部門の人数をカウント
[root@localhost ~]# awk '{print $NF}' emp.txt | uniq -c
# 出力フィールドの区切り文字を':' に変更し、出力結果を emp.txt.bak ファイルに書き込む
[root@localhost ~]# awk -v OFS=":" '{print $1,$2,$3,$4}' emp.txt > emp.bak.txt
[root@localhost ~]# awk -v OFS=":" 'NF=NF' emp.txt > emp.bak.txt
# emp.txt.bak ファイルの各行データに対して、出力: "番号:xxx、名前:xxx、給与:xxx"
[root@localhost ~]# awk -F: '{print "番号:"$1",名前:"$2",給与:"$3}' emp.bak.txt
# ユーザー定義変数
# 方法1
[root@localhost ~]# echo | awk -v a=100 '{print a}'
# 方法2
[root@localhost ~]# echo | awk 'BEGIN{b=100;print b}'
# 外部変数の渡し方
[root@localhost ~]# a='aaa'
[root@localhost ~]# b='bbb'
# 方法1
[root@localhost ~]# echo | awk -v v1=$a -v v2=$b '{print v1,v2}'
# 方法2
[root@localhost ~]# echo | awk '{print v1,v2}' v1=$a v2=$b
awk
の
-OFS
変数を有効にするには、フィールドに対して操作を行う必要があります(NF=NF
、NF+=0
、$1=$1
など)。
フォーマット印刷(printf)#
- 使用方法は C 言語の
printf
と同様です。 print
は表示結果をカンマで区切り、結果は自動的にこれらの内容を区切り文字で区切り、改行文字を追加する必要はありません;printf
は特定のフィールドの出力形式を制御でき、手動で改行文字を追加する必要があります。
一般的なフォーマット置換子:
記号 | 説明 |
---|---|
%s | 文字列 |
%f | 浮動小数点数 |
%d | 10 進整数 |
%c | ASCII 文字 |
%% | % 自体 |
一般的なエスケープ文字:
記号 | 説明 |
---|---|
\n | 改行 |
\t | 水平タブ |
\v | 垂直タブ |
\r | キャリッジリターン |
\b | バックスペース |
\f | ページ送り |
\a | 警告文字 |
\\ | \ 自体 |