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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

5470閲覧

Linuxでログ出力のシェルスクリプトを作成

AZ3

総合スコア10

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2016/08/03 07:58

###前提・実現したいこと
新人インフラエンジニアです。(まだ現場未経験です)
先輩から課題をいただいたのですが、どうしても自力でできませんでした。
社内の検証環境がリリース作業で使えないので、どなたか模範解答をいただけないでしょうか。

###内容
対象のログ/var/log/messagesに対して、
引数("Jul 10"とか)を指定すると、その指定したログを表示(標準出力)する。

①引数指定なしの場合は、当日のログを表示する。

②引数が2つ以上指定された時はエラーにしてスクリプトを中止(exit)。
エラーのイメージは、リターンコードとスクリプトの使い方(usage)を標準出力する。
引数の数を表す変数$#の値をif文で判定($#>2とか)してechoでエラーを返す感じ

上記①と②を実現する為、
例 Case 変数 in ←この変数に$#の値を格納すれば・・・
0) 引数が0だった時(上記①)をここに記述 ;;
1) 引数が1だったときの処理(以前の仕様)をここに記述 ;;
2) 引数が上記以外の時(上記②)をここに記述 ;;

③引数で指定した日付をgrepでmessagesのログから検索して表示するところを
指定した日付が存在しない場合は、エラーにしてスクリプトを中止(exit)。
例 grepの結果のリターンコードをif文で判定して、0以外の時にechoで
リターンコードと「指定ログは存在しません」のメッセージを標準出力する。

⑤スクリプト実行時に標準出力されるログから、error、failure、Failedの数を表示することができれば
親切なスクリプトになるかと。
例 grepで当日、又は日付指定した結果に対して、さらに上記文言をgrepし、
引っかかった行をwc -lで行数を表示

⑥スクリプトの結果をリダイレクションでファイルに記述するのも手。
上記⑤の結果をファイルにリダイレクション(>)でファイル新規作成し、
さらに当日、又は指定日付のログをそのファイルに追記(>>)する形

###試したこと
DATE="$1"

case "$1" in

tail -n 1 /var/log/messages;;
【tailで一番下の行を出力したかったのですが、できませんでした。
ログも日によっては1行じゃないので、このやり方がそもそも間違いだとは思いますが。】

[A-Z]*)
cat /var/log/messages | grep "$1";;
【これは通りましたが、パターンの指定がいまいちな気もします。】

###補足情報(言語/FW/ツール等のバージョンなど)
なにせよ今までプログラムのプの字もかじって無いですので、ちょっと課題のレベルが高すぎるのですが、いったいどうやったら出来るのか気になって仕方がないので、お時間のある方お願いいたします。

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

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

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

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

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

guest

回答2

0

こんな感じでどうでしょう

bash

1#!/bin/sh 2 3if [ $# -ge 2 ]; then 4 echo "paramater error" 5 exit 6elif [ $# -eq 0 ]; then 7 dd=($(LANG=C;date +"%b %-d")) 8else 9 dd=(${1}) 10fi 11 12ls -1r /var/log/messages* |xargs cat |grep -e "^${dd[0]}[ ]*${dd[1]}" 13 14if [ ${PIPESTATUS[2]} -ne 0 ]; then 15 echo "${dd[@]} No data found" 16 exit 17fi 18echo "error:failure:Failed" 19cat /var/log/messages* |grep -e "${dd[0]}[ ]*${dd[1]}" |awk '/error/{a++}/failure/{b++}/Failed/{c++}END{printf("%d: %d: %d\n",a,b,c)}' 20

後になりましたが上記の説明です。

$#、パラメータの数です
date +"%b %-d"、は月と日(頭0なし)です
LANG=C、英文字にします
dd=(${1})、配列ddへの代入です
ls -1r 大きい順に並べます
xargs はcatへのパラメータ渡しです ”cat file1 file2 file3 ... ”で展開
grep の正規表現にて"先頭からとスペースを挟んで数字”のもの
PIPESTATUS、前実行文の[2]で3番目の実行結果を取得します 該当日無し
awkで文字の出現回数を求めています。 (注)行中に2個有ると2カウントする

がんばってください。

投稿2016/08/03 09:14

編集2016/08/04 00:44
A.Ichi

総合スコア4070

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

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

AZ3

2016/08/04 00:03

ご丁寧にありがとうございます!助かります。
guest

0

皆目見当がつかないなら、先輩さんにそう言うのがいいんじゃないかなあ。

Sh

1#!/bin/sh 2 3if [ $# -gt 1 ] 4then 5 # エラー処理を書く 6 exit 1 7fi 8 9if [ $# -eq 1 ] 10then 11 target=$1 12else 13 target=今日 14fi 15 16log=`grep $target /var/log/messages` 17if [ $log -ne '' ] 18then 19 err=`echo $log | grep 対象ワード | wc -l` 20 if [ $err -gt 0 ] 21 then 22 # $err より件数を表示する 23 fi 24 echo $log 25else 26 # 対象日付が無い旨のメッセージを表示する 27fi

とりあえず、たたき台ということで。:-)

投稿2016/08/03 08:42

takasima20

総合スコア7458

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

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

AZ3

2016/08/03 08:46

ありがとうございます! なかなかその方と直接お会いできないのです… 暇つぶしがてらにやってみるといいかもね、ぐらいの課題だったのですが、分からないまま放置しておくのも嫌だったので。 ご回答助かります!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問