awkコマンドの使い方
| 組込変数 | 意味 | デフォルト値 |
|---|---|---|
| $0,$1,$2… | パイプで渡された値 | – |
| FS | 区切り文字(field separator) | 半角スペース |
| OFS | 出力時の区切り文字(output field separator) | 半角スペース |
| RS | (record separator) | 改行 |
| ORS | (output record separator) | 改行 |
| $NF | 最終フィールド | – |
| NR | 現在行 | 1 |
| FNR | 現在行 | 1 |
| FPAT | フィールドパターン(fireld pattern) | – |
| ENVIRON | 環境変数の連想配列 | – |
awkコマンドの基本構文
awk '
BEGIN{
# 変数初期化など行うBEGINブロック
}
{
# メインブロック
}
END{
# 最後に処理するENDブロック
}
'
#以降は1行コメントになります。
各ブロックは不要なら省略可能です。
半角スペース区切りの数値をechoして、各々の数値をsummaryした結果を出力します。
sum変数をBEGIN句で初期化し、メインブロックで計算し、ENDブロックで出力します。
$ echo 111,222,333 | awk 'BEGIN{FS=",";sum=0} \
> {sum=$1+$2+$3} \
> END{print sum}'
666
$0,$1,$2…変数
,,…変数
$0,$1,$2…と変数が用意されています。以下のようなイメージです。
半角スペース区切りの数値をechoして、その結果をawkで受け取ります。
$ echo 1 2 3 | awk '{print $1}'
1
$ echo 1 2 3 | awk '{print $2}'
2
$ echo 1 2 3 | awk '{print $3}'
3
$ echo 1 2 3 | awk '{print $0}'
1 2 3
FS変数
BEGIN句でFS変数を初期化し、$1,$2などで標準出力します。区切り文字をカンマにして$1を出力します。
$ echo 111,222,333 | awk 'BEGIN{FS=","} {print $1}'
111
OFS変数
OFS変数はアウトプット時のセパレータです。以下では/にしています。
$ echo 111,222,333 | awk 'BEGIN{FS=",";OFS="/"} {print $0,$1,$2,$3}'
111,222,333/111/222/333
RS変数
区切り文字をRS変数で指定します。FS変数と似ていますが、RS変数で区切り文字を指定した場合は、出力は改行で区切られて出力されます。
$ echo 111,222,333 | awk 'BEGIN{FS=","} {print $1}'
111
$ echo 111,222,333 | awk 'BEGIN{RS=","} {print $1}'
111
222
333
ORS変数
出力時の区切り文字をORS変数で指定します。ORS=””にしてみます。
$ echo 111,222,333 | awk 'BEGIN{RS=",";ORS=""} {print $1}'
111222333$
ORS=” “にしてみます。
$ echo 111,222,333 | awk 'BEGIN{RS=",";ORS=" "} {print $1}'
111 222 333 $
NF変数
NF変数は最終フィールドを表す変数です。
$ echo 111,222,333 | awk 'BEGIN{FS=","} {print $1}'
333
NR変数
NR変数は複数行のファイルなどに対してawkコマンドを使用する際の現在行を表します。
以下の3行のCSVファイルがあります。
$ cat sample.csv 111,222,333 100,200,300 10,10,50
このファイルに対して先頭に行数を付けてみます。
$ cat sample.csv | awk '{print NR"行目",$0}'
1行目 111,222,333
2行目 100,200,300
3行目 10,10,50
FPAT変数
CSVを扱う際に、カンマを含む値がある場合にFS=”,”とした場合にうまく処理ができません。
"100","200","300" "100","2,200","300" ←この行がうまく処理できない "100","200","300"
フィールド値にカンマを含む可能性があるCSVを処理する場合はFPAT変数を使用します。
$ echo '111,"222,333",444' \
> | awk 'BEGIN{FPAT="([^,]+)|(\"[^\"]+\")"} {print $2}'
"222,333"
ENVIRON変数
ENVIRON変数は連想配列です。
| 環境変数(一部) | 値 |
|---|---|
| ENVIRON[“PWD”] | /home/ec2-user |
| ENVIRON[“SHELL”] | /bin/bash |
$ echo | awk '{print ENVIRON["SHELL"]}'
/bin/bash
$ echo | awk '{print ENVIRON["PWD"]}'
/home/ec2-user
ENVIRON変数の連想配列のキーをすべて出力します。
asorti関数で第一引数の配列のインデックスを第二引数の配列にプットしてソートします。
$ echo | awk '{asorti(ENVIRON,env); for(i in env) {print env[i]; }}'
SSH_TTY
HOME
TERM
HOSTNAME
USER
LANG
LESSOPEN
LOGNAME
LS_COLORS
MAIL
XDG_RUNTIME_DIR
PATH
XDG_SESSION_ID
PWD
_
SHELL
SHLVL
AWKPATH
SSH_CLIENT
HISTCONTROL
SSH_CONNECTION
HISTSIZE
今度は逆に、ENVIRON変数の連想配列の値をすべて出力します。
asort関数で第一引数の配列の要素を第二引数の配列にプットしてソートします。
$ echo | awk '{asort(ENVIRON,env); for(i in env) {print env[i]; }}'
en_US.UTF-8
.:/usr/share/awk
ignoredups
/bin/bash
ip-172-31-47-49.ap-northeast-1.compute.internal
/dev/pts/0
/home/ec2-user
/home/ec2-user
/run/user/1000
/usr/bin/awk
rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:~~~~省略
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
xterm-256color
/var/spool/mail/ec2-user
||/usr/bin/lesspipe.sh %s
218.219.193.161 62309 172.31.47.49 23
218.219.193.161 62309 22
1
ec2-user
166
ec2-user
1000

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^



コメント