awk

awk で Apache のアクセスログを時間範囲指定で検索

estis2019/02/09 (土) 23:56 に投稿

対象は、Apache のアクセスログ。

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


127.0.0.1 - - [10/Feb/2019:00:00:14 +0900] 127.0.0.1:80 "GET /server-status?auto HTTP/1.1" 200 1325 "-" "munin/2.0.43 (libwww-perl/6.05)" 1081

 

時間は、第4列に
 [10/Feb/2019:00:00:14
のように、記述されている。

 

時間の指定は、hh:mm:ss 形式で、
09:10:11
のように指定したい。

第4列を最初の:(年の後の:)で二つの列に分けて、第4列後半部分と比較したい。

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