awkについて の変更点
Top / awkについて
- 追加された行はこの色です。
- 削除された行はこの色です。
- awkについて へ行く。
- awkについて の差分を削除
***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 ***先頭に現在日時を追加する。 [#p0b35123] こんな感じでできます。 echo aaaa | awk '{ ct = strftime("%Y%m%d%H%M%S");print ct,$0}' ***ls -lの出力のファイルサイズを合計する。 [#h649c06a] こんな感じです。 ls -l | awk '/^-r.*/ { size+=$5 } END { print size }'