やってみた

みなさんこんばんは。いっぱしのシェル芸人たるもの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^)ノ♪

みなさんこんにちは。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をテキストにできます。

みなさんこんにちは。先日とある場所へ雑誌の取材に行ったのですが、ボイスレコーダー代わりに退役したiPhone 4sのボイスメモを使って録音していました。取材は和やかに無事終了し、音声データはGmailを使って自分宛に送信したのですが、VLCメディアプレイヤーで開いてみると、取材相手の声がよく聞こえず、私のよく通る声ばかりが聞こえてきたのです。。。iPhoneを自分の真横に置いてたらそうなりますよね(´・_・`)

これではいかん。取材から日が経つにつれて記憶が薄れていく・・・テープ起こし(って死語ですよね)のために、一旦音声レベルを揃えねば・・・とAudacityを立ち上げてボイスメモのファイル「test.m4a」を読み込ませようとしたものの、Audacityが対応していない。。。ぐぬぬ、こうなったら音声データをWAVにするしかない。VLCメディアプレーヤーで変換するも、うまくWAVに出力してくれないので、ffmpegでコマンドラインから変換する。これで一発だ。

$ ffmpeg -i test.m4a test.wav

あとはAudacityでtest.wavが開けて編集できればOK。ね、簡単でしょう?

Twitterのタイムラインを眺めていたらこんなお悩みの方がいらっしゃいました。

というわけで、シェル芸でやってみることに。フォルダ構成はこんな感じにしました。

[nullpopopo@u24e tmp]$ find $(pwd) -type f | sort -n
/home/nullpopopo/tmp/1/1/wordpress.jpg
/home/nullpopopo/tmp/1/2/wordpress.jpg
/home/nullpopopo/tmp/1/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/1/4/wordpress.jpg
/home/nullpopopo/tmp/1/5/wordpress.jpg
/home/nullpopopo/tmp/1/wordpress.jpg
/home/nullpopopo/tmp/2/1/wordpress.jpg
/home/nullpopopo/tmp/2/2/wordpress.jpg
/home/nullpopopo/tmp/2/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/2/4/wordpress.jpg
/home/nullpopopo/tmp/2/5/wordpress.jpg
/home/nullpopopo/tmp/2/wordpress.jpg
/home/nullpopopo/tmp/3/1/wordpress.jpg
/home/nullpopopo/tmp/3/2/wordpress.jpg
/home/nullpopopo/tmp/3/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/3/4/wordpress.jpg
/home/nullpopopo/tmp/3/5/wordpress.jpg
/home/nullpopopo/tmp/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/4/1/wordpress.jpg
/home/nullpopopo/tmp/4/2/wordpress.jpg
/home/nullpopopo/tmp/4/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/4/4/wordpress.jpg
/home/nullpopopo/tmp/4/5/wordpress.jpg
/home/nullpopopo/tmp/4/wordpress.jpg
/home/nullpopopo/tmp/5/1/wordpress.jpg
/home/nullpopopo/tmp/5/2/wordpress.jpg
/home/nullpopopo/tmp/5/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/5/4/wordpress.jpg
/home/nullpopopo/tmp/5/5/wordpress.jpg
/home/nullpopopo/tmp/5/wordpress.jpg

一撃で消すなら以下のワンライナーで。

[nullpopopo@u24e tmp]$ find $(pwd) -name '*.[jJpPgG][pPnNiI][gGfF]' | egrep -v '(_thumb)' | xargs rm -f

それでは確認してみましょう。

[nullpopopo@u24e tmp]$ find $(pwd) -name '*.[jJpPgG][pPnNiI][gGfF]'
/home/nullpopopo/tmp/1/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/5/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/2/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/4/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/3/wordpress_thumb.jpg
/home/nullpopopo/tmp/3/3/wordpress_thumb.jpg

現場からは以上です。

※ 2014/05/29 14:45追記

[amazonjs asin="4904807073" locale="JP" title="USP MAGAZINE vol.13"]