• 締切済み

bshellでコマンド結果を一行ずつ解析させたい

bshellでftpのミラーリングを行うことになりました。 ようはwgetでいうところの-mなことがしたいのですが(ftpのmgetだと回帰的に取らせた場合にディレクトリ構造が無視されるため) wgetを入れれる環境ではなく、bshellで同等のことをすることになりました。 ftpでログイン後にlsをかけて、その結果の各行一番初めの文字がdならディレクトリな処理、-ならファイルな処理、他なら無視をする必要があるかと思われますが、 「結果を1行ごとに解析させる」 というのがどうもやり方が思いつきません。 何かご存知の方いらっしゃいましたら返答お願いします。

みんなの回答

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.4

趣味でやるのなら「苦労もまた楽し」ですが。 私はUNIXに関しては20年以上の経験がありますが、断言します。 仕事なのなら、「できない」といって断るのが会社のためですし、あなたのためでもあります。なんならUNIX/Linuxに詳しいコンサルタントに相談してみてください。同じ事を言うはずです。  もし、シェルスクリプトでなんとかツールを完成したとしても、今後いろいろなトラブル(長期間安定して動くとは思えません)のたびに、呼び出されてメンテをさせられる羽目になります。会社としても業務ツールが不安定では困りますよね。  本来は、wgetをインストールできないという体制を作った人がこの責任を負わないといけないのですが、質問者様がシェルスクリプトを書いてしまうと、今後これに起因する全ての不具合は質問者様が責任を問われることが予想されます。

全文を見る
すると、全ての回答が全文表示されます。
  • Lean
  • ベストアンサー率72% (435/603)
回答No.3

>ftp -i -v -n $FTP_ADDRESS << END >>$LOG >user $FTP_ID $FTP_PW >ls / ftpls.log >#y >quit >while read mode link owner group size time filanem; do >echo $mode >done < ftpls.log >で$modeが表示されません。 上記通りのスクリプトなら$modeが表示されないのは当然だと思いますが。 ftpコマンドに「<< END」で、どこまで入力されているのか分かりますか? >: そのようなファイルやディレクトリはありません 普通、そのメッセージの「:」の前に何が「そのようなファイルやディレクトリはありません」なのか出力されると思いますが、それが無いのでは? wgetを入れられない理由は分かりませんが、このままだといつまで経ってもご希望のものは出来ないと思いますよ。 素直にwgetを入れる事を考えた方がいいのでは?

sc_staff
質問者

補足

>普通、そのメッセージの「:」の前に何が「そのようなファイルやディレクトリはありません」なのか出力されると思いますが 何も出ていないので検討もついていません。フルパスで書いても同じエラーで、 done << END hoge fuga END とかとするとエラーは出なくなります。 >$modeが表示されないのは当然 前回補足した3行だけの別途稼動させたのにエラーがでるあれでも当然なのですか? 当然な理由がよくわからないのですが・・・ >素直にwgetを入れる事を考えた方がいいのでは? 会社のサーバなので、どうしても聞かなければならない状態です。wgetを入れる方向にしてくれないと厳しいor私には無理ですとずっと言ってはいるのですが・・・

全文を見る
すると、全ての回答が全文表示されます。
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.2

泥沼にはいることが確実なのであまり言いたくないのですが、、、。 しいてshでやるならば、 ・有るディレクトリのファイルを取得する、ということごとにftpを起動する。ftpに接続したままで次々コマンドを与える事はあきらめる。 ・ftpのコマンドを標準入力から与える。 ・lsの出力は標準出力に出すのではなく、ローカルファイルを指定してそれに入れされるのがあとで処理が楽(詳しくはftpコマンドのマニュアル) で、こんな感じで処理 while read mode link owner group size time filanem ;do case "$mode" in total*) ;; #無視 d*)ディレクトリの場合の処理 ;; -*)ファアイルの場合の処理 ;; l*)シンボリックリンクの場合の処理 ;; esac done < ftpのls出力を入れたファイル あくまでも概念ですが、、、。 ftpのls -lの出力形式は、相手ftpサーバーの種類のよって一定ではないので、面倒です。特定のftpサーバ決めうちなら楽ですが。もし.や..がls出力に含まれるようならそれを除外する処理も必要です。 また、新しいファイルと古いファイルでは日付フォーマットが変わるので、気をつけてください。

sc_staff
質問者

補足

仕組みがある程度わかってきましたが、 どうしても ftp -i -v -n $FTP_ADDRESS << END >>$LOG user $FTP_ID $FTP_PW ls / ftpls.log #y quit while read mode link owner group size time filanem; do echo $mode done < ftpls.log で$modeが表示されません。 一度、別のshファイルを作って while read aa; do echo $aa done < ftpls.log だけにしても : そのようなファイルやディレクトリはありません とエラーが出ます。何が理由かお分かりになりませんか?

全文を見る
すると、全ての回答が全文表示されます。
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

wget-m的な処理をbshellで行うのは原理的には不可能ではありませんが、「結果を1行ごとに解析させる」ことすらわからない人の手に負えるようなモノではありません。あきらめて他の手段を使ってください。 たとえば、perlで書いたwgetもありますが、ご使用の環境はperlすら入っていないのでしょうか?

sc_staff
質問者

お礼

perlも無理です

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ftpコマンド出力結果の取得

    ftpコマンドのバッチ処理によってファイルの一覧の結果を取得したいのですが、 リダイレクション等を用いても取得できません。 どのようにすればいいか教えてください。 **************状況************* OSおよびOSレベル:AIX5.2 シェル:Kシェル コマンドファイルの中身(ftp.txt) cat << EOF | ftp -n open SERVER user USER PW cd PATH ls -l bye EOF SERVER:実際のサーバー名 USER:実際のユーザー名 PW:実際のパスワード PATH:実際のパス これを以下のように実行し、結果を取得しようとしました。 # ./cmd.ftp > log しかし、出力ファイルlogの中身はカラっぽでした。 ところが、リダイレクションを外し、コマンドファイルのみを実行すると、結果が画面に表示されます。 何故、画面には表示されるのに、リダイレクションやパイプでは結果が渡されないのかが分かりません。

  • 重回帰分析について

    重回帰分析を用いて、性別を調整した解析を行いたいのですが・・・ 結果の見方がわかりません。 男を1、女を0というダミー変数にし、解析を行っています。 それによって、得られた標準化偏回帰係数が-(-)を示しているときは、男性の方が負の影響を与えているのか・・・それとも女性に負の影響を与えているのかわかりません。 また、調整するためのダミー変数ならば、得られた数値は無視して他の独立変数の値を見ればよいのか・・・どのように解釈したらよいのかわかりません。 統計に詳しいかたがいましたら、お願いします。

  • CentOSにてアクセス解析ツール「webalizer」のインストール

    CentOSにてアクセス解析ツール「webalizer」のインストールの際の問題 CentOS5.4(i386版)を使用しております。 webalizerを日本語化しようと思い、以前にインストールした英語版を削除してソースのダウンロード ==== wget http://ftp.riken.go.jp/Linux/centos/5.5/os/SRPMS/webalizer-2.01_10-30.1.src.rpm ==== までいったのですが、パッケージを展開 ==== rpm -ivh webalizer-2.01_10-30.1.src.rpm ==== しようとすると、 ==== エラー: %sourcedir を /usr/src/redhat/SOURCES に作成できません。 ==== と表示され、展開することができません。 展開できない原因が分かる方いらっしゃいましたら、ご教授のほどお願い致します。 /usr/src/redhat/SOURCES を確認したところ、実際には↑のようなディレクトリ構造にはなっておらず、 /usr/src までしかないので、現時点で存在しないディレクトリにパッケージを展開しようとしているためエラーとなってしまうのかと自分では思っているのですが・・・ よろしくお願い致します。

  • FTPコマンドで、カレントディレクトリを日付の一番新しいものに移動する方法

    linuxのFTPコマンドについて質問です。 FTPで他のlinuxサーバに入ったあと、  「特定の文字列で始まり、且つその中でも日付が一番新しいディレクトリ」に CDコマンドで移動したいのですが、コマンドでそれを実現することは出来ますでしょうか? lsで表示されたディレクトリの中から目視で新しいディレクトリを探すという ことではなく、シェルの一部に組み込みたいので、 コマンドで対応したいです。 ディレクトリ名は、「○○○1」「○○○2」・・・「○○○5」という 風に「○○○」は同じで数字部分が増えていく形式です。 且つ、一番新しい数字のものが一番新しいタイムスタンプとなっています。 (関係ないディレクトリ「■■■1」~「■■■5」というのも混在しています) なので、dirコマンドで「dir ○○○*」として絞ったあと 日付が最新 or 数字の大きいものというものを抽出した結果を、 CDコマンドに渡せればと思っています。 (方法は問いません) 良い方法があれば、教えていただきたいです。 よろしくお願いします。

  • FTPコマンドの戻り値(エラーコード)の意味

    【FTPコマンドの戻り値=”2”は何のエラーを意味するのでしょうか?】 あるアプリからbatファイルを起動する仕組みを作っています。 そのbatファイル内でFTPコマンドによるファイル送信をしていますが、 FTPコマンドの戻り値が正常終了の”0”ではなく”2”となってします。 処理結果をログに出すようにしているのですがそこもうまくいっていないようです。 DOSプロンプトを起動してFTPコマンドを手で入力して行くと ステップごとには正しく動くのですが、bat起動だとだめなのです。 検索してみても「エラーコードの意味」がHitしません。 どなたか教えていただけますか? 【処理詳細を以下に記します。】 内容は、ある制御ファイル(CTL。中身は0バイト)群を FTP転送し、日付入りファイル名のログに結果を出力するだけです。 ○batファイル(引数%1には、アプリから日付が渡されます。) ftp -s:ftpcmd.txt > ftplog_%1.txt ○Txtファイル open xxx.xxx.xxx.xxx (userid) (password) cd (処理ディレクトリ) ascii prompt mput c:\FTP\*.xxx.ctl disconnect bye

  • wgetの後

    只今、linuxを勉強中です。わからないところがあるのでおしえてください。 postgreSQLのインストールを実施するため [root@localhost root]#wget ftp://ftp.jp.postgresql.org/source/v8.2.1/ を実行ダウンロードしたのはいいのですが保存先のディレクトリが わかりません(つまりpostgresql-8.2.1.tar.gz ) 上記作業後 [root@localhost root]# ls Desktop ifcfg-eth0 index.html.1 install.log passwd anaconda-ks.cfg index.html install.log.syslog smbpasswd ls すると index.html となっているようですが 本来ならソースファイル、postgresql-8.2.1.tar.gz ではないのですか?? 次の作業 #cp postgresql-8.2.1.tar.gz /usr/local/pgsql に移れないのです。 いまいちよく理解できてないので教えてください。

  • 重回帰分析のやり方について教えて下さい。ど素人的な質問で恐縮なのですが

    重回帰分析のやり方について教えて下さい。ど素人的な質問で恐縮なのですが、重回帰分析は、目的変数(Y)を、説明変数 X1, X2, X3, X4.....X20などに影響されるか否かを検討しますよね。ここで、私がしようとしている統計学的処理と類似した研究の論文などを読んだりとかしていると、YとX1, YとX2, YとX3, YとX4.....YとX20の単回帰分析を各々行い、ここで有意な相関があったものを取り上げて(例えば、X1, X4, X7, X12, X18, X20の6個など)、この6個について、重回帰分析を施行して、ここで、X4, X18は有意でないといった結果が出たなら、Y=aX1+bX7+cX12+dX20という重回帰式を作成し、標準偏回帰係数を算出し、どの説明係数が最も目的変数に影響を与えているのか解析しているのですが、これが正しい方法(進め方)なのでしょうか? いきなり、YとX1~X20を重回帰分析したのは、どうでしょうか?これはダメなのでしょうか?単回帰分析では相関が有意にでない(他の説明変数の影響のために)けれども、重回帰分析では有意な結果となるような説明変数が無視されるような結果になるように思うのですが、どうでしょうか? 非常に低レベルな話しで申し訳ないのですが、お教え下さい。

  • 温度の測定の相関性について

    いつもお世話になります。 熱電対を使って温度を測定している窯と、放射温度計を使っている窯とがあります。炉は構造上同じ測温法を取ることが出来なくなっています。 それぞれの結果を比較するためにメジャーリングと呼ばれる、焼結による熱収縮を利用したチップを用いました。 熱電対の表示、放射温度計の表示が同じでも焼成した試料の密度は異なるのに対し、メジャーリングでの表示した温度を合わせると炉が異なっても密度は似通った結果となりました。 外部に試験結果を論文等として報告する場合、メジャーリングでの測定データで提出することはOKでしょうか。 NGの時、何か方法はありますか? 以上よろしく御願いいたします。

  • FTP経由のミラーリングソフト探してます。

    会社や家での作業で最新のデータを維持するために FTP経由のミラーリングソフトを探しています。 Vectorや窓の杜を覗いてみましたが、 私の期待するものを見付けることはできませんでした。 求める処理は、自動での同期(みらーりんぐ)と タイムスタンプ等から、より新しいファイルを 検出して、古いファイルを新しいファイルに 更新する。ただし、一方向ではなく双方向。 使用状況はFTPサーバーをミラーリングサーバーとし、 複数のWindowsマシンからの同期リクエストをかなえる。 というものです。 FTPを経由すると、タイムスタンプが更新されるので FTP経由でのファイルの新旧の識別が難しいのと、 ミラーリングソフトというと、一方向のものが多く 私の求める双方向のものが少ないので見付かりません。 よろしくお願いします。

  • perl 複数ファイルから一行ずつ読み込んで比較

    初心者向けのperl参考書がなんとか理解できる程度のperl初心者です。 一週間ほど思考錯誤してきたのですが、いくらスクリプトを書いてもどうしても自分では解決できない処理がありましたので、初めてなのですが、質問させていただきました。 二つの同じ形式の、一部情報だけ異なるファイルから一行ずつ配列を読み込んで、数値の大小を比較したいのですが・・・ ファイル構造は、下のように2行でひとつのtextデータの情報を表示する形式となってまして、 奇数行には、各textファイルの情報が、.以下の部分に4552221.2:(30.2):100、のように記載されています。 偶数行には、各テキストファイルの、IDとなる情報が、13333331のように記載されています。この奇数行と、偶数行一行ずつで、ひとつのtextデータの 情報を表しています。textというファイルは、text1から順に,text2000000まで、 2000万程度,行で言えば4000万行ほど存在しています。よって、file1もfile2も、同じ行であれば、同じtextで、同じIDのものを示しています。ずれはありません。 file1 ----------------------------- >text1. 4552221.2:(30.2):100 13333331 >text2 87999999 >text3. 3444444.1:(20.0):300 75533333 ----------------------------- 数値は意味が変わらない範囲で、比較しやすい数値に変えてあります。 この上のfile1と、下のfile2を比べたいのですが、 file2 ----------------------------- >text1. 4552221.2:(20.9):100 13333331 >text2 87999999 >text3. 3444444.1:(23.3):300 75533333 ----------------------------- 偶数行のtextファイルの欄が大事で、text名のドット(.)の後に、続けて数値が書いてある場合(上ではtext1とtext3が該当)、そのドットの後の括弧()で囲まれた中の数値の大小を比較して、 差が一定以上あるtextだけを出力するスクリプトが書きたいと思っているのですが、 これをいきなりすべてひとつのスクリプトにまとめるのは、私の知識と力量では到底無理なので、ひとつひとつ段階を踏んで処理していこうと考えました。 1、奇数行の、text.の後半に情報があるもの場合、tempファイルにその奇数行と、対になる偶数行を出力する。それを、file1、file2、個別に行う。(temp1、temp2を出力) file1で取り除かれる3、4行目のtext2は、file2でも必ず取り除かれるので、1の処理後も、file1と2の各行は、比較することが可能な状態です。 2、正規表現を使って、各行の()で囲まれた部分の最初の2桁の数字(一部は一桁の数字の場合もあり)、をtempに出力する。(temp3、temp4を出力) (この処理を行わなくても可能かもしれませんが、ややこしいので、数字だけ出すようにしました) 最後に、file1とfile2の各行の数字を一行ずつ読み込んで、数値に一定以上の差がある行の情報だけ出力したいのですが、各行を順番に分析できる方法は、while文か、配列に読み込む方法しか知りません。 前者のwhile文では、ファイルオープンは、ひたつ以上は同時には取り扱えないという情報を得たので、使えない思っています。後者の配列に読み込む方法は、桁が大きいので、実用的ではないと感じています。 二つ以上のファイルの各行の特定の数値データを、一行ずつ順に比較して、差があるものだけ抽出するにはどのようなスクリプトを書けばよいのか、ご教授下さい。 いろいろ調べましたが、(僕の調べ方が悪いと思いますが)適切なコマンドや方法にたどり着けません。 試してみた方法 ファイルハンドルを二つ指定して、while文の条件中に、andで条件を二つ指定してファイルハンドルから読み込んでやればよいと思ったのですが、実行するとエラーになってしまいます。ググっていろいろ調べてみたところ、ファイルハンドルの二つ指定はできないとの記述を見つけたので、whileの条件に複数のファイルハンドルを記述するこの方法はあきらめて、ここで、ストップしています。 まわりに、perlを扱える方がいらっしゃれば質問に伺うのですが。もしよろしければ、簡単でもご教授いただけますと幸いです。宜しくお願い申し上げます。

    • ベストアンサー
    • Perl