【Perl】perlで検索と置換をしてみた
業務で使うネタを教材にして勉強していけば、やった結果が目に見えてわかるだろうと思った。
まずは、UNIXコマンドでいうところのgrepとsedをperlでやってみた。
※さっきウソ書いてしまいました。
正 $ perl -ne 'print if (m/session (opened|closed)/)' /var/log/messages
誤 $ perl -ne 'print if (m/session [opened|closed]/)' /var/log/messages
[]でくくっちゃうと、「session odc」なんていうログも引っ掛けてしまうので、
単語単位でひっかけたいなら、文字クラス「[]」ではなく、パターングループ「()」で
引っ掛けるべきなのですね。
■ メールのログから、送信成功の行を抜き出す
$ perl -ne 'print if (m/sent/)' /var/log/maillog
Nov 8 06:00:02 intra1 postfix/local[12546]: DC72F8F839C: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=1, status=sent (forwarded as 01DEA8F8392)
Nov 8 06:00:02 intra1 postfix/smtp[12548]: 01DEA8F8392: to=<shasta@example.info>, orig_to=<root>, relay=mx.example.info[192.168.0.2], delay=0, status=sent (250 Ok: queued as 1BF4C76873C)
Nov 8 07:31:33 intra1 postfix/local[16078]: 5AFB38F8057: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=0, status=sent (forwarded as AE9F58F824E)
Nov 8 07:31:34 intra1 postfix/smtp[16079]: AE9F58F824E: to=<shasta@example.info>, orig_to=<root>, relay=mx.example.info[192.168.0.2], delay=1, status=sent (250 Ok: queued as EF4807681A1)
Nov 8 09:01:01 intra1 postfix/local[19426]: 9620E8F8392: to=<shasta@intra1.example.com>, orig_to=<shasta>, relay=local, delay=0, status=sent (forwarded as A91608F839C)
Nov 8 09:01:01 intra1 postfix/local[19424]: 8F0DA8F83BB: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=0, status=sent (forwarded as B02E18F8392)
・・・
■ 正規表現を使って、sshでのログイン|ログアウトの履歴を抜き出す
$ perl -ne 'print if (m/session (opened|closed)/)' /var/log/messages
Nov 8 15:39:31 intra1 sshd(pam_unix)[1709]: session opened for user shasta by (uid=0)
Nov 8 15:40:24 intra1 su(pam_unix)[1926]: session opened for user root by shasta(uid=1000)
Nov 8 15:46:06 intra1 su(pam_unix)[1926]: session closed for user root
Nov 8 15:46:06 intra1 sshd(pam_unix)[1709]: session closed for user shasta
Nov 8 15:48:15 intra1 sshd(pam_unix)[2722]: session opened for user shasta by (uid=0)
Nov 8 15:48:28 intra1 su(pam_unix)[2947]: session opened for user root by shasta(uid=1000)
Nov 8 15:48:46 intra1 su(pam_unix)[2947]: session closed for user root
Nov 8 15:48:54 intra1 sshd(pam_unix)[2722]: session closed for user shasta
・・・
■ ログの日付を置換してみる
元のログ
Nov 8 04:02:11 intra1 syslogd 1.4.1: restart.
Nov 8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)
$ perl -ne 'print if (s/Nov /11\//)' /var/log/messages
11/8 04:02:11 intra1 syslogd 1.4.1: restart.
11/8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)
置換後は上記のようになった
■ ログの小文字を大文字にしてみる
元のログ
Nov 8 04:02:11 intra1 syslogd 1.4.1: restart.
Nov 8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)
$ perl -ne 'print if (tr/a-z/A-Z/)' /var/log/messages
NOV 8 04:02:11 INTRA1 SYSLOGD 1.4.1: RESTART.
NOV 8 04:02:26 INTRA1 CLAMD[2689]: DATABASE CORRECTLY RELOADED (299083 SIGNATURES)
置換後は上記のようになった
まずは、UNIXコマンドでいうところのgrepとsedをperlでやってみた。
※さっきウソ書いてしまいました。
正 $ perl -ne 'print if (m/session (opened|closed)/)' /var/log/messages
誤 $ perl -ne 'print if (m/session [opened|closed]/)' /var/log/messages
[]でくくっちゃうと、「session odc」なんていうログも引っ掛けてしまうので、
単語単位でひっかけたいなら、文字クラス「[]」ではなく、パターングループ「()」で
引っ掛けるべきなのですね。
■ メールのログから、送信成功の行を抜き出す
$ perl -ne 'print if (m/sent/)' /var/log/maillog
Nov 8 06:00:02 intra1 postfix/local[12546]: DC72F8F839C: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=1, status=sent (forwarded as 01DEA8F8392)
Nov 8 06:00:02 intra1 postfix/smtp[12548]: 01DEA8F8392: to=<shasta@example.info>, orig_to=<root>, relay=mx.example.info[192.168.0.2], delay=0, status=sent (250 Ok: queued as 1BF4C76873C)
Nov 8 07:31:33 intra1 postfix/local[16078]: 5AFB38F8057: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=0, status=sent (forwarded as AE9F58F824E)
Nov 8 07:31:34 intra1 postfix/smtp[16079]: AE9F58F824E: to=<shasta@example.info>, orig_to=<root>, relay=mx.example.info[192.168.0.2], delay=1, status=sent (250 Ok: queued as EF4807681A1)
Nov 8 09:01:01 intra1 postfix/local[19426]: 9620E8F8392: to=<shasta@intra1.example.com>, orig_to=<shasta>, relay=local, delay=0, status=sent (forwarded as A91608F839C)
Nov 8 09:01:01 intra1 postfix/local[19424]: 8F0DA8F83BB: to=<root@intra1.example.com>, orig_to=<root>, relay=local, delay=0, status=sent (forwarded as B02E18F8392)
・・・
■ 正規表現を使って、sshでのログイン|ログアウトの履歴を抜き出す
$ perl -ne 'print if (m/session (opened|closed)/)' /var/log/messages
Nov 8 15:39:31 intra1 sshd(pam_unix)[1709]: session opened for user shasta by (uid=0)
Nov 8 15:40:24 intra1 su(pam_unix)[1926]: session opened for user root by shasta(uid=1000)
Nov 8 15:46:06 intra1 su(pam_unix)[1926]: session closed for user root
Nov 8 15:46:06 intra1 sshd(pam_unix)[1709]: session closed for user shasta
Nov 8 15:48:15 intra1 sshd(pam_unix)[2722]: session opened for user shasta by (uid=0)
Nov 8 15:48:28 intra1 su(pam_unix)[2947]: session opened for user root by shasta(uid=1000)
Nov 8 15:48:46 intra1 su(pam_unix)[2947]: session closed for user root
Nov 8 15:48:54 intra1 sshd(pam_unix)[2722]: session closed for user shasta
・・・
■ ログの日付を置換してみる
元のログ
Nov 8 04:02:11 intra1 syslogd 1.4.1: restart.
Nov 8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)
$ perl -ne 'print if (s/Nov /11\//)' /var/log/messages
11/8 04:02:11 intra1 syslogd 1.4.1: restart.
11/8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)
置換後は上記のようになった
■ ログの小文字を大文字にしてみる
元のログ
Nov 8 04:02:11 intra1 syslogd 1.4.1: restart.
Nov 8 04:02:26 intra1 clamd[2689]: Database correctly reloaded (299083 signatures)
$ perl -ne 'print if (tr/a-z/A-Z/)' /var/log/messages
NOV 8 04:02:11 INTRA1 SYSLOGD 1.4.1: RESTART.
NOV 8 04:02:26 INTRA1 CLAMD[2689]: DATABASE CORRECTLY RELOADED (299083 SIGNATURES)
置換後は上記のようになった
トラックバック(0)
このブログ記事を参照しているブログ一覧: 【Perl】perlで検索と置換をしてみた
このブログ記事に対するトラックバックURL: http://www.blogcube.info/cgi-bin/mt-tb.cgi/45
