awk <古くて新しいLL>
awkを使い始めて30年。jgawk.exeをDOSで使ったのが最初だ。
その後UNIXを使うようになった。 UNIXは設定ファイルもログもテキストファイルだからgrepやcat,cut,sort,head,wcなんかで作業するのだが、ちょっと複雑な作業はawkやperlなどのスクリプト言語(LL)を使うことになる。
今時は何でもExcelに読み込んで処理できる。 昔は数Gbyteのログはオンメモリで処理できないから逐次処理するしかなかった。逐次処理はOneLinerが使えるかどうかで作業効率がずいぶん違う。
例えば、「httpdのaccesslogから特定の日の05:10:00~06:10:50の間のステータスコード500のアクセス元を取り出す」作業はgrep,cut,wcを使うとできるけどawkを使うと100倍簡単だ。
当時いつでも使えるようにしていたスクリプトは
- radiusの認証ログから特定ユーザのlogin/logoutを抜き出すスクリプト
- UNIXタイムで記録されたsquidのログをローカルタイムに変換するスクリプト
radiusのlogは1レコードが複数行なのでgrepでは難しい。
UNIXタイムで記録されたsquidのlogは見ただけでは日時が分からないので、サーバーのログを見るたためには必須だった。
当時perlやgawkは全てのUNIXにインストールされているわけではなかったし、manも満足にインストールされていないことが多かったのでawkを使っていた。
awkはどのUNIXにも必ず入っているしmanも使えた。
gawkはあるかどうか分からないから拡張機能は使わないようにしていた。 というか「プログラミング言語 awk」で勉強したので拡張機能を知らなかったりする。だから、空白でもなく記号でもない文字を表す正規表現は"\w"でもなく"[[:alnum:]_]"でもなく"[_0-9a-zA-Z]"を使っている。
最近はUNIX=LINUXになったのawkはgawk(gnu awk)だawkもあるけどgawkへのlinkになってる。
だから互換性はあまり気にしなくても良いのかもしれない。
プログラミングしているとアスキーコード表が欲しいときがある。そんな時に使える1liner。これまで一番多く使っている。
↓DOS/Windows
>gawk "{for(i=32;i<128;i++)printf(\"%c %02x\",i,i)}" |
↓UNIX
$ awk '{for(i=32;i<128;i++)printf("%c %02x",i,i)}' |
↓Enterを押すと表示される。
20 ! 21 " 22 # 23 $ 24 % 25 & 26 ' 27 ( 28 ) 29 * 2a + 2b , 2c - 2d . 2e / 2f |
ところで、いまさらだけど、gawkは3.10からscketが使えるようになっていたらしい。
BEGIN { |
↑こんな感じで
HTTPクライアントが書ける。 (当然だけどレンダリングはできない。)
« なぜ、優秀な人ほど成長が止まるのか | トップページ | なぜなぜ分析(実践編) »
「書籍・雑誌」カテゴリの記事
- 責任あるAI <「AI倫理」は「AIを使う人の倫理」>(2021.09.24)
- 好きのパワーは無限大 <笑顔のヒミツがココにある>(2021.06.30)
- AM/FMラジオ&トランスミッタ製作集(2021.06.25)
- 起業の天才(2021.06.23)
- 不屈の棋士 <AIの捉え方と情報リテラシ->(2021.06.06)
「プログラミング」カテゴリの記事
- GMC-4で動く3連ナイトライダー(2022.12.30)
- プログラミング言語ランキング(2022.11.19)
- AWSでサービス構築(2022.05.29)
- Excelの配列式(2022.01.06)
- ローコード・プログラミング(2021.11.07)
コメント