AWKの基本コマンドと使い方を徹底解説!テキスト加工やパターン・文字列処理の方法は?
AWKでできること
- CSVファイル操作
- ログ解析
AWK派生言語解説
- awk(元祖AWK)
- nawk(New AWK)
- gawk(GNU AWK)
- mawk(Mike Brennanが実装したAWK)
AWK動作環境の準備
- # docker run –rm -it centos /bin/bash
- $ cat /etc/redhat-release
- CentOS Linux release 8.1.1911 (Core)
- $ yum -y update
- $ yum -y install which
AWKのインストール
- $ which awk
- /usr/bin/awk
- $ which mawk
- which: no mawk in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)
- $ apt -y install mawk
- $ yum -y install gawk
AWKのバージョン確認
- $ awk –version
- GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)
- (後略)
- $ awk -W version
- mawk 1.3.4 20200120
- (後略)
AWKの基本コマンド
- A1 A2 A3 A4 A5
- B1 B2 B3 B4 B5
- C1 C2 C3 C4 C5
- $ awk <オプション> ‘<コマンド>’ <入力ファイルパス>
ファイルの内容を検索・出力する
- $ awk ‘<コマンド>’ sample.txt
- $ awk ‘{ print }’ sample.txt
- A1 A2 A3 A4 A5
- B1 B2 B3 B4 B5
- C1 C2 C3 C4 C5
- $ awk ‘{ printf “%s-%s-%s”, $1, $3, $5 }’ sample.txt
- A1-A3-A5B1-B3-B5C1-C3-C5–$
- $ awk ‘{ printf “%s-%s-%s\n”, $1, $3, $5 }’ sample.txt
- A1-A3-A5
- B1-B3-B5
- C1-C3-C5
- $ awk ‘{ print $3, $5 }’ sample.txt
- A3 A5
- B3 B5
- C3 C5
- $ awk ‘NR==1;NR==3’ sample.txt
- A1 A2 A3 A4 A5
- C1 C2 C3 C4 C5
- $ awk ‘/C4/’ sample.txt
- C1 C2 C3 C4 C5
AWKの変数を使う
- $ awk ‘{ print $NR }’ sample.txt
- A1
- B2
- C3
AWKの関数を利用する
- $ awk ‘{ sub(“B”, “BX”); print }’ sample.txt
- A1 A2 A3 A4 A5
- BX1 B2 B3 B4 B5
- C1 C2 C3 C4 C5
- $ awk ‘{ gsub(“B”, “BX”); print }’ sample.txt
- A1 A2 A3 A4 A5
- BX1 BX2 BX3 BX4 BX5
- C1 C2 C3 C4 C5
AWKのパターン処理
- $ awk ‘/B/{ sub(“B”, “BX”); print }’ sample.txt
- BX1 B2 B3 B4 B5
- $ awk ‘/B/{ gsub(“B”, “BX”); print }’ sample.txt
- BX1 BX2 BX3 BX4 BX5
AWKの主要オプション
- W1,W2,W3
- X1,X2,X3
- Y1,Y2,Y3
- Z1,Z2,Z3
区切り文字を指定する
- $ awk ‘{ print $2 }’ sample.csv
- $ awk -F “,” ‘{ print $2 }’ sample.csv
- W2
- X2
- Y2
- Z2
変数を定義する
- $ awk -v hoge=”H” -v fuga=”F” ‘BEGIN{ print hoge fuga }’ sample.csv
- HF
AWKスクリプトを実行する
- #!/usr/local/bin/gawk -f
- {
- print $1, $3
- }
- $ awk -f script.awk -F “,” sample.csv
- W1 W3
- X1 X3
- Y1 Y3
- Z1 Z3
AWKの制御文
- 2020-05-04 15:30 afternoon snack
- 2020-05-05 10:00 morning snack
- 2020-05-05 15:00 afternoon snack
if文
- {
- if($1 == “2020-05-05”){
- print $0
- }
- }
- $ awk -f script.awk sample.log
- 2020-05-05 10:00 morning snack
- 2020-05-05 15:00 afternoon snack
- {
- if($1 == “2020-05-05” && $3 ~ /^morning/){
- print $0
- }
- }
- $ awk -f script.awk sample.log
- 2020-05-05 10:00 morning snack
while文・for文
- BEGIN{
- for(i = 1; i <= 3; i++){
- sum += i
- }
- print sum
- }
- $ awk -f script.awk sample.log
- 6
delete文
- BEGIN{
- split(“a b c d” , arr, ” “)
- delete arr[3]
- for(i in arr) {
- print i “-” arr[ i ]
- }
- }
- $ awk -f script.awk sample.log
- 1-a
- 2-b
- 4-d
AWKの組み込み関数
数学関数
- sin関数(サイン・正弦をラジアンで返却)
- cos関数(コサイン・余弦をラジアンで返却)
- log関数(自然対数)
- rand関数(乱数)
文字列関数
- length関数(文字列の長さ)
- split関数(文字列の分割)
- tolower関数・toupper関数(大文字小文字変換)
- match関数(正規表現検索)
AWKのユーザー定義関数
- function printarr(arr) {
- print “—–“
- for(i in arr) {
- print i “-” arr[ i ]
- }
- }
- BEGIN{
- split(“a b c d” , arr, ” “)
- printarr(arr)
- delete arr[3]
- printarr(arr)
- }
- $ awk -f script.awk sample.log
- —–
- 1-a
- 2-b
- 3-c
- 4-d
- —–
- 1-a
- 2-b
- 4-d
おわりに
toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。
エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。