Linuxコマンド - awk
概要
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