siwen

siwen

😉

awk コマンド

awk テキスト解析ツール#

説明:

awk は、Linux/Unix 環境でテキストやデータを処理するためのプログラミング言語です。データは標準入力(stdin)、1 つまたは複数のファイル、または他のコマンドの出力から取得できます。ユーザー定義の関数や動的正規表現などの高度な機能をサポートしており、Linux/Unix 環境での強力なプログラミングツールです。コマンドラインで使用されますが、スクリプトとして使用されることが多いです。awk には、配列や関数などの多くの組み込み機能があり、これは C 言語との共通点です。柔軟性が awk の最大の利点です。

構文:

awk [option] 'PATTERN{ACTION STATEMENTS}' FILE

awk 実行プロセス#

image

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
  • print の引数がカンマで区切られている場合、出力時に空白が区切り文字として使用されます;awkprint 文の引用符は結合子として使用されます。
    - OFS 変数を有効にするには、フィールドに対して操作を行う必要があります(NF=NFNF+=0$1=$1 など)。

フォーマット印刷(printf)#

  • 使用方法は C 言語の printf と同様です。
  • print は表示結果をカンマで区切り、結果は自動的にこれらの内容を区切り文字で区切り、改行文字を追加する必要はありません;
  • printf は特定のフィールドの出力形式を制御でき、手動で改行文字を追加する必要があります。

一般的なフォーマット置換子:

記号説明
%s文字列
%f浮動小数点数
%d10 進整数
%cASCII 文字
%%% 自体

一般的なエスケープ文字:

記号説明
\n改行
\t水平タブ
\v垂直タブ
\rキャリッジリターン
\bバックスペース
\fページ送り
\a警告文字
\\\ 自体
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。