トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

awkについて のバックアップソース(No.9)

***awk [#y1919cd4]

awkはawkで何ページも書けちゃう内容なんだろうけど、とりあえず今日使ったやつだけ。

こんなテキストファイルがあります。このテキストファイルの名前が「Address.txt」だとします。&br;
まあ、アドレス帳だと思ってください。

 firstName  lastName  address phoneNo
 Shogo      Miyazaki  Tokyo   090-xxxx-yyyy
 Tatsuya    Akasaka   Osaka   080-aaaa-bbbb
 Mayuko     Kobayashi Osaka   080-aaaa-bbbb
 Hana       Takahashi Nagoya  070-cccc-dddd
 Tarou      Omori     Nagoya  070-cccc-dddd
 ・・・・

このアドレスの、苗字だけほしい場合、こんな感じにawkです。

 [root@server tmp]# awk '{print $2}' Address.txt 
 lastName
 Miyazaki
 Akasaka
 Kobayashi
 Takahashi
 Omori

へー、2列目だけ取れた。

じゃあ、このアドレス帳のなかで、Address(住所)が「Osaka」の人のlastName(苗字)がほしいとき、こんな感じでawkします。

 [root@server tmp]# awk '$3=="Osaka" {print $2}' Address.txt 
 Akasaka
 Kobayashi

へー、大阪の人だけ取れた。

ちなみに、|をつかってつなげることも出来ます。つなげるイメージはこんな感じ。

 [root@server tmp]# cat Address.txt | awk '$3=="Osaka" {print $2}'
 Akasaka
 Kobayashi

ちなみに、こうやっても同じ

 [root@server tmp]# cat Address.txt | grep Osaka | awk '{print $2}'
 Akasaka
 Kobayashi

最初の一人だけほしい場合

 [root@server tmp]# cat Address.txt | grep Osaka | head -1 | awk '{print $2}'
 Akasaka

ずいぶん色々出てきた。

awkは正規表現とかも使えるみたいだけど、今日はもうつかれた。リンクを参照。見れば多分出来ます。

***最後の要素だけ取り出したい。 [#k5047698]

頭から順番に値を取り出す方法はわかった。しかし、最後の要素だけ取り出したい場合ってどうすればいいの???

それはこんな感じです。

 awk '{print $NF}' test.log 

これで、test.logの行の最後の要素だけ取れます。

-[[awk の使い方:http://www.iplab.is.tsukuba.ac.jp/script/www.osdp.is.tsukuba.ac.jp/hosokawa/awk/]]

***後ろからn番目の要素を出力する [#ae2a4eea]

こんな感じです。

 awk '/rows=[^0]/ {print $NF, $(NF-1)}' test.log

こんな感じで

-rows=「0」でない行の場合
-最後の要素と後ろから2番目の要素をprint

できます。

ちなみに、manではこんな感じの解説があります。

>The  variable  NF  is  set  to  the total number of fields in the input record.

まあ、「NFは要素の合計数が入ります」ってかいてあるので、後ろから2番目は「NF-1」とかきます。

***区切り文字にタブを指定する [#q8da5f27]

 awk -F"\t" ~

***指定行のみ出力 [#m3618450]
こんな感じです。

 awk 'NR >= 100000 && NR < 101000 {print $0}' ファイル名

10万行~10万1000行目までを抽出し、出力します。

***jmeterのXML形式で出力された結果からレスポンスタイムだけ抽出 [#f40d9090]

元のデータ形式は以下の通り(複数繰り返す)

 <?xml version="1.0" encoding="UTF-8"?>
 <testResults version="1.2">
 <httpSample t="368" lt="367" ts="1318934276264" s="true" lb="SimpleSearch" rc="200" rm="OK" tn="簡易検索スレッド 1-5" dt="text" by="73238">
   <assertionResult>
     <name>アサーション</name>
     <failure>false</failure>
     <error>false</error>
   </assertionResult>
 </httpSample>
 <httpSample t="101" lt="99" ts="1318934276664" s="true" lb="SimpleSearch" rc="200" rm="OK" tn="簡易検索スレッド 1-7" dt="text" by="44589">
   <assertionResult>
     <name>アサーション</name>
     <failure>false</failure>
     <error>false</error>
   </assertionResult>
 </httpSample>
 ・・・

「t="XXX"」がレスポンスタイム。

以下でここだけ抽出。

 awk '/^<http/ { print $2}' jmeter_out.log | sed -e 's/t="\(.*\)"/\1/p' >  out.txt

***パターンマッチした行に含まれる数値を集計 [#acb5aecf]

「Query_time」っていうキーワードが含まれる行の3カラム目を集計する

 awk '/Query_time/ { total += $3 } END { print total }' trace.txt

***あるカラムの数値が一定数よりも小さい場合 [#xb6a0941]

ls -l の結果、ファイルサイズが1000byteよりも少ないファイル名とファイルサイズを抽出するawk

 ls -l | awk ' $5 < 1000 { print $5,$10 }'

***8カラム目がADM*の行の3カラムを出力する [#z6b041a0]
ちなみに、元のファイルはgeonamesってところから日本のデータダンプをダウンロードしてます。

 awk '$8 ~ /ADM.*/ {print $3}' JP.txt  > cityname.txt