• ベストアンサー

初歩的質問ですいません。

UNIX初心者です。 solarisで、障害発生時に資料を採取するシェルを作っているのですが、うまく作れないところがあるので知恵を貸してください。  資料に必要なログをあるフォルダにコピーしようと思い、必要なログ名をlsとgrepで、ファイルに出力しました(仮にファイル名をLOGNAMEとします。)このLOGNAMEファイルに記述してあるログをコピーしたいのですがいい方法ありますか? 例) LOGNAMEファイルの中 log1.log log2.log log3.log 上記の3つのログを同一フォルダ内にあるフォルダ(仮にSIRYOとします)にコピーしたいのです。 cp -p ${LOGNAME} ./SIRYO/ としても、使用方法が誤っています。となって意図したようになりません。 LOGNAMEファイルから一行ずつ抜き出してきてそれをコピーすればいいのだと思いますが、そういうコマンドが見当たらず困っています。  解決できる方法があればお知恵を貸してください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mendokusa
  • ベストアンサー率13% (359/2726)
回答No.1

shellじゃダメなんですか for AAA in `cat LOGNAME` do cp $AAA ./SIRYO/ done くらいでどうですか

その他の回答 (2)

回答No.3

cp `cat LOGNAME` ./SIRYO/ でどうでしょうか?

  • Lean
  • ベストアンサー率72% (435/603)
回答No.2

以下のようなシェルスクリプトを作成すればいいかと。 -------8<-------8<-------8<-------8<------- #!/bin/sh while read LOGFILE do cp -p ${LOGFILE} ./SIRYO/ done < LOGNAME -------8<-------8<-------8<-------8<-------

関連するQ&A

  • grepでの抽出について

    solarisでgrepを使ってログの抽出を行っているのですが、 123のある行を抽出したいとき、grep 123 ファイル名とすると 1234のある行も一緒に抽出されると思います。 これを123のみ抽出させる方法を教えてください。

  • Solarisでのgrepについて

    Solarisのgrepには、前後の行を表示するオプションがないと 思います。 GNUのgrepを使用できない(構成を変更できない)環境ですが、 Linuxのgrepでいう[-A]や[-B]オプションを使用したシェルが 必要になり困っています。 できれば、下記のgrepのように|(パイプ)で挟んで使用している 状態にしたいのですが、コマンドやオプションを教えていただけ ませんか? ***|grep -B1 ***|*** シェルを早急に作成する必要がありますが、知識が乏しく 大変困っています。 よろしくお願いいたします。

  • tailとgrepの組み合わせて、結果をファイルに出力について

    おせわになります。シェルの初心者です。 基本的なことかもしれませんが・・ tail -f test.log | grep -e TEST >> tailgrep.log のように、tailとgrepをパイプで連結した結果をファイルに書き出そうとしても、何も書き込んでくれません。 リダイレクトしなければ画面上にはちゃんと表示されますが、若しだめだったら、シェルなどで、解決方法をご存知でしたら、教えていただいて、助かります。

  • バックアップをif文にて行いたい。

    突然ですが、教えていただきたい事がございます。 今、Solaris8でシェルを作成しています。 ある対象となるファイルがあったとします。 そのファイルに何か書き込まれていたら、その該当 するものをコピーし、何も書き込まれていなかったら コピーは行わず終了する様にシェルを作成したいと 思っています。 そこで、 「もし、対象となるファイルが白紙ならば…」 となる構文が作れないので、申し訳御座いませんが 教えていただけないでしょうか。 つまり、ファイルの中身を見て白紙かどうか判断さ せる文章が作れなくて困っています。 対象ファイルは/tmp配下にあるlog_fileとします。 以上、よろしくお願いします。

  • バッチファイル フォルダ存在 確認

    いつも大変御世話になっております。 WindowsXP SP2に【D:\test\bat】フォルダに【test.bat】があります。 上記バッチファイルは以下のようになっています。 コード------------------------------------------------ rem --- 時間変数 --- set yyyy=%date:~-10,2% set yy=%date:~-8,2% set mm=%date:~-5,2% set dd=%date:~-2,2% set YMD=%date:~-8,10% set HHMMSS=%time:~0,8% set FILE_DATE=%date:~-10,4%%date:~-5,2%%date:~-2,2%%TIME:~0,2%%TIME:~3,2% set FILE_DATE=%FILE_DATE: =0% rem --- フォルダ変数 --- set log=D:\test\drive_xcopy\log set INP_DIR=D:\test\drive_xcopy\in set OUT_DIR=D:\test\drive_xcopy\out\ rem --- ファイル変数 --- set logName=log.txt echo "%YMD%","%HHMMSS%","FOLDER.bat","処理開始" >> %log%\%logName% REM フォルダコピー XCOPY "%INP_DIR%" "%OUT_DIR%" /e /Y >> %log%\%logName% echo "%YMD%","%HHMMSS%","FOLDER.bat","処理終了" >> %log%\%logName% コード------------------------------------------------ 単純に【D:\test\drive_xcopy\in\】内のすべてのフォルダを 【D:\test\drive_xcopy\out\】内にコピーしています。 ちなみに、、【D:\test\drive_xcopy\in\】フォルダには100個フォルダがあります。 実現したい事は、コピー対象となる100個フォルダがちゃんとコピーされ、 コピー先にすべて確実存在しているかを【コピー元⇔コピー先】とで 1つ1つマッチング処理したいのです。 すべて存在していれば、上記ログファイルに 100フォルダすべてが存在しています。 と書き込み、 1つでも存在していなければ、上記ログファイルに ○○○フォルダがコピー先に存在していません。 それ以外は存在しています。 と書き込むような処理を実現したいのです。 コピー先に存在していないのが複数であれば 下記のようなログメッセージを書き込みたいです。 ログメッセージ例----------------------- ○○○フォルダがコピー先に存在していません。 ×××フォルダがコピー先に存在していません。 それ以外は存在しています。 ログメッセージ例----------------------- For文とIF文をうまく使い、フォルダを変数で順に格納してマッチングするような 作成になると思いますが、難しくて苦戦しています。 方法をご存知の方がいれば、ご教授願いますでしょうか? ※サンプルがあれば、光栄です。 宜しくお願い致します。

  • Perl ログファイルの一部修正

    ご教示お願い致します。 $log = "ファイルの時間"; @NEWTM = grep(/,$log,/, @DATA); last if ($j > @NEWTM); $data = $NEWTM[$j]; my ($LogNo,$log,$Logname,$Logtitle,$Logtext,$Logpassword,$Logip,$Lognewtm,$Logcount) = split(/,/, $data); ++$Logcount; for my $j (0 .. $#DATA) { if ($DATA[$j] =~ /,$log/) { $DATA[$j] = "$LogNo,$log,$Logname,$Logtitle,$Logtext,$Logpassword,$Logip,$Lognewtm,$Logcount\n"; last; } } 各スレッドの単純なアクセスカウンタを設置しました。 my ($LogNo,$log,$Logname,$Logtitle,$Logtext,$Logpassword,$Logip,$Lognewtm,$Logcount) = split(/,/, $data); これは1発目に書き込まれたものを一度書き出し ++$Logcount; で+1をし、 $DATA[$j] = "$LogNo,$log,$Logname,$Logtitle,$Logtext,$Logpassword,$Logip,$Lognewtm,$Logcount\n"; 再度、書き込むという処理なのですが、 $Logcount以外は、書き出す必要もないですし、書き込む必要もありません。 この場合での$Logcountだけを書き換える処理をしたいのですが、どのようにするのでしょうか?

  • シェルスクリプトでsyslogを別ファイルに追記

    Linuxとシェルスクリプトの超初心者です。 よろしくお願いします! 下記のようなシェルスクリプトを作りたいのですが、アドバイスをよろしくお願いします。 例) (1)/var/log/messagesを/tmp/syslogAllとしてコピーする (2)一日一度のcronで、messagesの新しいログ部分のみをsyslogAllに追記していく。 (1)部分は問題ないのですが、(2)の「messagsの新しいログ部分のみをsyslogAllに追記していく」方法のアドバイスをよろしくお願いします。 一応、自分なり以下の通り考えたのですが、普通じゃなさそうなので・・・(^^; ※syslogAllの最後の行(keyword)を取得し、messagesをgrepした後リダイレクトで追記していく。 grep -A 10000 keyword /var/log/messages | grep -v keyword >> /tmp/syslogAll どうぞ、よろしくお願いいたします!

  • 特定文字列を除外してcpする方法

    こんにちは。必要なときのみシェル、ごくたまにシェルスクリプトを利用する程度なため、非常に初歩的なことだとは思うのですが、すっかりどつぼにはまってしまい、調べてもらちがあかないので、質問させてください。 cp コマンドで、特定の文字列を「含まない」ファイルすべてを指定してコピーするにはどうしたらいいでしょうか。 cpにオプションがなかなか見つからないので findと組み合わせようと思ったのですがこれでも思うようにいかず、苦闘の末find, grepを総動員してcp `find /dir * | grep -vl 'mojiretsu'` などとやってみましたが引数が多すぎると怒られて終わり(泣)。 よい方法をぜひご伝授ください。要するにコピーが目的ですので別のコマンドでもかまいません。

  • シェルの変数の動作についての質問

    solaris8上で、シェルから別のシェルを子プロセスを動作させて その子プロセスが終了したかを判定するシェルを作成しました。 そのシェルの抜粋は下記のようになっています。 ---------------------------------------------------- "コマンド実行" & PID=$! i=0 ERR_FLG=1 echo " PID="$PID >> tmp.txt   ・・・・(1) while [ 1 ] do   if [ `ps -ef | grep $PID | grep -v grep | wc | awk '{print $1}'` -eq 0 ]; then     ERR_FLG=0     break   fi   "終了条件を満たしたかを確認するサブルーチン"   if [ $? -eq 1 ]; then     echo "Time out" >> tmp.txt     break   fi   i=`expr $i + 1 `   sleep 10 done echo `ps -ef | grep $PID | grep -v grep` >> tmp.txt ・・・・(2) ---------------------------------------------------- 殆どの場合問題なく動作しているのですが、 ごく稀に、(1)と(2)で取得した$PIDの値が異なるという現象が起きます。 当然サブルーチン上で、PIDを書換する処理もありません。 どのような状況の時に、現象が起きるかもはっきりしていません。 この現象の回避方法が判る方がおられましたら御教示の程、 宜しくお願いします。

  • grepによる文字列検索のシェル作成の手順

    Solaris9のOSにて、以下の仕様のシェルを作成したいと思っています。 特定のディレクトリ配下にある全てのファイル内で特定の文字列「abc」のある行を抽出し、ファイル化したい。 (検索対象が1ファイルであれば、grep -n abc test.txtでよいですが、ファイル名がたくさんある場合のシェルの作り方がわかりません。) また、どのファイルから検索したのかがわかるように抽出した行の前にファイル名をつけられると大変助かります。 例) ---test1.txtから検索--- 8:XXXXabcXXXX 11:XXXXabcXXX ---test2.txtから検索--- 10:XXXXXXXXabcXX お手数ですが、宜しくお願いします。