新着記事

2006年01月03日

ログファイルを監視して、特定のキーワードが見つかったら、何らかのコマンドを実行する。

ある商用アプリケーションのログファイルの監視をしてた時に、
さっくり作ってみた。
「ログファイルにあるキーワードが入ってきたら、ダイアログを表示して通知する。」

って、expectコマンドを使っただけなんですけど。

(これ使わなくても、swatchっていう、それようなコマンドもある。)

watch_log_file_now_watching.jpg
ログファイルの監視面倒くさい (´ヘ`;) 




できあがったのはこれ。
ダウンロード

今の実装はキーワードを見つけた時に、
Applescriptでダイアログを出すようにしているので、Mac OSX環境用です。

watch_log_file.shの35行目の、systemから始まる行を変更すれば、
他の環境でも実行できるし、他の処理でも実行できると思う。

watch_log_file_dialog.jpg
キーワードを発見時に表示するダイアログ。Mac OSX 依存。




使い方は
./watch_log_file.sh 監視ファイル 監視キーワード

実行例は
./watch_log_file.sh /var/log/system.log ERRORCODE:128

です。

で、監視しているログファイルに、
指定した「キーワード」が新しく入ってきたら、
上の画像にあるダイアログが表示される仕組みになっています。



本日は以上です。
ではー。




以下はスクリプトの中身 (記事用に、実際のファイルとは少し変えてある)。

・watch_log_file.shというログファイル監視スクリプトと、
・display_dialog.shというダイアログを表示する環境依存なスクリプト
の2つのファイルからできています。

監視しているログファイルの最後の行に、
監視対象のキーワードが入っていたら、しょっぱなからダイアログが出ちゃうけど、
それは仕様です(←えー)。

# watch_log_file.sh
 1 #!/bin/sh
2
3 # change current directory
4 cd $(dirname $0)
5
6 # argument count check
7 if [ $# -lt 2 ]; then
8 cat << EOF
9 argument error.
10 usage:
11 watch_log_file.sh target_file search_keyword
12 EOF
13 exit 1
14 fi
15
16 TARGET_FILE=$1
17 shift
18 KEYWORD="$*"
19
20 # file check
21 if [ ! -f ${TARGET_FILE} ]; then
22 cat << EOF
23 target file is not found.
24 usage:
25 watch_log_file.sh target_file search_keyword
26 EOF
27 exit 1
28 fi
29
30 # run expect command
31 expect -- << EOF
32 set timeout -1
33 spawn tail -1 -f ${TARGET_FILE}
34 expect "${KEYWORD}"
35 system ./display_dialog.sh find keyword: ${KEYWORD} in ${TARGET_FILE}
36 EOF



# display_dialog.sh
 1  #!/bin/sh
2
3 # function for display dialog
4 osa_display_dialog() {
5 if [ $# -lt 1 ]; then
6 cat << EOF
7 argument error.
8 usage:
9 osa_display_dialog display_message
10 EOF
11 exit 1
12 fi
13
14 osascript << EOF > /dev/null
15 tell application "Finder"
16 activate
17 display dialog "$*" as text
18 end tell
19 EOF
20 }
21
22 # argument count check
23 if [ $# -lt 1 ]; then
24 cat << EOF
25 argument error.
26 usage:
27 display_dialog.sh display_message
28 EOF
29 exit 1
30 fi
31
32 # run function osa_display_dialog
33 osa_display_dialog "$*"

posted by 小見 拓 at 03:20| Comment(0) | TrackBack(1) | コマンドライン | このブログの読者になる | 更新情報をチェックする

2005年12月07日

開いたターミナルのウィンドウごとに背景色、文字色、その他設定を変更する

たとえば、
sshなどで幾つかのサーバーにログインして設定ファイルを弄ったり、
ローカルでログの監視をしてたり、
データベースのデータを見てたりすると、
モニター上がターミナルのウィンドウですぐ埋まってしまいます。


そうすると、どのウィンドウで、どんな作業をやっていたのか、
判りづらくなったりするわけですね。
sh_many_terminal_window.jpg
画面がウィンドウで埋まる埋まる。




そこで、ターミナルのウィンドウごとに
ターミナルの背景色、文字色、その他設定を変更して、
区別しやすくするスクリプトを組んでみた。


使ってみた様子はこんな感じ。
sh_many_terminal_window_with_color.jpg

色が派手になってしまったので、実際に使うなら、色は個人で調節した方が良い。




使い方は、
このスクリプトをダウンロードして、解凍して、適当なディレクトリにコピー。
シェルの設定ファイルで読み込むようにしてください。

. /path/to/ch_term_color.sh

↑こういう行をシェルの設定ファイルを追加する。
"/path/to/"の部分は、実際にファイルのあるディレクトリまでのPATHと置き換えること。


そうすると、ターミナルのウィンドウを開くたびに、
開いたターミナルの背景色と、文字色、その他が変わるようになります。


なお、AppleScriptを使っているので、Mac OSXでしか動きません。
さらに、Pantherのbash、zsh、Tigerのzshでしかテストしていません。




本日は以上。
では。





以下はスクリプトの中身。
作りは雑だが、一応動く。
ウィンドウを4つ開くごとに設定が一周するようにした。
色は、"red", "green", "blue", "cyan", "magenta", "yellow", "purple", "black"あたりが使える(他にもあるけど)。
#!/bin/sh
########################

# get last char
lc=$(tty | sed -e 's#.*\(.\)$#\1#')

# switch case
case ${lc} in
1|5|9|d)
background="black"
cursor="green"
normal_text="yellow"
bold_text="red"
;;
2|6|a|e)
background="red"
cursor="black"
normal_text="green"
bold_text="yellow"
;;
3|7|b|f)
background="yellow"
cursor="red"
normal_text="black"
bold_text="green"
;;
4|8|c|0)
background="green"
cursor="yellow"
normal_text="red"
bold_text="black"
;;
*)
echo "unknown tty last char"
exit 1
;;
esac

# run applescript
osascript << EOF
tell application "Terminal"
tell window 1
set background color to "${background}"
set cursor color to "${cursor}"
set normal text color to "${normal_text}"
set bold text color to "${bold_text}"
end tell
end tell
EOF

posted by 小見 拓 at 01:50| Comment(0) | TrackBack(0) | コマンドライン | このブログの読者になる | 更新情報をチェックする

2005年05月04日

tempfile -- Generate temporary files (Mac OSX)

tempfileは、OSXのパッケージ管理ツールのfinkをインストールすると、
デフォルトでは/sw/sbinにインストールされているコマンドです。


コマンド名を見ただけで推測がつくと思いますが、
このコマンドは、一時ファイルを作成するためのコマンドです。
シェルスクリプトを多用する人にはきっと役に立ってくれるでしょう。


コマンドのオプションはいろいろありますが、
何もオプションを指定しない場合、
/tmpに適当な名前のファイルを作成して、
そのファイルへのPATHを返します。


このコマンドをシェルスクリプトの中で使う場合は、
大体このようになるでしょう。

# tempfileコマンドで一時ファイルを作成して、
file=$(tempfile)

# その一時ファイルを使って何か処理をして、
..... ${file}

# 必要無くなったら一時ファイルを消す。
if [-f ${file} ]
then
rm -f ${file}
fi


このtempfileコマンド、デフォルトではインストールされていなかったのですね。
今まで/usr/binにでも入っているかと思っていました。



本日は以上です。



# 自宅のMacマシンのOSを最新にして、
# ついでに、vimエディタのバージョン7のGUI版をコンパイルして使い始めましたが、
# 日本語のエンコーディングの判定精度が
# 素晴らしく良くなっている気がします。。
# これはきっと気のせいではないですなぁ。
# 改良されたのか、それとも、今までの環境が悪かったのか。。
posted by 小見 拓 at 13:15| Comment(5) | TrackBack(1) | コマンドライン | このブログの読者になる | 更新情報をチェックする

2005年03月01日

16進数表記に変換するユーティリティ xxdコマンド

vimコマンドに添付されているxxdコマンド。

このコマンドを使うと人間の目に見やすい形で、
ファイルを16進数表記に変換したり、そこから戻したりできます。



こういう内容のファイルがあるとして、
" curcmdmode.vim: extends the notion of Vim's mode() function

↓ このコマンドで変換すると、

0000000: 2220 6375 7263 6d64 6d6f 6465 2e76 696d  " curcmdmode.vim
0000010: 3a20 6578 7465 6e64 7320 7468 6520 6e6f : extends the no
0000020: 7469 6f6e 206f 6620 5669 6d27 7320 6d6f tion of Vim's mo
0000030: 6465 2829 2066 756e 6374 696f 6e0a 2220 de() function."
こうなります。
左に位置、中央に16進数表記の情報、右に元のファイルの情報を表示します。
ここから元に戻すときは、中央の16進数表記情報から元に戻すみたいですね。



このコマンドは、シンプルなコマンドです。
次の使い方を覚えておくと良いでしょう。

・指定のファイル(file.txt)を16進数表記にして、その結果を出力する。
xxd file.txt

・上のコマンドで16進数表記にしたファイル(file.hex)を元に戻して、その結果を出力する。
xxd -r file.hex



このコマンドは、2進数表記でも出力することができます。
・指定のファイル(file.txt)を2進数表記にして、その結果を出力する。
xxd -b file.txt
でも、2進数表記の状態からは、このコマンドでは元に戻せなかったりします。
ふむ。





本日は以上です。
では〜。
posted by 小見 拓 at 03:00| Comment(0) | TrackBack(0) | コマンドライン | このブログの読者になる | 更新情報をチェックする

2005年02月16日

CSVファイルの「でこぼこ」を正すperlスクリプト (日曜大工プログラミング)

下のような、CSV形式のファイルがあります。
(「国内株式2005/2/15 値上がり率上位20銘柄」から作成したデータです。)


Excelで見るならともかく、テキストエディタで見る場合、
各データの幅が違っているため、縦の列がとてもわかりづらいですよね。
formatCSV_pl_pre.jpg
(>_<) でこぼこ〜




このCSVファイルの各データに、半角スペースを必要な数だけ追加して、
各データの幅を統一、整形してしまうperlスクリプトを作成してみました。

その作ったスクリプトのコードが↓

#!/usr/bin/perl -w
use strict;

my @list = ();
while (<>) {
s/\x0d\x0a|\x0d|\x0a/\n/g;
chomp;
my @fs = parse_csv_file($_);
my @dbld = dbl_quoted_array(@fs);
push(@list, \@dbld);
}
my @sizelist = count_max_field_size(@list);

# print
foreach (@list) {
my @line = @$_;
for (my $i = 0; $i < @line; $i ++ ) {
if ($i + 1 < @line) {
print formatted_string($line[$i], $sizelist[$i]) . ',';
} else {
print $line[$i];
}
}
print "\n";
}


# parse csv file, and return field values array
sub parse_csv_file {
my $text = shift;
my @new = ();
push(@new, $+) while $text =〜 m{
"([^\"\\]*(?:\\.[^\"\\]*)*)",?
| ([^,]+),?
| ,
}gx;
push(@new, undef) if substr($text, -1,1) eq ',';
return @new;
}

# return double quoted string array
sub dbl_quoted_array {
my @new = ();
foreach my $i (@_) {
if (defined $i && $i ne '') {
$i =〜 s/\"/\"\"/g;
$i = '"' . $i . '"';
push(@new, $i);
} else {
push(@new, '""');
}
}
return @new;
}

# count max size
sub count_max_field_size {
my @new = ();
foreach my $l (@_) {
my @one = @$l;
for (my $i = 0; $i < @one; $i ++ ) {
my $str = $one[$i];
my $len = length $str;
if ($i < @new) {
if ($len > $new[$i]) {
$new[$i] = $len;
}
} else {
push (@new, $len);
}
}
}
return @new;
}

# put en quad if string length is short
sub formatted_string {
my $str = $_[0];
my $len = $_[1];
my $strlen = length $str;
if ($strlen < $len) {
my $sub = $len - $strlen;
$str = $str . (' ' x $sub);
}
return $str;
}
↑公開時より、少し修正が入っています。



標準入力からCSV形式のファイルを読み込ませると、
整形して吐き出すようになっています。
このスクリプトの実行例
./formatCSV.pl < csvfile.csv

もし、他のファイルに保存するなら
./formatCSV.pl < csvfile.csv > formatted.csv


実行結果は、下のようになりました。
formatCSV_pl_post.jpg



このスクリプトのお持ち帰りはこちらから。



本日は以上です。
posted by 小見 拓 at 03:34| Comment(0) | TrackBack(0) | コマンドライン | このブログの読者になる | 更新情報をチェックする

2004年06月13日

A free XSLT processor, written in Java, XT の Mac OSX用 CUIパッケージ

リニューアル中の本サイト、ちょっとだけ更新した。でもトップページのみ。


サイトのリニューアル作業中で、かつ前のサイトのソースもビルド通らない状態なので、今の所トップページぐらいしか更新できないので、仕方ない。



さて、本題に入りましょう。


今回の更新で、リニューアル中の本サイトにアップしたのは、BLNZ.comで公開されている、フリーのJava製XSLTプロセッサを、Mac OSXのターミナル上でお手軽に使える状態まで持っていく、インストーラー付きパッケージです。

こいつは当然、Mac OSXでしか使えないです。


このパッケージは、xt という名前のXSLT処理を行うシェルスクリプトの実行ファイルを、/usr/local/binディレクトリに作成するものです。


このxtのコマンドの書式は以下のとおりです。


xt source stylesheet [result] [param=value]...

引数を2つ以上とって、sourceというXMLファイルを、stylesheetというXSLTで処理します。



もっと詳しい使い方を知りたいなら、/usr/local/srcディレクトリにソースファイルとドキュメントが入れてあるので、そこのディレクトリのindex.htmlを見てください。


そのドキュメントを読むと、このxtというプロセッサは、いろいろできることがわかると思います。


で、ちょっと残念な話。


このxtというXSLTプロセッサは、shift_jisなどの文字コードをサポートしてない。(utf-8はサポートしている。)


だから、このプロセッサを使う人は、


  • あらかじめ、XMLファイル、XSLTファイルをUTF-8とか、XTが対応する文字コードで編集するか、

  • XSLT処理を行う直前に、XMLファイル、XSLTファイルの文字コードを変換する


必要がある。


Mac OSXで文字コードを簡単に変更するには、


  • テキストエディタなどで変換する。

  • iconvコマンドで文字コードを変換する。


のどちらかが良いと思う。


iconvコマンドで文字コードをutf-8に変換するなら、そのやり方は、以下のようになる。

iconv -f 元の文字コード -t utf-8 変換するファイル > 変換後のファイル


もし仮に、元ファイルの文字コードがshift_jisなら、

iconv -f shift_jis -t utf-8 変換するファイル > 変換後のファイル

で文字コードをutf-8にしたファイルが得られるはずです。



文字コードutf-8のXMLファイルと、文字コードutf-8のXSLTファイルで、XSLT処理を行うと、大抵結果のファイルも文字コードutf-8になってしまうので、


もし、utf-8とは違う文字コードの結果ファイルが欲しいなら、
XSLT処理の後で、好きなエンコードに変換してください。


ちなみにiconvコマンドが対応している文字コードは、


iconv -l

でわかります。




本日は以上。ではでは。


わき道それまくり。
posted by 小見 拓 at 02:48| Comment(0) | TrackBack(0) | コマンドライン | このブログの読者になる | 更新情報をチェックする

2004年06月07日

/usr/bin/cpan コマンドを使ってみよう。

今日のお題
「 /usr/bin/cpan 」


このコマンドがどのようなものかは、
コマンド名からだいたい推測できると思います。


このコマンド一発で CPANシェル を起動させられます。


それでは実際に使ってみます。
環境は Mac OSX 10.3です。
このcpanコマンド自体は Fedora Core にも、Cygwin にも入ってました。


インストールするモジュールは HTML::TokeParser とします。
このHTML::TokeParserモジュールは、HTMLをパースして、指定のタグ内の文字などを取り出すときに使用するものです。


1


最初にこのコマンドを入力すると、
環境設定するように求められます。

sudo cpan

対話型インターフェースで環境設定を行います。


ほとんどの場合はEnter押していれば良いと思います。
デフォルトだと、ホームディレクトリに「.cpan」ディレクトリが作られて、そこに環境設定が保存されます。


2


環境設定が終わったら、CPANシェルに入れます。
cpanコマンド2度目以降は、直接この状態になります。

cpan>



3


指定のモジュールをCPANシェルを使ってインストールします。

cpan> install HTML::TokeParser



4


インストールが終わったら、CPANシェルを終了させます。

cpan> quit



5


正しくインストールされたか、試してみましょう。


インストールしたモジュールを使用するスクリプトを書いて、
(このファイル名は仮にparse.plとしておく。)

#!/usr/bin/perl
# parse.pl

use HTML::TokeParser;

my $file = shift;
my $p = HTML::TokeParser->new($file);

while ($p->get_tag('title')) {
print $p->get_text(), "\n";
}


下のように実行してみて、
HTMLファイルのtitleタグの中身が出力されていれば成功。

perl parse.pl HTMLファイル



6


CPANシェルでインストールすると、ドキュメントも一緒にインストールされるので、

perldoc HTML::TokeParser

とすれば、そのモジュールの詳しい使い方もわかる。



本日は以上。

posted by 小見 拓 at 01:31| Comment(0) | TrackBack(0) | コマンドライン | このブログの読者になる | 更新情報をチェックする
記事検索
 
カテゴリ
最近のコメント
QKCのインストール [3-4/18]
 ⇒ kova (05/23)
calendar.vimには日記をつける機能があったらしい。
 ⇒ とまと (03/07)
最近よく見るようになったvimスクリプトのコメントの書き方
 ⇒ 小見 拓 (02/13)
 ⇒ kana (02/11)
vimエディタ ヘルプのgrep
 ⇒ みかん (07/15)
指定したカラム位置にテキストを流し込む (vimエディタ)
 ⇒ こみ (03/20)
 ⇒ とおりすがり (03/19)
 ⇒ こみ (03/18)
 ⇒ takayama (03/18)
tempfile -- Generate temporary files (Mac OSX)
 ⇒ take3 (01/20)
 ⇒ こみ (01/19)
 ⇒ take3 (01/18)
 ⇒ こみ (01/17)
 ⇒ take3 (01/14)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#2
 ⇒ (06/30)
 ⇒ Tetsuya Kuramochi (06/29)
 ⇒ Tetsuya Kuramochi (06/29)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#1
 ⇒ (06/03)
 ⇒ Tetsuya Kuramochi (06/02)
最近のトラックバック
vimエディタで「文字コード、改行コードを変更して保存する。」
 ⇒ window.closed (04/25)
 ⇒ himesuke’s STEP-log (03/18)
 ⇒ PukiWiki/TrackBack 0.2 (05/07)
vimエディタの折りたたみ機能の話。その2 (foldmethod=syntax)
 ⇒ 俺の基地 (PukiWiki/TrackBack 0.3) (04/20)
ログファイルを監視して、特定のキーワードが見つかったら、何らかのコマンドを実行する。
 ⇒ Apple Fan (10/16)
ファイル保存ダイアログの初期ディレクトリについての話 (vimエディタ話)
 ⇒ ナレッジエース (07/23)
:e <C-x> (編集中のファイルと同じディレクトリにあるファイルを開く。)
 ⇒ ボクノス (02/07)
Opening many files using wildcards.
 ⇒ PukiWiki Plus! (PukiWiki/TrackBack 0.4) (10/28)
 ⇒ 川o・-・)<2nd life (07/18)
vimエディタで印刷自由自在 その8 -エディタからの直接の印刷の代わりに、2html.vimスクリプトを使用する-
 ⇒ Knoppix Temporary Directory (PukiWiki/TrackBack 0.3) (02/19)
検索でマッチした対象に対して、置換を行う。(vimエディタ話)
 ⇒ 123net :: 開発日記 (12/31)
ごみ箱にファイルを叩き込むスクリプト。(vimエディタ)
 ⇒ "OSX" .app's :Macのアプリを便利、感動、面白をベースにほぼ日刊で紹介。 (11/26)
パーセント、%、percent でのカーソル移動 (vimエディタ話)
 ⇒ プログラミング言語 (10/11)
過去ログ
Profile
小見 拓
mail@nanasi.jp
小見と申します。
神奈川でデベロッパーやってます。
名無しのVIM使い

RSS 1.0


広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。