「入門者のLinux」第九章
第九章「awkを使ってみよう!」
「awk」はテキストデータを色々加工したり処理したりするコマンド。
それ自体がプログラミング言語としての機能を備えている。
[echo 100 200 | awk '{print $1}']
「awk」では、「`」バッククォートではなく、「'」シングルクォートを使う。
[print]...「awk」のコマンド、データを表示する。
[$1]...「awk」の標準入力に流れ込んでくるデータの中の左から1番目の項目
「awk」はデータの切れ目を空白文字やタブで勝手に判断する。
[echo 100 200 | awk '{print $1+$2}'] = 300
「awk」は計算できる。
「awk」にも変数がある。
[echo 100 200 | awk '{x=$1+$2; print x}'] = 300
いったん「x」という変数に「x=$1+$2」を保持し、そのあとprintコマンドで「x」の内容を表示する。
「awk」の中で複数のコマンドを順に実行するにはコマンド同士を「;(セミコロン)」で分かち書きする。
「|(パイプ)」はコマンドの標準出力を別のコマンドの標準入力に流しこむ。
「awk」は標準出力に流れ込んできたデータを処理する。
⇒どんなコマンドであろうが標準出力にテキストデータを吐き出すコマンドなら流し込める。
「awk」は流れてきたテキストデータをすべての行のそれぞれについて処理する。
⇒行ごとに処理を繰り返す。
またUnixには、データはテキスト文化で1行につき1件のデータを表現するという文化がある。
1から100までの整数を全部足したらどうなる?
[seq 1 100 | awk '{s=s+$1; print $1, s}']
[$1 ... 1から100まで順に入る]
[s=s+$1 ... 変数sに$1を足した結果をsを格納せよ]
[print $1, s ... $1とsを画面に出せ]
数学の等号とは違って、「=」は右辺の計算結果を左辺に代入せよって意味。
こうすることで、1から100までの整数を足した数が表示される。
カレンダー問題
前章でやった2015年から2024年までの各年での13日の金曜の求め方が、
[for y in `seq 2015 2024`; do for m in `seq 1 12`; do date -d $y/$m/13 +"%Y %a"; done | grep Fri; done | uniq -c]
う~ん長いねぇ(笑)
この中で、13日の金曜日が3日あった年は何回かを求めるには、
[for y in `seq 2015 2024`; do for m in `seq 1 12`; do date -d $y/$m/13 +"%Y %a"; done | grep Fri; done | uniq -c | awk '{$1==3{print}']
[$1==3] ... 1項目が3だったら表示=13日の金曜日が3日あった年を表示
例えば、4以上とかの時には、
[$1>3]
みたいになる。
こんな感じで「awk」は「{ }」の前に条件判定を置くことができる。
・「awk」は標準入出力で流れてくるデータを柔軟に選別、加工するのが得意。
・「awk」はUnixの標準入出力の中に手軽に埋め込める。
・「awk」はバグが出にくい。
難しくなってきましたな。
明日から学校お休みだぞーん。
お勉強するんだぞーん。