何者にもなれていない5年目のエンジニアブログ

Linuxコマンドを使いこなす。grep、sed、awk ( Linuxコマンドを制するものは障害対応を制す)

今日、紹介するのは、grepsed(置換)とawkです。

例えば、今までずっとコードでベタ書きしていたデータがどんどん増えてきて、データベースでの管理に変えたい時などがありますよね。

例えばこういう時、item_idと値段(price)をあろうことかハッシュで管理してたとします。

ファイル名 item.pmとします。

# item_id と値段の紐付け
$item_price = {
    1 => 5000,
    2 => 3000,
    3 => 1000,
    4 => 1000,
    5 => 6000,
    6 => 7000,
    7 => 1000,
}

で、これをデータベース(item_data (item_id、price))で管理するとなると、

(´-`).。oO(insert into item_data values(1,5000)とかして一個一個入れるしかないか)

と、思いがちですが、次の理由からしたくありません。

1. 面倒。

2. タイプミスする可能性がある。

そこで、

~Linuxコマンド~

を使います。

ここで、やりたいことは、

1. item_idとpriceの行を抜き出したい。

2. priceの","を消したい。

3. クエリを作りたい。

です。

答えからですが、grepsedawkを使って、

grep "=>" item.pm |sed -e "s/,//g"|awk '{print "INSERT INTO api_client VALUES("$1" ,"$3");"}'

で、できます。

説明すると、

1. item_idとpriceの行を抜き出したい。(grep "=>" item.pm で"=>"の行を抜き出す)

2. priceの","を消したい。(置換コマンドsed -e "s/,//g" で、,を消去する。)

3. クエリを作りたい。(awk '{print "INSERT INTO api_client VALUES("$1" ,"$3");" でスペース区切りで数えて左から一つ目のitem_idは"$1" に、三つ目のprice"$3"に代入される)

となります。 このようにLinuxコマンドを使えるとすごい作業効率が上がります。

参考まで

MySQLのNULL値はPerlでいうundef

記事通りです。

一般常識かもしれないんですが、MySQLのNULLってperlでいうundefになります。

ここで大事なのは、

空入力 ""や、()はNULLにならない

ってことです。perlのNOTは、MySQLのNULLじゃないんですね。

MySQLには

無効値の制約

http://www.y2sunlight.com/ground/?MySQL4.1%2F8.Active%20Perl%A4%C7%A4%CEMySQL%A4%CE%CD%F8%CD%D1

というのがあって、数値カラムに数値で始まらない文字列を格納しようとすると、MySQLサーバは0を格納するので、

数値カラムに""などを入力すると、0となります。

そのため、NULLと違い、ユニーク制約などがある場合、ひっかかったりします。

なので、もし空入力があった場合で、プレースホルダーを使ってNULLを入れたい場合なんかは、入力値$inputを

$input = $input ? $input : undef;

とかしてやったりしてundefにしてやらないとNULLにはなりません。

参考まで

mysqlの show tables の条件検索

日ごとにデータなどを管理していると、1000個位のテーブルは行きます。

そんな時、show tablesでtableを見ると、大量にtableが出過ぎて訳の分からない状態になってしまいますよね。

そんな時の条件検索です。

たとえば、gameという言葉が含まれるtableのみ検索したい時は、

show tables like %game%

とします。

insert_ignoreは失敗すると共有ロックが起こる。

insert_ignoreは失敗すると共有ロックが起こるので、その後更新するために、select for updateなどをかけて排他ロック取りにいくような処理にしていると、同じことをしようとした人がいた場合、お互いの共有ロック解除待ちとなるので、デッドロックが発生します。

なので、insert失敗後更新系の処理は、排他ロックがかかるinsert into ~~ on duplicate key updateを使います。

マンガボックスが面白い。

マンガボックスの話です。

これ、単行本が出たら一気に一般に浸透するんじゃないかな って思ってます。

理由ですが、

1. 普通に面白い

今までWeb連載が流行らなかった理由って恐らくは、Web連載の漫画の質が雑誌に比べて低かったからなんじゃないかと思ってます。 漫画は普通に面白いし、雑誌より全然暇な時読めます。

2. コンビニの漫画棚の強さ

あまり、本屋に行く人はいないと思いますが、コンビニなら誰でも行きますよね。

コンビニのあの漫画棚のスペースってものすごい広告効果が高いんじゃないかなと自分の経験上、感じてます。 基本的に最新の売れている漫画しか置きませんが、目に入れば、どこの雑誌で連載されているのか、まずチェックします。 一冊でも気に入った漫画があると、その雑誌は毎週立ち読みするリストに入ります。 あくまで自分ベースなんですが、、 マンガボックスで連載されているマンガの何作品かはコンビニの棚に置かれるだけの面白さを十分に持っていると思ってます。

それによって人の目に触れることが増え、一気に流行るんじゃないかなーと予想してます。

そうなってくれないかな。。