質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.96%

CentOSでログを抽出するシェルスクリプトを作成したい。

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 2,309

m-ja1L

score 15

CentOS6 を利用しています。
サーバログを抽出のうえzip化し保管する方法を考えています。

たとえば、下記のように2016年のファイルのみを抽出し、ディレクトリに移動をし、最後にzipコマンドで圧縮します。

# ls -1 /var/log/yum.log-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG
# ls -1 /var/log/spooler-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG

              ・
              ・
              ・
#  zip -r SERVERLOG.zip SERVERLOG

しかし、対象のファイルがひとつのサーバにつき、30ファイルほどあります。
1回ずつコマンドをコピーペーストすることを非効率と思う場合は、やはりシェルスクリプトを作成するしかないでしょうか?
シェルスクリプトを作成した経験がないため、書き方や考え方につき教えていただきたく思います。

宜しくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

0

# ls -1 /var/log/yum.log-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG
# ls -1 /var/log/spooler-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG

              ・
              ・
              ・
#  zip -r SERVERLOG.zip SERVERLOG


が問題なく動いてると仮定して、

  • archive.sh
#!/bin/bash
ls -1 /var/log/yum.log-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG
ls -1 /var/log/spooler-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG

              ・
              ・
              ・
zip -r SERVERLOG.zip SERVERLOG


で行けるんじゃないかと思います。
実行権限を与えるのをお忘れなく。

chmod +x archive.sh


です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

示されたコマンドを踏襲するとして

#!/bin/sh
logd='/var/log/'
targ="2013\|2014\|2015"
outd='/home/user/'
outf='SERVERLOG'

logf='yum.log-20'
ls -1 "$logd$logf"* | grep -v $targ | xargs -i cp -p {} $outd$outf
logf='spooler-20'
ls -1 "$logd$logf"* | grep -v $targ | xargs -i cp -p {} $outd$outf
              ・
              ・
              ・
cd $outd
zip -r "$outf".zip $outf

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

余分なファイルが入る可能性はあり? ...の部分は実名で置換えください、

zip -j /home/user/SERVERLOG.zip /var/log/{yum.log,spooler,...}-2016*

シェルスクリプトでしたね。

#!/bin/sh
while read ff
do
        echo "archive ${ff}"
        zip -j /home/user/SERVERLOG.zip ${ff}
done<<_EOF_
$(ls -1 /var/log/yum.log-20* | grep -v "2013\|2014\|2015")
$(ls -1 /var/log/spooler-20* | grep -v "2013\|2014\|2015")
.....
.....
_EOF_

シェル実行ユーザは読込み権限を持っている必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ログがきちんと00:00でローテートされてるなら

tar cvpf - /var/log/yum.log.2016* /var/log/spooler-2016* | gzip > /<dir>/<outfile>.tar.gz

zipじゃないですけど。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

作業内容をシェルスクリプト化するには、実行したコマンド列の先頭行にシェバン(#!/bin/bash のように実行する処理系の種類を示す #! で始まる行)を付けてテキストファイルに保存し実行権を付ければ良いだけです。

あと、保存対象のログファイルのネーミングルールを良く考えると、場合によってはかなり簡略化したコマンドで処理が可能なので、数行のコマンド(あるいは ; で繋いで一行にする)で済むので、数コピー&ペーストで十分な場合もあります。

もし /var/log 配下の xxxxx-2016yyyyyy のようなログが対象なら、下記のように書けます。

# cd /var/log; /bin/ls -1U *-2016* | cpio -pdmu /home/user/SERVERLOG; cd /home/user; zip -r SERVERLOG.zip SERVERLOG

処理系にもよりますが、/bin/ls -1U の様にすると結果をソートせずに表示するので、対象が多い場合にも動作が速いです。

もし対象ファイルの選択がもっと複雑なら、ls結果をファイル名の「カギとなる部分」で適宜grepする必要がありますが、その場合は egrep を使うとorを表す | をバックスラッシュ \ でエスケープしなくて良いので、見通しが良くなります。

例えば以下のように

... /bin/ls -1U *-2016*             |
egrep 'yum.log|spooler| ... '   |
cpio ...


なお、パイプ | で改行しても同一行と見なされるので、全体が長くなる場合には便利です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる