awk

awk 特定行以外を出力

estis2014/06/19 (木) 07:05 に投稿

A1行〜B1行以外(B1 > A1)
 A1 != 1
  'NR == 1, NR == A1 - 1; NR == B1 + 1, 0'
 A1 == 1
  'NR == B1 +1, 0'

A1行〜B1行、A2行〜B2行以外(B1 > A1, A2 > B1, B2 > A2)
 A1 != 1
  'NR == 1, NR == A1 - 1; NR == B1 + 1, NR == A2 -1; NR == B2 +1, 0'
 A1 == 1
  'NR == B1 +1, NR == A2 - 1; NR == B2 + 1.0'

An行〜Bn行以外(Bn > An, A(n+1) > Bn, B(n+1) > A(n+1))
 A1 != 1
  'NR == 1, NR == A1 - 1; NR == B1 + 1[, NR == A2 -1; NR == B2 +1[, NR == An - 1; NR == Bn + 1][, NR == A(n+1) - 1; NR == B(n+1) + 1]...], 0'
 A1 == 1

awk ログ調査のためのメモ

estis2014/05/01 (木) 21:02 に投稿
$ cat ../tmp 
1 t2
1 f3
1 end
2 t2
2 f2
2 end
3 t2
3 f3
4 t1
3 end
4 f2
4 end

$  awk '{if(c[$1] == 0)print >> $1} ($2~/t/ && $2!~/t2/) || ($2~/f/ && $2!~/f3/){if(c[$1] == 0)c[$1] = 1} $2~/end/{if(c[$1]==0) system("cat "$1" >> LOG")}' ../tmp 
$ ls
1  2  3  4  LOG

$ cat 1
1 t2
1 f3
1 end

$ cat 2
2 t2
2 f2

$ cat 3
3 t2
3 f3
3 end

$ cat 4
4 t1

$ cat LOG 
1 t2
1 f3
1 end
3 t2
3 f3
3 end


$ rm *

Apache エラーログのエラー種類毎に件数をまとめたいので

estis2014/03/12 (水) 23:34 に投稿

Apache エラーログの種類毎に件数をまとめたいのだが、エラーの種類を全て網羅したかどうかがわからない。
それを何とかしたかったので、bash(と一部awk)で強引にスクリプトを作った。

#!/bin/sh

MYIFS=$IFS
IFS="
"

ERROR_LIST=error.list
TARGET_FILE=$1
WHILE_CHK=1

errors_extract(){
	true
	# Apacheエラーログからエラー内容のみを抽出
}

new_pattern(){
	echo -n "*** Not use / *** Input New Pattern: "
        read PATTERN
        echo $PATTERN >> $ERROR_LIST
}

error_chk(){
	for i in $(cat $TARGET_FILE)
	do
		echo 0 > match_chk 
		echo 0 > Not_match_chk 
		for j in $(cat $ERROR_LIST)
		do

MySQLの設定内容を比較したい時

estis2013/06/15 (土) 08:39 に投稿

mysql -e 'show global variables'|awk '{for(i=1; i<=NF; i++)if(NF==1){print $i"#NULL"}else if (i==1){printf "%s", $i"#"} else if(i==NF){print $i} else printf "%s", $i" "}' > FILE

した後

join -t# FILE1 FILE2 > RESULT

となどとして

awk -F# '$2!=$3' RESULT

するとよいのではと思う。

http://d.hatena.ne.jp/fd0/20090801/p1
こちらの方の記事によると、MySQLは、出力先によって出力方法を変えるらしく、
標準出力と、パイプやファイルへリダイレクトした場合では異なるのはそのためだとのことです。

R で、Apacheの処理時間をリクエスト毎にプロットしたいと思ったのだ その1 データ準備編

estis2013/05/26 (日) 11:40 に投稿

Apacheのログフォーマットが、
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D"
の時。

ログの例

192.168.24.51 - - [26/May/2013:10:55:49 +0900] "GET /R/ HTTP/1.1" 200 901 "http://192.168.24.85/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13" 2063
192.168.24.51 - - [26/May/2013:10:55:49 +0900] "GET /icons/blank.gif HTTP/1.1" 304 - "http://192.168.24.85/R/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Version/6.0.4 Safari/536.29.13" 624

Apacheアクセスログからユーザーエージェント毎で集計する

estis2012/10/08 (月) 04:23 に投稿

ログフォーマットが、combinedであることを想定している。

awk -F\" '{UA[$6]++;x++}END{for(i in UA)printf "%s %i %.2f% \n", i, UA[i], UA[i]/x*100}' access_log

出力結果
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) 1 25.00%
SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html) 1 25.00%
Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0 2 50.00%

出現数の降順で並べ替えたいときは

日時範囲指定ログ抽出awkコマンド用ファイル作成シェルスクリプト その2

estis2012/02/09 (木) 03:22 に投稿

日付確認をきっちりするようにした。ただし作業年と同年の日付が対象(日付確認については2月以外で問題は発生しないが)。

とりあえず対象はメールログ(ログの第2フィールドが日付、第3フィールドが:区切りで時刻[hh:mm:ss]となっているもの)。
このバージョンでは、同月内のみ対応。

#!/bin/bash

thisVer (){
        if [ $fromMonth -ne $toMonth ];then
                echo " このバージョンでは、同月内のみの対応です。ごめんなさい。"
                exit 1
        fi
}

iInput (){
        if [ $i -ne 0 ]; then
                echo "入力した値が間違っています。再入力してください。"
        fi
}

check_M (){
        i=0
        checkMonth=-1
        until [ $checkMonth -ge 1 -a $checkMonth -le 12 ]
        do
                iInput

日時範囲指定ログ抽出awkコマンド用ファイル作成シェルスクリプト

estis2012/02/09 (木) 02:14 に投稿

改良版
http://sum.kir.jp/dp/node/1253
を参照ください。

日時範囲を指定してのログ抽出依頼が頻繁にあるので、awk で作業するときの指定内容を作成するシェルスクリプトを作ってみた。
とりあえず対象はメールログ(ログの第2フィールドが日付、第3フィールドが:区切りで時刻[hh:mm:ss]となっているもの)。
このバージョンでは、同月内のみ対応。
簡便な入力値チェックを行っている(2月の日付チェックが手抜き)。

#!/bin/bash

thisVer (){
        if [ $fromMonth -ne $toMonth ];then
                echo " このバージョンでは、同月内のみの対応です。ごめんなさい。"
                exit 1
        fi
}

iInput (){
        if [ $i -ne 0 ]; then
                echo "入力した値が間違っています。再入力してください。"
        fi
}

check_M (){
        i=0
        checkMonth=-1

とあるawkのログ集計法

estis2011/05/02 (月) 22:50 に投稿

今日似たようなことを質問されたので、忘れないようにメモ。


次のようなフォーマットのApacheアクセスログがある。

66.249.69.115 - - [19/Feb/2011:00:00:22 +0900] "GET /dp/user/login?destination=forum%2F60%3Fpage%3D1 HTTP/1.1" 200 63005 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.69.115 - - [19/Feb/2011:00:00:24 +0900] "GET /dp/aggregator/archives/www.cbsnews.com/2009/01/2009/08/30/free-the-h-1bs-free-the-economy?page… HTTP/1.1" 200 112495 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

ここでは、対象ファイルには、事前の操作でその日1日(0:00:00~23:59:59)のログがまとめられているとする。
ここからアクセス元IP毎に、何時何分にアクセスがあったかを集計する。

# awk -F[/:" "] '{IP[$7":"$8]=$1}END{for(i in IP)print IP[i],i}' LOG | sort | awk '{T[$1]=T[$1]" "$2}END{for(i in T)print i" ----"T[i]}' | sort -t. -k1 -n