Linuxコマンド - awk

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
2020年9月5日 (土) 11:40時点におけるWiki (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

概要

awkコマンドとは、入力として受け取った文字列に対して、フィールド区切り文字やレコード区切り文字を指定して、
列に対する処理を行うためのコマンドである。


awkコマンドの基本書式

awkコマンドの基本書式を以下に記載する。

awk -F'[フィールド区切り文字(複数可能)]' -v '変数=xx' '{awkコマンド}' file



フィールドの出力

標準出力を行うawkコマンドのprintを使用して、awkコマンドで指定したフィールドを取得する。
-F'[フィールド区切り文字]'オプションを指定しない場合、区切り文字にはタブまたは半角スペースが選択される。

1フィールド目を出力 : print $1

# 実行
echo 1 2 3 4 | awk '{print $1}'

# 出力
1


2フィールド目の出力 : print $2

# 実行
echo 1 2 3 4 | awk '{print $2}'

# 出力
2


全ての文字列の出力 : print $0 または print

# 実行
echo 1 2 3 4 | awk '{print $0}'

# 出力
1 2 3 4


# 実行
echo 1 2 3 4 | awk '{print}'

# 出力
1 2 3 4


フィールド区切り文字の指定

フィールド区切り文字として、":"を指定する。

# 実行
echo 1:2:3:4 | awk -F'[:]' '{print $1}'

# 出力
1


また、フィールド区切り文字は複数指定できる。

以下の例では、フィールド区切り文字として、":"と"/"を指定している。
並べて記述することで、":"と"/"がフィールド区切り文字として扱われる。

# 実行
echo 1:2/3:4 | awk -F'[:/]' '{print $3}'

# 出力
3


複数フィールドの出力は、半角スペースで区切られる。(OFSを指定していないため)
OFSについては、後述のセクションを参照すること。

# 実行
echo 1:2/3:4 | awk -F'[:/]' '{print $1,$2}'

# 出力
1 2



OFS

OFS(Output Field Separator)とは、awkコマンドの組み込み変数であり、出力のフィールド区切り文字を指定する。
-vオプションは、変数(variable)を指定するという意味のオプションである。

-v '変数=xx'


以下の例では、OFSに半角スペースを指定して、フィールドの出力を#で区切る。

# 実行
echo 1:2/3:4 | awk -F'[:/]' -v 'OFS= ' '{print $1,$3}'

# 出力
1 3



RS

RS(Record Separator)とは、awkコマンドの組み込み変数であり、入力のレコード区切り文字を指定する。

以下の例では、/を区切り文字に指定して、1:2と3:4に分けている。
/をレコード区切り文字にして、各レコードから1フィールド目を取得している。
出力は、改行で区切って出力される。(ORSが指定されていないため)

# 実行
echo 1:2/3:4 | awk -F'[:]' -v 'RS=/' '{print $1}'

# 出力
1
3


# 実行
echo 1:2/3:4 | awk -F'[:]' -v 'RS=/' '{print $1,$2}'

# 出力
1 2
3 4


フィールド区切り文字とレコード区切り文字で同じ文字がある場合、レコード区切り文字が優先される。

# 実行
echo 1:2/3:4 | awk -F'[:/]' -v 'RS=/' '{print $1,$2}'

# 出力
1 2
3 4



ORS

ORS(Output Record Separator)とは、awkコマンドの組み込み変数であり、出力のレコード区切り文字を指定する。

以下の例では、"This is ORS"を指定して、レコードの出力を区切っている。

# 実行
echo 1:2/3:4 | awk -F'[:/]' -v 'RS=/' -v 'ORS=This is ORS' '{print $1,$2}'

# 出力
1 2This is ORS3 4



OFSとORSの明示

以下の例では、OFSは空白4つ、ORSは改行2つにしている。
また、\nは改行を示す。

# 実行
echo 1:2/3:4 | awk -F'[:/]' -v 'OFS=    ' -v 'RS=/' -v 'ORS=\n\n' '{print $1,$2}'

# 出力
1    2
3    4



最終フィールドの取得 : $NF

最終フィールドを取得するとして、$NFが用意されている。

# 実行
echo 1:2/3:4 | awk -F'[:/]' '{print $NF}'

# 出力
4


# 実行
echo 1:2/3:4 | awk -F'[:/]' '{print $NF-1}'

# 出力
3



printf

printの他に、printfも使用できる。

# 実行
echo 1:2/3:4 | awk -F'[:/]' '{printf "%s\n%s\n",$NF,$NF-1}'

# 出力
4
3