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

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Q&A

解決済

5回答

5331閲覧

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

m-ja1L

総合スコア17

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

0グッド

0クリップ

投稿2016/08/30 19:51

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回ずつコマンドをコピーペーストすることを非効率と思う場合は、やはりシェルスクリプトを作成するしかないでしょうか?
シェルスクリプトを作成した経験がないため、書き方や考え方につき教えていただきたく思います。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

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

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

bash

1# 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を表す | をバックスラッシュ \ でエスケープしなくて良いので、見通しが良くなります。

例えば以下のように

bash

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

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

投稿2016/09/01 00:21

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

zipじゃないですけど。

投稿2016/08/31 00:18

ynakano

総合スコア1894

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

sh

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

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

bash

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

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

投稿2016/08/30 22:54

編集2016/08/31 01:06
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

Sh

1#!/bin/sh 2logd='/var/log/' 3targ="2013\|2014\|2015" 4outd='/home/user/' 5outf='SERVERLOG' 6 7logf='yum.log-20' 8ls -1 "$logd$logf"* | grep -v $targ | xargs -i cp -p {} $outd$outf 9logf='spooler-20' 10ls -1 "$logd$logf"* | grep -v $targ | xargs -i cp -p {} $outd$outf 11121314cd $outd 15zip -r "$outf".zip $outf

投稿2016/08/30 22:11

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

bash

1#!/bin/bash 2ls -1 /var/log/yum.log-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG 3ls -1 /var/log/spooler-20* | grep -v "2013\|2014\|2015" | xargs -i cp -p {} /home/user/SERVERLOG 4 5678zip -r SERVERLOG.zip SERVERLOG

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

chmod +x archive.sh

です。

投稿2016/08/30 21:16

taro_nii_chan

総合スコア207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問