月次アーカイブ: 11月 2014

ニチアサですね、おはようございます。 @nullpopopo でございます。雑誌に掲載する写真を選んでいるのですが、いただいた写真はiPhoneで撮影したものとデジカメで撮影したものが混在していました。前者はタイムスタンプがそのままファイル名になったYYYY-MM-DD_HH.MM.SS.jpg、後者はDSCNNNNN.JPGという連番ファイル名です(蛇足ですがAndroid携帯のファイル名ですとDSC_NNNN.JPGなので、今回取り上げるワンライナーで応用が効くかと)。

これをパソコン(Fedora20)に取り込んで時系列で順番に見たいのですが、コマンドラインですと「ls --full-time」で時系列に並べ替えることができます。しかしnautilusでサムネイル表示するのに、1回1回更新日時順にソートするのも面倒です。じゃあデジカメ画像のほうをリネームしてしまえ!ということで以下のワンライナーを実行。

ls --full-time DSC* | awk '{print "mv",$NF,$6"_"$7"_"$NF}' | sed -e 's/.000000000//g;s/:/./g;s/JPG$/jpg/g' | sh

lsコマンドに--full-timeオプションをつけたときの表示はこんな感じです。

$ ls --full-time DSC* | head -n 1
-rw-r--r-- 1 hamada hamada 1748093 2014-11-04 09:13:48.000000000 +0900 DSC04071.JPG

この出力結果をawkに食わせるのですが、もうここでmvコマンドを表示させてしまいます。実行結果は以下の通り。

$ ls --full-time DSC* | head -n 1 | awk '{print "mv",$NF,$6"_"$7"_"$NF}'
mv DSC04071.JPG 2014-11-04_09:13:48.000000000_DSC04071.JPG

しかしこれだけですと、単に実行したいコマンドが標準出力に表示されるだけでなく、日付のフォーマットもiPhoneのファイル名と異なります。また、拡張子が大文字のままです。なので、リネーム後のファイル名をsedで整形してしまいましょう。なお、元のファイル名(DSCNNNNN)は、iPhoneのファイル名と衝突しないよう、また、元々がデジカメのファイル名だったことがlsだけでわかるように残すこととします。

$ ls --full-time DSC* | head -n 1 | awk '{print "mv",$NF,$6"_"$7"_"$NF}' | sed -e 's/.000000000//g;s/:/./g;s/JPG$/jpg/g'
mv DSC04071.JPG 2014-11-04_09.13.48_DSC04071.jpg

いい感じですね。あとはパイプでshコマンドに渡してあげればリネームできてしまいます。ワンライナーやシェルスクリプトの実行結果が予想できないうちは、このように標準出力に表示させておいて、最後に一気にshに渡してしまうクセをつけると、何度も確認しながらコマンドを組み立てることができます。また、複数ファイルのリネームなどをforで回すより実行結果が速くなりますのでオススメですよ。ね、簡単でしょう?

[amazonjs asin="4904807146" locale="JP" tmpl="Small" title="USP MAGAZINE vol.20"]

みなさんこんばんは。いっぱしのシェル芸人たるものawk力を高めなきゃ(使命感)!と尻に火がついた @nullpopopo でございます。今までは文字列の置換にsedを多用していたのですが、awkでフィールド切り出した後にsedで置換するのもカッコ悪い!パイプの本数は少なければ少ないほどよい!と思い立ったわけでして。

はい、正座して斉藤 博文さんの連載を読みました。ちょっととある事情から某所のディスク使用率を継続的に監視したくて、かつテキストでも残したかったので、こんな感じでログ出力するようにしました。

2014/11/22 00:00:00 / 5
2014/11/22 00:00:00 /dev/shm 0
2014/11/22 00:00:00 /boot 12

<日付> <時刻> <パーティション> <使用率> ってフォーマットですね。ちなみに元のdfはこんな感じで出力されます。

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       18G  784M   16G   5% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/vda1             477M   52M  400M  12% /boot

上記dfの結果から見出しの行を削除して、パーティションの列(最終フィールド)と使用率の列(5フィールド目)を抜き出し、単位の「%」を削除してdateコマンドの出力結果を先頭に加えています。これを実現するシェル芸ワンライナーはこちら。

df -P | egrep -v '^(Filesystem|ファイル)' | awk -v date="$(date "+%Y/%m/%d %H:%M:%S")" '{gsub(/%/, ""); print date,$NF,$5}'

dfコマンドのオプションですが、LVMな領域やNASの領域をマウントしている場合に折り返し表示をしないようにしています。ディスク使用率のパーセンテージさえ表示されればよいので他のオプションはつけていません。

次にdfの結果から見出しの行を削除しています。私はどんなサーバーを構築するときも英語環境にする(日本語をインストールしない)のがほとんどなのですが、手元のマシンが日本語環境のFedoraなので、LANGの設定を引き摺ったときでも見出し行が削除されるように、行頭が「Filesystem」と「ファイル」で始まる行を除いたものが出力されるようにしています。

最後にawkで変数の設定、置換、フィールドの切り出しをやっています。最初に「-v」オプションをつけることで、変数「date」にdateコマンドの出力結果をセットします。次に組み込み関数gsubで%を空文字に削除しています。そして最後にいつものprint文でawk変数「date」と最終フィールド($NF)と5フィールド目($5)を出力しています。

こうしてパイプを2本しか繋がずにdfの出力結果を加工することができました。ね、簡単でしょう?

斉藤さんの「シェル芸」に効く AWK処方箋はUSP Magazineで読めますよ!あ、私も恥ずかしながら隔月(偶数月)号で連載させていただいております(コッソリ)。

[amazonjs asin="4904807138" locale="JP" title="USP MAGAZINE vol.19"]

でわ〜(^o^)ノ♪

みなさんこんにちは。一撃王と呼ばれたいクヨクヨしたおっさん @nullpopopo ですΞ(´ ゚_。`) 先日は一撃スクリプト勉強会お疲れ様でした。私がスケジューリングしたのですが、11月の勉強会ラッシュが終わり気が抜けたところで、雑誌の校正や障害対応とか新規案件の打ち合わせなどでバタバタしておりまして、やっと落ち着いたところで振り返りをば。

まずは参加者の皆様、スタッフの上田さん、りゅうちさん、さくらインターネットの皆様、多々ご協力いただきまして有難うございます。今回も拙い進行でほんと申し訳ございません。。。(;´Д`)ゴヌンナサイゴヌンナサイ

第1回の一撃スクリプト勉強会は私も受講者もエクストリームな進行で、まさにデスマーチといった趣でしたので、今回は先にお題のスクリプトを公開して解説していくスタイルにしたのですが、あまりにも時間が余ってしまい、いやはや難しいところであります。突然のライトニングトークをお願いしたにもかかわらず快く引き受けてくださった上田怪鳥、なぎーさん、本当に有難うございました。

あと、最初にお題のスクリプトを公開してコピペで動かせたとはいえハンズオン形式を取り入れてたので、sshでログインしてvimなどでファイルを編集しますよーってのをアナウンスしても良かったかなーと。数年前まではみんなノートPCを持ってくる以外の選択肢はなかったのですが、ここ最近だとタブレットでタッチパネル操作な方が一定数いて、長いソースのコピーに手間取ったりするケースや、コピーしたソースをペーストするにも、EverNoteやGoogleドキュメントなどに一旦ペーストするなど、んー、変な書式がくっついたりしないかなーと心配になるケースもあったりするので、プレーンテキストを扱えるエディタやsshクライアントも用意してねって念押ししたほうがいいのかなー。。。(´・ω・`)

一撃スクリプト勉強会シリーズに限らず、企業のご厚意で会場を使わせていただいたり、2万円分ものバウチャーを気前よく振る舞っていただいたりしてるので、皆さん「さくらさんマジさくら!」と西新宿や石狩の方角に向かって祈りを捧げr・・・ではなくて、勉強会の成果を持ち帰って反復練習してくださいね。できれば「やってみた」なブログを公開していただけると、当日参加できなかった方々も嬉しかったりしますので。何せ「作っちゃー壊し、作っちゃー壊し」が何度でもできるのがクラウドの良いところですので、ガンガン使い倒しちゃってくださいね☆

次回のネタは半分くらいできてるのですが、今回までのような形式にするか、もっと規模の小さいもくもく会形式にしようかなど、もうちょっと考えようかなーと。「こんなネタやって!」と言ったネタ出しリクエストも大歓迎です。でわ〜♪

みなさんこんにちは。More Access! More Fun!を見て、消費者庁が「悪質な海外ウェブサイト一覧」 (PDF) なるものを公開しているのを知りました。他にも「国及び都道府県における処分事業者一覧(平成15年4月~平成26年10月1日時点)」 (PDF) なる資料で、詐欺会社や個人、違法ドラッグ販売業者などの実名が公開されています。

後者の資料はきっとエクセル方眼紙からPDFにしたのがわかりすぎるほどフォーマットが汚く、ちょっと遊ぶ気になれないのですが、海外ウェブサイトのほうはテキストにしてみたら案外面白かったです。curlでPDFを読もうかと思ったのですが、文字コード変換が面倒だったので、日和ってwgetでPDFをダウンロードしたので厳密にはシェル芸ではないのですが・・・

$ wget http://www.caa.go.jp/adjustments/pdf/141031adjustments_1.pdf ; pdftotext 141031adjustments_1.pdf -raw - | grep http:// | awk '{print $NF}'

これで海外悪質サイトの一覧を抽出することができました。あとはお好きに加工するなに何なりと遊べますね。fedora20の環境ですと、poppler poppler-utilsの2つのパッケージがあればpdfをテキストにできます。