まるもの勉強日記。

実はSE目指してます。

「入門者のLinux」第九章

 

第九章「awkを使ってみよう!」

 

ワンライナーでの強力な武器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」はバグが出にくい。


 

難しくなってきましたな。

 

明日から学校お休みだぞーん。

お勉強するんだぞーん。