awkコマンド
オークコマンドと読む
sedコマンド同様に、awk スクリプト 対象ファイル で実行する
スクリプトはさらに、パターン {アクション} で構成される
ls -lコマンドの出力結果を抽出して表示する(列選択)
ls -l /usr/bin | awk '{print $5,$9} =5番目と9番目のフィールドだけを表示
最後のフィールドは$NFとも記述できる$(NF-1) で最後から2番目のフィールド
code:awkコマンドによる抽出
5354296 ld.gold
3178200 dwp
1550088 systemd-analyze
1062640 grub2-fstest
1025760 grub2-mkrescue
1006216 ld.bfd
964608 bash
910176 vi
842904 grub2-render-label
833888 grub2-file
正規表現を使ったパターンの指定
マッチさせる正規表現のパターンと、それをどこのフィールドに適用するかを木jつうする
code:パターンで抽出する
# 9番目のフィールドがcpから始まるものだけを表示
155264 cp
145960 cpio
67992 cpupower
# lから始まるリスト(=つまりシンボリックリンク)の一覧を表示
6 apropos
4 awk
10 bashbug
5 bunzip2
5 bzcat
6 bzcmp
6 bzless
・・・省略
5 gtroff
7 i386
3 infotocap
9 psfaddtable
# 参考:通常のls -lの結果
total 62160
-rwxr-xr-x. 1 root root 128512 Nov 2 2018 VGAuthService
-rwxr-xr-x. 1 root root 41544 Oct 30 2018 [
-rwxr-xr-x. 1 root root 29200 Oct 30 2018 addr2line
-rwxr-xr-x. 1 root root 29 Oct 30 2018 alias
-rwxr-xr-x. 1 root root 70176 Jun 9 2014 applydeltarpm
lrwxrwxrwx. 1 root root 6 Jun 1 2019 apropos -> whatis
-rwxr-xr-x. 1 root root 62736 Oct 30 2018 ar
-rwxr-xr-x. 1 root root 33168 Oct 30 2018 arch
-rwxr-xr-x. 1 root root 378080 Oct 30 2018 as
アクションの省略・・・下記3つは全て同じ
awk '$9 ~ /^cp/
awk '$9 ~ /^cp/ {print}
awk '$9 ~ /^cp/ {print $0}
$0=全部のフィールドを選択、print=表示するをそれぞれ省略できる
-Fオプション 区切り文字を指定する
$ awk -F, '{print $1,$2,$3}' score.csv
code:awkで演算処理
# 元データにするcsvファイル
1,osamu,39
2,miyake,74
3,suzuki,59
4,hasegawa,12
5,ino,98
6,tanaka,41
# デフォルトはスペース区切りなので区切り文字をカンマに指定して実行
1,osamu,39
2,miyake,74
3,suzuki,59
4,hasegawa,12
5,ino,98
6,tanaka,41
osamu 39
miyake 74
suzuki 59
hasegawa 12
ino 98
tanaka 41
# スコアを合計して表示
323
# NRは入力レコード数が代入されている組み込み変数なので、それで合計のsumを割る
Average: 53.8333
# 作成したスクリプトをファイルに保存してファイルから実行する
{sum += $NF} END{print "Average:",sum/NR}
# -fでファイルから読み込みができる
Average: 53.8333
シェル芸に効くAWK処方箋
awkの真偽
false = 0(数字), 空文字
true = 上記以外全て
awk 'パターン {アクション}' ファイル名
よく使うやつ
echo "a b c" | awk '{print $2}' $2だけプリントする
echo "a b c" | awk '{$2 = "";print}' $2を消してプリントする
code:awk
PMAC747S:~ mochiko$ echo "a b c" | awk '{print $2}'
b
PMAC747S:~ mochiko$ echo "a b c" | awk '{$2 = "";print}'
a c
PMAC747S:~ mochiko$
文字列の抜き出し
echo 'abcde' | awk '{print sustr($0, 2)}' => 結果 bcde