awkを使って、サーバー処理とIOに強くなろう #2

2014年11月15日

AWK Tips

環境

linux系のサーバー

基本構文

「1ライン」と、「ファイル書き込み」の2パターンがある。 「1ライン」を覚えると、phpなどでさくっと使えるし、コマンドでさくっとできるので、まずはそこから覚えよう。

目的

SQLの代わりに使う 1、大容量のデータファイルから、なる早でデータを抽出する。 2、データファイル内の検索とヒット件数 3、組み合わせ検索

手順

プログラムファイルとデータファイルを利用 データファイルは、sqlの代わりなので本来ならDB設計から行うべきだが、とりあえずは、レコード式のログデータで代用する。

データファイル

馴染みのあるapacheのaccessログを使う

書き方サンプル

1、apacheログのレコード数(行数)※自宅がubuntuなんでdebianディストリで描きますんで、その他の場合は、ファイルパスを合わせてください。 $ awk '{count++;}END{print count;}' /var/log/apache2/access.log ※logディレクトリに読み取り権限がない場合はsudoを使ってください。 2、useragentに「iphone」がある行数(iphoneのアクセス数) $ awk '{if($0~/iPhone/){count++;}}END{print count;}' /var/log/apache2/access.log

awkのマッチングなどで'(シングルクォーテーション)を使う場合

'(シングルクォーテーション)"\047" に置き換えると、正常にマッチングできる。

awkの指定変数

- [変数名] [内容] - $0 レコード全体の内容 - $n 第nフィールドの内容 - $NF 最後のフィールドの内容 - NR 現在まで読み込んだレコード(行)数 - NF 現在処理しているレコード(行)のフィールド数 - FS フィールドの区切り文字 - OFS 出力フィールドの区切り文字 - FNR 現在処理しているレコード番号(行数) - FILENAME 処理しているファイル名

awkでファイル比較

$ awk 'NR==FNR{data1[$1]++;data2[$1]=$2;next}$1 in data1{print $1" "data2[$1]" "$2}' file1 file2

awkの正規表現

- ◇含む   $1~/abc/ - ◇大文字小文字の区別をしない   tolower($1)=/abc/ - ◇完全一致しない   $1!="abc" - ◇含まない   $1!~/abc/ - ◇完全一致   $1=="abc"

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。