シェル内でのテキスト編集とパイプ

このブログは、Linuxで構築した自宅サーバから配信しているのですが、稼働後1年以上が経過し、各種ログファイルが増えてきました。あまりにもログファイルが多いのでこれらのログファイルの整理を始めたのですが、整理用のシェルスクリプトを作成している時に少し変わったシェルを作ったのでその内容をまとめておきます。

シェルスクリプト内でのテキスト編集

Linuxでは、テキスト編集用のコマンドがたくさんあります。そのなかの「ed」コマンドを使ってシェルスクリプト内でテキスト編集をしてみました。編集した内容は、次のとおりです。

  1. 最初の5行を削除します。
  2. 最後の5行を削除します。
  3. キーワードを含む行の先頭に処理日を入れる。
  4. 処理結果を新規ファイルに保存する。

普通に「ed」コマンドを使った場合、次のようになります。

debian:~# ed system.log
1,5d
$-5,$d
1,$g/cron/s/^/2008-07-30 /
w system-2008-07-30.log
q

この処理をシェルスクリプト内で実行してみます。

#! /bin/bash

DAYTIME=`date +%Y-%m-%d`

cat << EOF | ed system.log
1,5d
\$-5,\$d
1,\$g/cron/s/^/$DAYTIME /
w system-$DAYTIME.log
q
EOF

ここでポイントは、「cat << EOF | ed system.log」の部分です。この次行からの内容が、「ed」コマンドへの命令部分で実行したい内容を記述します。最終行の「EOF」で終了です。

名前付きパイプ

シェルスクリプトでパイプといえば、「cat system.log | grep cron」などのように「|」を使い、左側のコマンドが標準出力へ出力した結果を順次、右側のコマンドの標準入力へと送ります。このように標準入出力をつかうコマンドについては、このようなパイプが使えるのですが、入力や出力にファイルしか指定できないコマンドの場合には、名前付きパイプを使います。まずは、使用する名前付きパイプを作成します。

mknod pipe_file_name p

pipe_file_nameには、作成したいファイル名称を設定します。次に使用方法ですが、例えば、2つのファイルの内容を1つのファイルにして圧縮する場合は、イカの用にします。

gzip < pipe > system.log.gz &
cat system-2008-07-01.log system-2008-07-02.log > pipe

system-2008-07-01.logとsystem-2008-07-02.logの2つのファイルをまとめ、system.log.gzに圧縮します。シェルスクリプト内でも同じように使えます。上記の「ed」コマンドの実行結果を圧縮ファイルに保存するシェルスクリプトは、次のようになります。

#! /bin/bash

DAYTIME=`date +%Y-%m-%d`

gzip < pipe > system-$DAYTIME.log.gz &

cat >> EOF | ed system.log
1,5d
\$-5,\$d
1,\$g/cron/s/^/$DAYTIME /
w pipe
q
EOF
スポンサーリンク







シェアする

  • このエントリーをはてなブックマークに追加

フォローする