shellスクリプトのススメ(コマンドライン編)

シェルスクリプトについて書いてみようかと思います。

今回は、コマンドライン編。で、このブログによく出てくる長ったらしいコマンドに説明とか入れてみようかと思う。
Unix(Linux)には先人達が創り上げてきた洗練された素晴らしいコマンド達が数多くあって、これらを組み合わせて使うことで自分が求めている結果を出すことが出来る。プログラムを組むこともなく。。
各コマンドを組み合わせて使うことでUNIXの哲学にある「全てのプログラムはフィルタとして振る舞うようにせよ。」や「各プログラムが一つのことをうまくやるようにせよ。」を実感することが出来るのではないかと思う。


例えば、これは100文字ちょっとのコマンドの組み合わせで

ウェブサーバのログをみてある特定のアクセス「ABC」をしてきたIPアドレスの国名を出している。  

今は国名を出しているけど、ちょっと変えるとプロバイダとかを出すことができる。

 

簡単な説明

「apache404log.txt」テキストファイルの行の先頭にはIPアドレスがあり、 その行に「ABC」という文字列があった場合、そのIPアドレスの国名を調べる。 ということがたった100文字ちょっとで出来てしまう。  

順番に説明とかしてみると

「apache404log.txt」テキストファイルから「ABC」の文字がある行だけを抜き出す

awk(※1)というコマンド(スクリプト言語)で行の最初の単語(IPアドレス)を抜き出す

並び替える(昇順)※④で重複行を除く為

重複行を除く※⑤で不要な処理をさせない為

whoisコマンド(※2)に1行ずつ引数として渡す

whoisコマンドの結果から「country」の文字がある行だけ抜き出す

sedコマンド(※3)で空白文字を削除する

並び替える(昇順)※⑨で重複行を除く為

重複行を除く※⑩で重複した余分なものを出力しない為

ABC_country.txtとして保存する  

 

上の番号に合わせて見やすくしてみる 僕は1行で書いてしまうことが多いけど、パイプ「|」で改行して見やすくしている方もいる。
これらの処理をプログラム言語で書き出す場合、100文字ちょっとでは書けない。

※1:
awk
テキストファイルを処理するためのスクリプト。
入力ファイルを1行ずつ読取り、セパレータ(データの区切り)単位で文字列操作が出来る。
1区切り目を取得する場合は「$1」とかヤル。

※2:
whoisコマンド
ドメイン情報を参照する。※WHOIS検索で得られた情報はネットワーク管理以外の目的に使用しないでください。
http://www.nic.ad.jp/ja/whois/

※3:
sedコマンド
文字列の置換や削除を行う。「stream editor」に由来するらしい
入力ファイルを1行ずつ読取り、文字の置換を行う。正規表現を使用して文字の置換を行う。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です