Linuxコマンドを利用してログを集計する

Linuxコマンドを利用してログを集計する

相変わらず、ログを集計している。
今回は特定の処理を呼ばれたかどうかを集計するだけなので、Pythonスクリプトを作成する必要もない。
日別に何件発生しているのか、集計しようと思う。

最初に結果

1
find . -name 'app.log.20*' | xargs grep -h "my.Program" | cut -b 1-10 | sort | uniq -c | awk '{print $2"\t"$1}' > res.txt

これで日別の件数が取得できた。
パイプで繋がれた、それぞれのコマンドにどのような役割があるのか、以下で説明する。

find

1
find . -name 'app.log.20*'

ログファイルはapp.log.yyyymmddの形式で出力されている。ログディレクトリに保存されているのだが、当月、当年、それより前でディレクトリ構成が異なる。また、異なるシステムのログファイルも含まれているため、事前にファイルの選別が必要になる。それでfindを利用している。

xargs grep

1
xargs grep -h "my.Program"

findの結果をxargsを利用してgrepに通している。
grepでは、見つけたログファイルの中に、特定の文字列(チェック対象のプログラム名)が含まれている行を抽出している。
-hオプションは、grep結果にファイル名が出力されることを抑制するために指定している。

cut

1
cut -b 1-10

grep結果の先頭10バイトは年月日がYYYY/MM/DD形式で書かれている。そこだけを抽出した。

sort

1
sort

次の処理で日別の件数を求めるが、そのコマンドは集計キーが並んでいる必要がある。そのためにcutの結果をsortした。

uniq

1
uniq -c

uniqコマンドで年月日ごとの出力行数をカウントした。
-cオプションが集計数を表示するオプション。
-cオプションが指定されないと、重複行の除去のみ行われる。

awk

1
awk '{print $2"\t"$1}'

uniqの出力結果は”集計件数 集計項目”の順番で出力される。今回の例では下記のように出力される。

1
2
   100 2018/09/01
    98 2018/09/02

しかし、これだとExcelに張り付けたときに見栄えが悪いので、”年月日{タブ}件数”の様に出力順を入れ替えた。

>

1
> res.txt

これまでの処理結果をres.txtに保存した。

まとめ

ここまでくれば、この結果をテキストエディタで開きコピー、Excelの空のシートに張り付け、貼り付け結果のデータをテーブルに変換し、ピボットグラフを作れば集計は終わりだ。

簡単だし、結構なスピードで集計が完了した。
たまにはコマンドも良い。

同じタグの記事
同じカテゴリの記事

標準出力と標準エラー出力のリダイレクト

標準出力と標準エラー出力のリダイレクト

適当に作ったチェックプログラムがある。
cronで日々実行している。
標準出力や標準エラー出力が放置されているので、cronがメールを送ってくれる。
でも、不要なので標準出力と標準エラー出力は適当なファイルにリダイレクトしておいて、
何かの機会に確認する。

最新版の出力だけを保存する場合。

1
command &> file

追記したい場合。

1
command &>> file

追記は古いシステムでは、この記法は使えないため下記の昔ながらの記法を利用する。

1
command >> file 2>&1

これで、cronのメールが止まった。
cronのメールそのものを止めてもいいけど、このメールを頼りにしている人もいるかもしれないので。

同じタグの記事
同じカテゴリの記事

コマンドラインの最大長を確認する

コマンドラインの最大長を確認する

コマンドプロンプトで実行するバッチ処理へ引数を指定する場合、コマンドラインが長くなってしまうことがある。
WindowsのCMD.exeはコマンドラインの長さの限界が短いため、気をつける必要がある。

WindowsXP以降の場合、8,191文字指定できる。
もう、動いているサーバはないと思うが、
Windows2000,NT4.0では2,047文字指定できる。

引数に環境変数を展開したりすると、コマンドラインがとても長くなってしまうことがある。
特に警告もなく、後ろが切れてしまうので注意が必要。

ちなみに、Linuxの場合はコマンドを実行して確認する。

1
2
$ getconf ARG_MAX
2621440

上記の結果は、Red Hat Enterprise Linux Server release 6.5 (Santiago)の場合。

macOS high Sierraでは

1
2
$ getconf ARG_MAX
262144

Red HatとmacOSとでは、コマンドラインの長さが一桁違った。どちらにしてもWindowsと比べたら圧倒的に長いことは確実だが。

同じタグの記事
同じカテゴリの記事

cronで特定の曜日のみ実行

cronで特定の曜日のみ実行

営業日のみ実行させたいバッチプログラムがある。
営業日と言っても、厳密にカレンダーを参照する必要はなく、土曜日・日曜日はスキップさせたい。

cronの登録例は下記の通り。
なお、フォーマットは「分 時 日 月 曜日 コマンド」。

1
0 20 1,5,10,15,20,25,30 * * /home/user01/command.sh

上記の例では、
曜日を問わず、毎月、1,5,10,15,20,25,30日、20時、0分に/home/user01/command.shが実行される。

カンマで複数の数字を区切れる。-で範囲を指定できる。

本題の曜日指定の実行。
土曜日、日曜日を除く、8時から20時までの間、/home/user01/command.shを実行する。

1
0 8-20 * * 1-5 /home/user01/command.sh

曜日は0-7で指定する。0と7が日曜日。

これで、月曜日~金曜日に処理が実行される。

同じタグの記事
同じカテゴリの記事

lsでファイルのみリストする

lsでファイルのみをリストする

データディレクトリにはディレクトリとファイルが混ざって格納されている。その中でもファイルのみをlsでリスト表示したい時は下記の通りコマンドを叩く。

1
ls -lF | grep -v /

ls -Fでディレクトリに/が付与されるようになる。それをgrepで除外する。

例えば、/bin配下のsuidが設定されたファイルのリストを見るには

1
ls -lF | grep -v / | grep rws

ファイル名とディレクトリ名が似通っていたり、grepのキーワードがどちらにも掛かってしまう場合はこの方法が有効。

同じタグの記事
同じカテゴリの記事

touchコマンドでファイルのアクセス時刻変更

touchコマンドでファイルのアクセス時刻を変更

Linuxサーバ上でデータ操作を行っていると、ファイルのアクセス日時を変更したい時がある。
データの改ざんをしたい訳でなく、ファイルのアクセス日時を見てファイルを処理するプログラムが存在するため。
そんな時に利用するコマンド。

1
touch -acmt 09061500 target_file.txt

このコマンドでtarget_file.txtのアクセス日時が9月16日の午後3時になる。

なお、オプションの詳細は下記の通り

-a アクセス時刻のみを変更する。
-c ファイルを作成しない。
-m 修正時刻を変更する。
-t time timeで指定した時刻を使い変更する。

基準となるファイルが存在する場合、その日時を利用することもできる。

1
touch -acmr original_file.txt target_file.txt

しかし、これをcpの結果に対して実行するのであれば、最初からcpのオプションに-pをつければ、時刻もコピーされる。

1
cp -p originate_file.txt target_file.txt
同じタグの記事
同じカテゴリの記事