1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ] シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。
2 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 04:03:33 ] 2
3 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 05:08:16 ] お楽しみいただいた当スレッドもただいまをもちまして終了いたします。 1112553783 シェルスクリプト相談室です。
4 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 06:04:38 ] 連番エロCGをスクリプトで一発ダウンの俺様が4様GETですよと。 最近本気で自動巡回も作ろうかと思案中です。チェックするのもマンドクセ。
5 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 09:52:54 ] UNIX板逝けよ
6 名前:デフォルトの名無しさん [2005/04/04(月) 10:29:05 ] >>5 シェルスクリプトはunixだけじゃないぞ
7 名前:デフォルトの名無しさん [2005/04/04(月) 12:16:13 ] いまだにcshを使っていますが何か?
8 名前:デフォルトの名無しさん [2005/04/04(月) 15:47:53 ] cshじゃなくて今のトレンドは何ですか?
9 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 15:49:05 ] bash
10 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 15:49:12 ] bash
11 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 15:52:03 ] ,,..--―-、 /, -----、.ヽ, / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | i_,,,,_ __゙l | | bash! ,!、i'゙-‐-: '-、|/ / ______ /'') ..., '‐-‐、.j  ̄ ̄ / ,‐!::...`'''''''`ノ _,,,l ;! ::|ヽ、二 イ , -‐'゙゛ i::.. | .ヽ/;ヽj!`‐-、_ l ノ::. .:|、 .ヽ,:ヽ| <゛~ヽ、 ⌒ ⌒ ⌒ _⌒ ⌒ ⌒__ /:::::Λ_Λ:::::::::::::::/ /::::::(∩;´Д`)∩ :::::/ /:::::::( >>1 /::::/ チャラッチャラッチャーン
12 名前:デフォルトの名無しさん mailto:sage [2005/04/04(月) 19:11:51 ] ワロタ
13 名前:デフォルトの名無しさん [2005/04/05(火) 00:48:46 ] dsh
14 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 02:00:34 ] >>7 「ところで海原先生、UNIXにはシェルが欠かせませんが、いったいどんなシェルが一番流行なんでしょうか?」 >>8 「それは私も知りたいですな!シェルを極め尽くした海原先生なら、その答えをお出しになれるんじゃないでしょうか!」 海原「さよう‥どれが一番二番と順位はつけられんが、五本の指に入るものをあげると‥」 「まずBourne Shell、それもXPG4のBourne Shellだな」 「csh、ksh、tcsh、ash、まあ、このあたりが間違いのない本道というところだが‥」 「gnuのbashは別格だし、debianのbash、dashも面白い。emacsをシェルで使うのも捨てがたいな」 >>9 「なるほど、どれもこれも聞いただけでよだれが出そうですわい」 >>10 「しかし同じシェルでもピンからキリまであるようで、海原先生は何でも飛び切り上等のシェルを使っておられるからなあ」 山杉「お若い方などはいかがです、どんなシェルがお好きですかな?」 山岡「今まで使ったshellの中ではzshが一番使いやすかった‥」 山杉「は?zsh?」 山岡「そうzsh」 海原「うわあっはっはっはっは!」 「だからシェルのわからぬUnixヲタだと言うんだッ、zshだと、馬鹿も休み休み言え!」 山岡「と言うからには、使ったことはあるんだろうな」 海原「誰がそんなシェルを使うか、無駄な機能だらけのシェルなど使ったら、10分で済む事が1時間かかるわ!」 >>11 「まったく聞いただけでジンマシンが出ますよ」 >>12 「最高のシェルを聞いているときにzshなんて、気分がだいなしよ」 >>13 「Unixヲタは哀れなもんだ」 海原「いい恥さらしだな、自分の特殊な趣味をさらしおって!」
15 名前:デフォルトの名無しさん [2005/04/05(火) 03:11:24 BE:91214093- ] zsh
16 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 11:54:16 ] zsh って実は Windows 版もあるんだよな(Cygwin ではなく)。
17 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 15:54:28 ] シェルスクリプトならbsh、プロンプトならcshの方がいいなぁ。
18 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 17:03:48 ] >>14 確かに鯖の話だな bash以外シェル使った記憶ねぇな
19 名前:デフォルトの名無しさん [2005/04/09(土) 10:09:37 ] >>14 面白いぞ! 久々に和炉他
20 名前:デフォルトの名無しさん mailto:sage [2005/04/09(土) 10:14:10 ] >>14 ということは幻のzshとか出てくるのか?
21 名前:デフォルトの名無しさん [2005/04/10(日) 05:29:46 ] ls > /dev/null の> /dev/nullってどういう効能があるのですか?
22 名前:デフォルトの名無しさん mailto:sage [2005/04/10(日) 05:58:09 BE:67566454- ] シェルが fork(2) して 標準出力を /dev/null に dup(2) して ls(1) を exec(2) してる
23 名前:デフォルトの名無しさん [2005/04/10(日) 06:17:35 ] さっぱりわからないのですが
24 名前:デフォルトの名無しさん mailto:sage [2005/04/10(日) 06:37:15 ] 各コマンドを調べりゃいいだろ
25 名前:デフォルトの名無しさん mailto:sage [2005/04/10(日) 09:55:50 ] システムコールをコマンドと言っちゃう奴って
26 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 00:22:14 ] 田畑「国際シェル会議ですって!?」 花村「何なのよそれ!」 ブラック「文字通りシェルに関する色々な問題を国際的なレベルで検討しようとする会でして‥」 花村「シェルに関する問題って何よ?」 ブラック「ですから例えば、bashとzshとどちらがいいかとか‥」 花村「そんな問題を大勢集まって議論する訳?」 ブラック「今度東京で開かれる会議には全世界75か国から300人以上の委員が集まります」 田畑「あっきれた!なんてヲタが多いの!」 ブラック「そんなこと仰いますが、シェルてえものは一番簡単でしかもいろいろと奥が深いんでゲスよ」 富井「しかし驚いたなあ、そんな会議があるなんて!」 谷村「一度のぞいてみる価値はあるね」 記者A「あの‥さっきのシェルの件だけどね‥」 「bash使ってるけど、僕はいつも.bashrcでsetenvを定義してるよ」 ブラック「ええっ本当ですか!ありがたい、日本にもsetenvファンがいてくれた」 記者B「setenvなんて邪道だよ。環境変数ってのはシェル変数から取り込むの がいいんで、その場で定義するような構文はダサイよ」 記者A「そんなことはない。むしろシェル変数と環境変数の使い分けが曖昧な のがBシェル系の悪いところだろう」 記者C「Cシェル使えばCに似た構文になるだろ」 花村「あら、Cシェル使ったら標準エラーのリダイレクトが大変じゃない」 記者C「標準出力も標準エラーも同じファイルにリダイレクトすればいいじゃないか」 田畑「わあ嫌だ、リダイレクトはファイルデスクリプタごとに定義、これが鉄則よ」 富井「田畑くんの言う通り、そしてexec 2> /dev/nullするのが一番いい」 田畑「わあ厨臭い!」 富井「厨ですみませんね!」
27 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 00:22:48 ] 谷村「やはりkshの、EDITOR=viでいきたいね」 記者D「僕は、shのESC補完が好きで」 記者C「俺はcshが」 花村「きゃあ変態!」 田畑「シェルの楽しさを知らないのね」 記者C「BSD系のデフォルトだぞ。そんな決めつけ方はないだろう!」 ブラック「いやあけっこうけっこう!なかなか良ござんした」 「皆さんもなかなかシェルにはうるさいじゃありませんか」 記者B「‥結構主張するよね、みんな」 記者A「やっぱり身近なアプリだからね」 ブラック「いかがでゲス、皆さんもISCに参加しませんか?」 山岡「じゃ、どうせなら我々の身の周りの人のシェルに対する意見も聞いて回ったら?」 栗田「面白そう!」
28 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 00:23:14 ] 社主「なに、シェル?私はごく普通のシェルだよ」 栗田「ごく普通のといいますと?」 社主「bashにomaemonaパッチを当てたものだよ」 山岡「omaemonaパッチ?ごく普通とは思えませんが‥」 社主「どうしてだね?omaemonaパッチを当てていない2chネラなんて考えられんだろうが‥」 山岡「こりゃ、大原社主もISCに参加あるべきだな」 栗田「立派にその資格があるわ」 板山「よくぞこの私に聞きに来てくれたわい、私はシェルではずいぶん苦労した」 山岡「へえ板山社長が‥」栗田「人は見かけに寄らないわね」 板山「私はシェルのプロンプトがいつも同じってのが気に入らなくてね、 毎回変化するプロンプトを作ったんだ」 (dotfiles.comにあるモーヲタ製.zshrcを見せる) 板山「ね、こういろいろなプロンプトって楽しいだろう!」 栗田「まあ面白い!」山岡「これは板山社長もISCに入会だな」 陶人「これがわしの手製のシェルだ」 栗田「わあ可愛らしい!」山岡「staticリンクしてもフロッピー1枚に余裕で入る大きさだね」 陶人「ふっふ、領子がレスキュー用のシェルが欲しいと言ったので作ってやったんじゃよ」 領子「陶人くんの作ってくれたシェルで作業すると、復旧し易いのよねぇ」 山岡「‥あほらし‥よし、これをバンドルした1FDLinuxを売った金で、なにか うまいものを買いに行こう」 栗田「唐山先生もISCに入会ね」
29 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 00:23:45 ] 司会「ただ今から「国際シェル会議」日本大会を開きます」 会長「シェルはアプリの中でも一番基本なものであります。しかし単純だからこそ奥が深く難しい」 「本大会はシェルに関する諸問題を議論し尽くしたいと思います」 「世界の平和はシェルから、を合い言葉に、さあ始めましょう!」 三谷「実は僕はzsh派でね」 花村「困っちゃった、私、bashし使ったことないのよお‥」 田畑「さあ大変、徹夜しなきゃ」 司会「まず、フランスのフリット氏に、シェルの設定の仕方についての中間発表をお願いしましょう」 フリット「シェルを設定する際の永遠の課題は、どのファイルで何の設定をするかということであります」 「設定項目毎にファイルを分けるのもみっともないし‥」 「といって、1ファイルに全部の設定をするのも下品です」 「これはあるアメリカ人の例です、アルファベット名のファイルを作っ てrcファイル中で順番に読み込むようにして‥」 「コマンド名のアルファベット順に対応するファイルに書いていくやり方もあります」 会場(ブーブー) 会場「今の最後の設定方法は許せない!あんなやりかたでは、ログインシェル もただの対話式シェルも関係なくなってしまう」 会場「私は環境変数は、.zshenvに、zsh固有の定義は.zshrcに、ログインシェル用 の設定は.zlogin、ttyの設定やBシェル系でも使える設定などは.zprofile で設定します。こうするとメンテナンスや移行が容易になる」 会場「それは、私たちbashユーザーには不可能だ。シェルはzshだけではないことをお忘れなく」 会場「デフォルトの設定が十分なら、どのファイルで何を設定するとか心配しないですむんだ!」 会場「ちょっと待って、デフォルト設定がいいのか悪いのかは別の問題だ!」 会場「私はaliasでc="LANG=C LC_ALL=C"と設定しています」 「英語ロケールでアプリを起動するときは、c appで起動するだけなので最高です」 栗田「みんなすごいわ、ケンケンガクガクねっ」
30 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 00:24:13 ] 司会「さて、シェルの設定の仕方についてはこれくらいにして‥」 「次はzshがいいかbashがいいか、議論したいと思います」 「それでは、日本におけるzshとbashの実状についてブラック委員から報告して頂きましょう」 ブラック「快楽亭ブラックでございます。さて私は日本に来て以来あちこちで 調べた結果、日本ではシェルといえばbashのことでありまして、zshは厨 以外にはほとんど普及しておりませんでゲス」 会場「bashだと、スクリプトでよく使われている/bin/shと互換性があるから、 シェルスクリプトの勉強がし易くて、その分使い勝手が良いわ」 会場「日本人がbashを好むのは、シェルの名前が、米大統領ブッシュに似ているからであります」 「いわば、敗戦コンプレックスに強く訴えるのであります」 会場「拡張性の高さがzshの良さだっ!」 会場「しかし問題があります。設定が難しい。manも項目毎に11種類もあるし‥」 花村「私もそうなんです!誰か、設定のコツを教えてくださいっ!」 「‥あら、私、思わず 興奮しちゃって‥」 会場「あれこれいっぺんに設定すると失敗するんですよ、1つ1つ試していくことです」 会場「最初の設定を最小にして、使いながら気にいった機能を設定していくといい」 山岡「拡張性の高さなら、こんなシェルがあるよ」 「pythonのインタラクティブ版、ipython‥」 花村「pythonをシェルとして使えるのか!」 山岡「一番の利点は、ログをそのままpythonプログラムにもできることだね」 ブラック「ただ今のシェルは、bashともzshとも違います」 「これからbashとzshの他に、このシェルも論議の対象に加えることを提案します!」 会場「異議なし!」「賛成!」 司会「それでは、ターミナルは何をや使うべきかを論議する前に、皆さんそれ ぞれ好きなシェルをコンパイルしてインストールしましょう」 会場「異議なーし!」「インストールしましょう!」 花村「楽しい会議ねえ」 田畑「全然結論を出さないところが、犯罪的だけど‥」 山岡「結論は各々が自分で出せばいいんじゃないの」
31 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 06:10:42 ] 長すぎ
32 名前:デフォルトの名無しさん [2005/04/11(月) 09:04:13 ] >>26-30 お前、文才ありすぎw しかも、おもろい。 シェルを知ってるようだしな。 しっかし、会話の最初にもあったけどシェル変数と環境変数って なんか、ぱっとせんなぁ。
33 名前:デフォルトの名無しさん mailto:age [2005/04/11(月) 16:07:43 ] …質問して良いのかな? ファイルを読み込んで、各行の先頭文字を判定し、コメント文でなければ表示 をするというものを作っています。現在、以下のようにして判定しているので すが、これでは、「空行があるとファイルはそこで終わり」だと判断されてし まい、最後までいってくれません。全行を見るためには、どう書けば良いので しょうか?bsh使いです。 while read KEY do #判定 done < test.dat お願いします。
34 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 18:06:01 ] >>33 シェルスクリプト総合 その1 pc8.2ch.net/test/read.cgi/unix/1101820646/
35 名前:デフォルトの名無しさん [2005/04/11(月) 21:12:58 ] shはなんであんなにキモイんですか?
36 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 21:40:16 ] >>33 判定がおかしいんじゃないの? #判定 の部分を、echo $keyに変えてみ。 それ以前に、 grep -v "^#" < input.txt でええやん。(行頭文字「#」がコメント開始の場合)
37 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 21:53:09 ] >>35 けっこー美しいと思うおいらは変態でつか?(゚◇゚;
38 名前:デフォルトの名無しさん mailto:sage [2005/04/11(月) 22:22:30 ] UNIX使ってるやつがキモイから
39 名前:デフォルトの名無しさん [2005/04/11(月) 23:18:10 ] CreateGameー陸海空オンラインー www112.sakura.ne.jp/~kaientai-project/creategame.htm 2chスレ game10.2ch.net/test/read.cgi/mmominor/1109935948/ ただ今、即戦力募集中!歴史に残るMMOを作ってみないか!!
40 名前:デフォルトの名無しさん [2005/04/11(月) 23:37:30 ] >>26-30 海原と山岡のシェル対決キボンヌ
41 名前:デフォルトの名無しさん [2005/04/12(火) 01:05:20 ] 究極シェルと至高シェル対決キボン
42 名前:33 mailto:sage [2005/04/12(火) 08:24:26 ] >>36 >>34 氏の誘導先で、自己解決できました。 自己解決というか、何もコードは変えていないのですが意図する結果を出すようになりました。 (それはそれで可笑しいのですが…) > grep -v "^#" < input.txt >でええやん。(行頭文字「#」がコメント開始の場合) シェルスクリプト勉強中の身でして、「caseで一行ずつ判定させてみよう」と 思い立って、作ってみたものなのです。 ありがとうございました。
43 名前:デフォルトの名無しさん [2005/04/14(木) 02:01:50 ] 質問させて下さい。 シェルスクリプトからPHPを呼び出す際、 /usr/bin/php /home/id/public_html/test.php ↑の様に普通に呼び出すと問題ないのですが、 ↓の様に、引数付きで呼び出すと正しく認識してくれません… /usr/bin/php /home/id/public_html/test.php?mode=1 シェルスクリプトから引数付きでPHPを呼び出すにはどうしたらよいのでしょうか?
44 名前:デフォルトの名無しさん mailto:sage [2005/04/14(木) 10:54:18 ] >正しく認識してくれません そりゃそうだ。 そのままではシェルからはtest.php?mode=1というファイルを探しに行ってしまう。 私ゃphpは知らんが、コマンドライン引き数として渡せばいいのなら /.../test.php mode=1 でいいかと。 そうでないなら標準入力? cgiに詳しい人の降臨待ちかな。
45 名前:43 mailto:sage [2005/04/15(金) 07:36:31 ] >>44 なるほど、そうですよね。 シェルスクリプトってDOSでいうバッチファイルみたいなもんなんですよね… なんだかおバカな質問してしまってました。 どうもありがとうございました。
46 名前:デフォルトの名無しさん [2005/04/18(月) 22:25:35 ] Cygwin上のbashでスクリプトを組んでいるのですが教えてください あるデータ 1,2,3 abc があってこれをカンマを区切り文字として それぞれを変数に代入したいのですが、どうやればいいんでしょうか DATA="123,456,789 abc" set -- ${DATA} for i in $@; do echo $i done 上の様にやると 123,456,789 abc と空白で区切られてしまいます setコマンドで読み込む時に区切り文字は指定できないんでしょうか IFS変数をいじってみたけどダメでした あるいは他の方法(コマンド)があるんでしょうか
47 名前:デフォルトの名無しさん mailto:sage [2005/04/18(月) 22:47:48 ] awkでやれば? それよりもUNIX板で聞いた方が確実。
48 名前:デフォルトの名無しさん mailto:sage [2005/04/18(月) 22:53:12 ] >>46 $ IFS=, ; for i in "$*" ; do echo $i ; done 123 345 678 abc $ IFS=, ; for i in $* ; do echo $i ; done 123 345 678 abc
49 名前:デフォルトの名無しさん mailto:sage [2005/04/18(月) 22:55:05 ] >>26-30 ワロタ
50 名前:デフォルトの名無しさん mailto:sage [2005/04/18(月) 23:06:22 ] 「シェルの比較」はスレ違いだな
51 名前:デフォルトの名無しさん mailto:sage [2005/04/18(月) 23:34:18 ] >>47 >>48 アドバイスありがとうございます なんとかできました
52 名前:デフォルトの名無しさん [2005/05/22(日) 13:10:43 ] tcshなんてヽ( ・∀・)ノ●ウンコー
53 名前:デフォルトの名無しさん [2005/05/22(日) 13:17:36 ] kshなんてヽ( ・∀・)ノ●ウンコー
54 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 14:56:59 ] ashなんてヽ( ・∀・)ノ●マンコー
55 名前:デフォルトの名無しさん [2005/05/23(月) 22:52:38 ] ヽ( ・∀・)ノ●ウンコーbashで質問です 引数に与えられたファイルの最終更新時刻から現在までの時間を求める 関数fooを作成したのですが function foo(){ local nowtime=$(date '+%s') loca lfiletime=$(date -d "$(ls --full-time $1 | cut -d' ' -f8,9)" '+%s') let difftime=$nowtime-$filetime let h=${difftime}/3600 let m=${difftime}%3600/60 let s=${difftime}%3600%60 echo ${h}:${m}:${s} } 使い方: foo filename 処理速度が遅くていけてません もっといい方法があったら教えてください
56 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 23:19:21 ] 速度を求めるなら C で書くのがいいと思う
57 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 20:33:15 ] >>55 スクリプトに速度を求めるのは間違い。 difftime以外の変数を全廃してそれでも遅ければ別の方法を検討するべき >>56 おおむね同意
58 名前:55 mailto:sage [2005/05/26(木) 00:13:13 ] >>56 >>57 まぁそりゃそうなんですけどね Cで書いた方が(この処理に関しては)楽だし もっとエレガントにできちゃう方法があるのかなと聞いてみますた アドバイスありがとうございました
59 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 20:24:26 ] つまり役立たずは消えろってことだよ わかった?>>56-57
60 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 21:02:35 ] なんかほのぼの…
61 名前:デフォルトの名無しさん [2005/06/06(月) 21:18:28 ] bashなんですが教えてください シェルスクリプトソースに含まれる変数を抽出しようとして ますが、いい方法が思いつきません cat hoge.sh | grep '\$.+' | 'ここがわからんぽ' | sort | uniq 'ここがわからんぽ'を' sed 's/\$.\+/'にすれば「変数」だけ取り除けるんですが sedの置換条件を反転すればいいんでしょうけどやり方がわからん・・
62 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 22:22:49 ] とりあえず俺が思いついたの。でもこれでは一行につき一個しか取り出せない。 sed 's/.*\(\$\w\+\).*/\1/p'
63 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 23:06:57 ] sedではツールの仕様上、一行に一つだと思うけど。 awkとかperlとか。もっと本格的にlex(もしくはその親戚)とか
64 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 00:01:32 ] >>61-63 どれどれ、じいにやらしておくれでないかい? 以下のスクリプトをファイルに書き込んで、sed -n -f に渡してみ。-nは重要さの。 :restrt s/^[^$]*\$/$/ texist bend :exist h s/\(\$[a-zA-Z0-9_{}]*\)/\1\ / P s/.*\ // trestrt :end
65 名前:64 mailto:sage [2005/06/07(火) 00:05:59 ] >>64 見直すと、6行目の「h」は全く要らんのお。取り去っておくれや。 じいの時代はの、 ・ラベルは6文字まで。 ・sedの扱う正規表現には\wとか+とかなかった。 ・sedにグループ化の記号{}とかはなかった。 だったので読みにくくてすまんのお。 若い人が現在のモダンなsed向きに綺麗に書き直しておくれ。
66 名前:62 mailto:sage [2005/06/07(火) 00:06:41 ] むはは。ダメダメだわこれ。つか変数部分の終了を検知するのマンドクセ >>63 sedでも不可能ではないと思う。けど相当にややこしい。
67 名前:62 mailto:sage [2005/06/07(火) 00:08:06 ] あ、いつのまにか偉い人が。
68 名前:64 mailto:sage [2005/06/07(火) 00:08:29 ] それから、じいの時代には改行に\nとか使えなかったのも sコマンドの切れ目のわかりにくさに影響しとるのお。 年寄りの話は長くていかんってか?まあ先が短いんだから大目に見ておくれ。
69 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 00:46:39 ] :restrt s/^#// tend 冒頭にこう入れちゃうのはどうでしょ。 あとbashでは${}の中に%#:-=+*?!/がありだから、 凝ったスクリプトだと途中で切れちゃう変数が出ますね。
70 名前:デフォルトの名無しさん [2005/06/07(火) 23:48:04 ] kshですが教えてください。 cat TEST* > test_all.dat としたいのですが TEST*にマッチするファイルが多すぎてエラーに なってしまいます。 初心者の私では ls > file.list としてfile.listに該当ファイル名を出力し そこから一件づつtest_all.datに追記する方法しか 考えられませんでした。 何かいい方法があれば教えてください。
71 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:05:49 ] >>70 man find
72 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:46:02 ] >>70 ls -1 | grep ^TEST | xargs cat > test_all.dat lsがaliasされてる場合は注意。
73 名前:デフォルトの名無しさん [2005/06/08(水) 19:02:57 ] >>71 findでなんとかなるのでしょうか? >>72 ありがとうございます。 試してみます。
74 名前:デフォルトの名無しさん [2005/06/08(水) 19:10:27 ] >>71 すみません。わかりました。 72とほぼ同じ方法ですね
75 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 22:28:02 ] 少し知恵を貸してほしいのですが・・・ SQLで吐かしたテーブルのカラム名を 単純にカンマで区切って連結させたいのだけど どうすればいいでしょうかね?
76 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 23:02:57 ] >>75 > SQLで吐かしたテーブルのカラム名 というのはどうでもよくて、 それがどういうフォーマットなのか を書かないと訳がわかりません
77 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 00:12:57 ] >>72 > ls -1 | grep ^TEST | xargs cat > test_all.dat > lsがaliasされてる場合は注意。 \ls みたいにエスケープすれば、エイリアス展開を抑制できるよ スクリプトなら必須
78 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 01:36:07 ] し、知らなかった…
79 名前:デフォルトの名無しさん mailto:sage [2005/06/10(金) 01:35:51 ] つか、スクリプト書くのにaliasされてしまう設定って・・・
80 名前:デフォルトの名無しさん [2005/07/11(月) 23:17:23 ] サーバーにパスワードでログインして サーバのシェルからpingをどこどこに何回打って そのlogを保存する とかのスクリプトの書き方を教えてください。 よろしくお願いいたします。
81 名前:デフォルトの名無しさん mailto:sage [2005/07/11(月) 23:29:00 ] おれはその手の作業はteratermマクロでやってるから。 shより便利だから!
82 名前:デフォルトの名無しさん mailto:sage [2005/07/11(月) 23:29:00 ] >>80 サーバーが送ってくる文字列(Login:とか)を待って、それに応じて こっちから文字列を送り返す作業が必要。これにはexpectが便利。 いろんな言語用にいろんなバリエーションがあるけど、 シェルスクリプトでということだからexpect(1)だろうな。後はググれ。 pingの結果を保存する方法はexpect(1)がわかれば自然にわかっから。 それから、パスワードをスクリプト中に書いたり、ファイルに保存したりは すんなよ(なるべく)。これもexpec(1)ならユーザに入力させるように書ける。
83 名前:デフォルトの名無しさん mailto:sage [2005/07/12(火) 00:52:08 ] ping -t 5 > a.txt
84 名前:デフォルトの名無しさん [2005/07/12(火) 21:51:39 ] >>81 >>82 >>83 レスありがとうございます。 今、telnet(5のサーバに連続で)で接続して、 pingとかを打ってそのログがどうだったら この値を返すとか 考えてまして。。。 まったくシェルスクリプト書いた事ないので。。。 今、cygwinで少し理解できるようになりました この文字を返す
85 名前:デフォルトの名無しさん mailto:sage [2005/07/12(火) 22:25:25 ] teraterm便利だよね UNIXもこれなかったら死滅してたよ
86 名前:84 [2005/07/12(火) 22:49:38 ] telnet でサーバに接続して loginIDとパスワードを打ち込むシェルスクリプトはどの様に書けばよろしいのでしょうか?
87 名前:84 [2005/07/12(火) 23:43:50 ] ( sleep 5 ; echo user; sleep 1 ; echo pass; sleep 1 ; echo ipconfig ) | telnet host であってますでしょうか?
88 名前:デフォルトの名無しさん mailto:sage [2005/07/13(水) 02:12:17 ] 上のsleepみたいな不確実なことしないといけないのでしょうか。 出力から何か文字列がきたら切り分けるって風に組みたいんですが。
89 名前:デフォルトの名無しさん mailto:sage [2005/07/13(水) 03:09:15 ] expect使えばって書いてあるのに何で使わないの?
90 名前:デフォルトの名無しさん mailto:sage [2005/07/13(水) 03:44:51 ] もはやシェルスクリプトじゃないじゃn
91 名前:デフォルトの名無しさん mailto:sage [2005/07/13(水) 04:30:02 ] 横レスだが、expect はバランスが悪くないか 追加でプログラムをインストールする程の機能でもないし 個人で使ってるマシンなら良いけど
92 名前:デフォルトの名無しさん [2005/07/27(水) 07:40:54 ] 複数ディレクトリ以下の文字コードを一度に全部変換したいのですが、 うまい方法あったら教えてください。 シェルスクリプト、もしくはperlで実現したいです。 よろしくお願いします。
93 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 10:37:25 ] >>92 変換対象はファイル名か? それともテキストファイルか? いずれにしても、perlなんぞを持ち出すまでもないだろ。
94 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 15:08:00 ] >>92 find directories -type f -exec ... ... の部分はいろいろ。元ファイルを新文字コードの内容で置き換えてくれる プログラム(やスクリプト)なら自明。だけど、別なファイルに書き込む場合でも -exec mv {} {}.orig \; -exec コード変換 {}.orig {} \; とか書けばいい。
95 名前:92 [2005/07/27(水) 18:41:15 ] すいません。説明不足でした。 ファイル名がわからない状態で変換したいです。 .exeファイルなどは無視して .cpp .hppファイルとかだけを全部検索して 順番に文字コードを変換していきたいです。
96 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 19:15:59 ] >>95 だったら find ... -name '*.cpp' -o -name '*.hpp' ... とか。 portability気にしなくていいなら -o 使わずファイル名パターンに凝ってもよい。 後は適当にman findして。
97 名前:92 [2005/07/27(水) 22:04:12 ] >>96 基本はfind使っていくのがよさそうということですね。 今からman findがんばって読みます。 ありがとうございました。
98 名前:デフォルトの名無しさん [2005/08/05(金) 16:35:18 ] age
99 名前:デフォルトの名無しさん mailto:sage [2005/08/05(金) 20:00:08 ] なんでfindみたいなクソコマンドがいまだに残ってるのか不思議でしょうがない そんなUNIX
100 名前:デフォルトの名無しさん mailto:sage [2005/08/05(金) 22:41:37 ] 釣れますか?
101 名前:デフォルトの名無しさん mailto:sage [2005/08/05(金) 23:44:45 ] DOSのfindコマンドよりはまし。
102 名前:デフォルトの名無しさん [2005/08/07(日) 12:49:43 ] tacコマンドに相当する機能を実現したいのですが、 どう実装するのが一番効率がいいんでしょうか シェルはbashです
103 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 13:44:39 ] >>102 シェルスクリプトだけじゃなんともならないような。 awk使えばなんとでもなるけど。
104 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 14:37:16 ] findのオプション並べるの面倒だから GUIで作ってくれないかな
105 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 14:40:31 ] >>104 シェルスクリプトでは無理。
106 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 15:03:29 ] >>102 一番効率が良いかどうかは知らない。 cat -n file | sort -nr | cut -f2- 100万行超えないなら sort -r にすれば速くなる。
107 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:09:13 ] それのどこがシェルスクリプトなんだか。
108 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 18:27:14 ] >>107 シェルの組込みコマンドだけで作るのがシェルスクリプトだと思ってる?
109 名前:107 mailto:sage [2005/08/07(日) 20:15:58 ] >>108 いやぁ、3段もプロセスかませてtacの劣化コピー作るメリットがないかと。 とても効率いいとは思えないしね。
110 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 20:20:47 ] >>109 誰もそんなこと聞いてないんだが
111 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 20:24:47 ] 日本語が不自由なんだな
112 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 20:34:04 ] 違うなぁ、なんか違うんだよ。 シェルスクリプトを名乗るんならなんかこう、ソウルが感じさせて欲しいわけよ。 ただ外部コマンドを並べました。そんな誰でも書けるような単純なものじゃなくてね。 だからってまぁ、シェル組み込みコマンドだけで作らなきゃいけないなんて言う訳じゃないよ。 外部コマンドだって重要なファクターさ。外部コマンドをパイプラインで繋いでいって、 それで素敵なハーモニーが産まれるなら文句は言わないよ。 でもなぁ。cat, sort, cut, なんて響いてこないんだよ。ハートにね。 折角シェルスクリプトでやるんだったら最初にも言ったけど、ソウルを感じさせてよ。
113 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:21:37 ] >>112 シェルスクリプトが一番流行って発展したのは1980年代だと 思うけど、その頃のソウルって結構>>106 みたいな感じよ。 >>112 がソウルを感じるスクリプトの具体例みたいなのってある?
114 名前:113 mailto:sage [2005/08/07(日) 22:29:17 ] あと、 >>112 そんな誰でも書けるような単純なもの このへんが俺のソウルと波が合わないなあ。 JCLと対比してのシェルだとか、 Multicsを踏まえてのUnixとか、 精細粒度のプログラミングと対比してのシェルスクリプトとか、 そういう思想は、むしろ「単純なもの」を目指す哲学だったはずよ。 「誰でも書ける」とまで甘くみてたエンジニアはさすがにいなかったけど。 ま、こんなこと2chで書いても、親父ハケーンとか笑われちゃうんだろうな...
115 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:06:11 ] 単なるツールボックスアプローチにソウルも何もあるかっw
116 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 00:23:49 ] >>108 が図星で勢いで誤魔化しただけだろ
117 名前:107≠112 mailto:sage [2005/08/08(月) 02:55:47 ] >>116 1行野郎をシェルスクリプトと言いたくなかっただけなんですが。 そういう意味では、>113とは思いっきり反りが合わないらしい。 #>112はなんかのコピペみたいで受けたけど。 >>113 えーと、>112じゃないけどwhatisとか?
118 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 03:16:19 ] 効率のいいスクリプト引っさげて再登場するのかと思ったら…
119 名前:107≠112 mailto:sage [2005/08/08(月) 05:01:01 ] だって>103なんだもの。お目汚しにawkの例。 -- { line[NR] = $0; } END { for (ic = NR; ic > 0; --ic) { print line[ic]; } } -- 行数多くて泣いても知らない。
120 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 07:38:13 ] ひっくり返すだけなら reverse() { local line if read line; then reverse echo $line fi } reverse
121 名前:デフォルトの名無しさん mailto:sage [2005/08/10(水) 21:06:35 ] インラインにすりゃいいってもんじゃなだろ的なものをわざわざ淫乱で書く それがシェル|スクリプト|クオリティ
122 名前:デフォルトの名無しさん mailto:sage [2005/08/11(木) 09:50:15 ] 曰く「○○があるだろ」 曰く「○○で十分」 曰く「車輪の再発明はするな」 大人は誰もわかっちゃくれない
123 名前:デフォルトの名無しさん mailto:sage [2005/08/13(土) 03:03:47 ] これを仕事にしているから。 仕事だから「実現する事」がなによりも優先されるのだよ。
124 名前:デフォルトの名無しさん mailto:sage [2005/08/14(日) 09:17:58 ] ソウルってチョンだろ
125 名前:デフォルトの名無しさん mailto:sage [2005/08/14(日) 09:52:03 ] >>123 子供が遊んでる横でそれを言うのはナンセンス。
126 名前:デフォルトの名無しさん [2005/08/17(水) 13:06:26 ] sshやtelnetでリモート端末にログインしたあと、さらにその端末でコマンドなどを実行するにはどのようにしたらよいのでしょうか?
127 名前:デフォルトの名無しさん mailto:sage [2005/08/17(水) 13:23:07 ] >>126 ログインシェルに実行したいコマンドを書いておくとか、 ログイン時に実行したいコマンドも指示するとか。
128 名前:デフォルトの名無しさん mailto:sage [2005/08/17(水) 13:33:06 ] man sshすると書いてある。 ssh [-l login_name] hostname | user@hostname [command] % ssh nanasi@server "ping -c 5 www.example.com" > logfile とやると手元のlogfileにpingの結果が残る。
129 名前:デフォルトの名無しさん [2005/08/17(水) 13:52:42 ] >>128 灯台もと暮らしでした
130 名前:デフォルトの名無しさん mailto:sage [2005/08/17(水) 14:19:11 ] >>129 >灯台もと暮らしでした あんたは灯台守かい。
131 名前:デフォルトの名無しさん [2005/09/06(火) 01:37:49 ] C言語のライブラリをシェルスクリプトで使う(呼び出す)方法知ってますか? ライブラリの中にchar *moji( char *, int, char ) が有った場合の 呼び出し方がわかりません。 (昔作った事があったのですが、ど忘れ…) 詳しい方、教えて下さい。お願いします。
132 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 01:43:52 ] >>131 無理なので諦めましょう
133 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 01:48:08 ] >>132 無理じゃないんだよ。 昔、新人の時に教わって作った事があるけどシェルスクリプト久しぶりで… ネットで検索しても引っかからないから、詳しい人に教えて貰いたいです。
134 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 02:51:38 ] 新人の頃の先輩に聞けよ
135 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 05:59:40 ] 「printfとかmkdirとか、ライブラリと同名のプロセスを呼んでいた」に一票。
136 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 10:48:06 ] ニ票
137 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 13:04:09 ] 三票
138 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 13:23:49 ] もしかしてrundll32.exeのことかね。 C言語のライブラリではたぶん使えないが。
139 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 19:39:47 ] >>138 シェルスクリプトと言ってる時点でUN*Xでしょ? スレ的にも。
140 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 21:31:34 ] 誰もUN*Xなんて断ってないが。 もし132の言う物が別にあったとしても原理は同じ様なものだろ。
141 名前:デフォルトの名無しさん mailto:sage [2005/09/06(火) 22:27:20 ] ウホっ良い強弁
142 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 10:23:50 ] >>140 > もし132の言う物が 132が何を言ったって? > From: [132] デフォルトの名無しさん <sage> > Date: 2005/09/06(火) 01:43:52 > > >>131 > 無理なので諦めましょう
143 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 23:36:32 ] >>131 の者です。 解決しました。違う掲示板で回答が有りました。 共通関数 . にするよに、やり方は簡単でした。(方法は.ではないよ) どももお騒がせしました。
144 名前:デフォルトの名無しさん mailto:sage [2005/09/07(水) 23:39:03 ] >>143 僕らの手の届かない所に逝ってしまったみたいですね. さようなら...
145 名前:デフォルトの名無しさん mailto:sage [2005/09/19(月) 01:54:44 ] うわぁ、イタい質問w
146 名前:デフォルトの名無しさん [2005/10/04(火) 13:24:56 ] クストン 肝心なことが抜けていた atコマンドでは at -f <filename> "13:00" という具合に指定はできても、 at -f <filename> <指定ファイル> "13:00" みたいなことが出来ないみたいなんだ。 つまりayasii_shという実行ファイルには必ず参照するファイルを指定しないといけないわけ "ayasii_sh ayasii_config" みたいな。 でもそれを "ayasii_sh ayasii_config" "13:00"という風には入れられないんだ at -f
147 名前:デフォルトの名無しさん mailto:sage [2005/10/04(火) 14:17:30 ] >>146 肝心なことが抜けていた ???それが肝心なことだというの??? 一体 >>146 は何についてのレスなのさ? 何かの誤爆?
148 名前:デフォルトの名無しさん [2005/10/04(火) 22:25:28 ] シングルユーザーモードで立ち上げざるを得ないは、 ボーンシェルじゃないと動かないから、 少なくともシステム管理やる人間は、 ボーンシェル必須って教えられてきたけどね。
149 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 01:01:04 ] んなこたーない。
150 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 01:26:36 ] 仕事でシェルスクリプト書くことになったんだが・・ オススメの参考書を教えてくれぇ。・゚・(ノД`)・゚・。 ・・・ちなみにBシェルね(゚∀゚)
151 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 01:55:04 ] >>150 man bash いや、マジで。
152 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 02:14:14 ] >>151 いや、確かにそうなんだが・・ なんというか、その。 手元にある安心感とか・・ ね? 考えるより印刷したほうが早いかな (;´Д`)
153 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 03:30:18 ] >>152 ttp://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html これ印刷したら結構なページ数になると思うよ。 趣味で書くならともかく、仕事なんだから仕様をきちんと 理解しないといけないわけでしょ。 なら、まずは man を読む事から始めないとね。
154 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 05:05:19 ] bashのドキュメントだけどさ、GNU発祥なんだからmanより先に infoなのでは。少なくとも「公式」の情報はinfoの方でしょ。 どちらも精読したわけじゃないから、違いは知らんとです。(弱っ)
155 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 08:07:06 ] Bシェルつってんだから、man sh だろ
156 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 13:27:31 ] >>150 「UNIXプログラミング環境」 ttp://www.amazon.co.jp/exec/obidos/ASIN/4871483517 B-shellの書き方だったらこれがお薦め。 ほかの部分は古くなってるが読んでおいたほうがいい。
157 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 13:40:11 ] >>156 それクリックしてマーケットプレースのを注文しちゃった
158 名前:デフォルトの名無しさん [2005/10/14(金) 01:35:02 ] EXPECTでテキストファイルを一行ずつ読む方法を教えてください
159 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 09:45:17 ] なぜ?
160 名前:デフォルトの名無しさん [2005/10/15(土) 20:35:11 ] 下記のプログラムでX.X.X.Xの所(1.1.1.1,2.2.2.2,3.3.3.3と続く)を ファイルから読み出して実行する方法を教えてください。 #!/usr/bin/expect telnet X.X.X.X expect -ex "login:" send "UUUUU\r" expect "Password:" send "UUUUU\r" expect "linux$" send "ifconfig" expect "linux$" send "exit\r" expect eof
161 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 20:49:18 ] >>160 expectって俺は使ったこと無いけど あれはたしかtclの変種でしょ 普通にtclのコマンド使えばいいんじゃないの。 openとかgetsとか
162 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 21:17:44 ] >>160 > #!/usr/bin/expect この時点でシェルスクリプトではないのだが。
163 名前:デフォルトの名無しさん [2005/10/15(土) 21:36:41 ] >>162 書き直します #!/usr/bin/sh expect -c telnet X.X.X.X expect -ex "login:" send "UUUUU\r" expect "Password:" send "UUUUU\r" expect "linux$" send "ifconfig" expect "linux$" send "exit\r" expect eof よろしいでしょうか? アドバイスください。
164 名前:デフォルトの名無しさん mailto:sage [2005/10/15(土) 21:47:47 ] で、openだのgetsだのは使ってみたの? tclはほとんど使わないが、たぶん set filename ファイルの名前 set fd [ open $filename r ] while { [ gets $fd line] != -1 } { lineを処理 } close $fd とかそんな感じだと思われるが。 ま、動的に必要なパラメタがIPだけならargv渡しでもいいだろうし シェルでラップするんならシェル変数とクォート使って 埋め込んでもいいよな。 好きにしる。
165 名前:デフォルトの名無しさん [2005/10/15(土) 21:50:12 ] >>164 ありがとうございます^^ 今から試してみます。 本当にありがとうございました。
166 名前:デフォルトの名無しさん [2005/11/01(火) 23:36:11 ] お世話になります。 LynxOSでシリアル経由にて装置を制御する シェルスクリプトを考えています。 STTYコマンドで調歩同期の設定しようと思いますが なかなかうまくいきません。 どなたかご存知の方ご教諭くださいますようお願いします。
167 名前:デフォルトの名無しさん [2005/11/11(金) 10:47:24 ] すみません。息詰ってしまいました。 質問させてください。 B-Shellで与えられたホスト名、ユーザー名、パスでFTPログインできるか 確認だけ行いたいのですがやり方がわかりません。 ログインエラーも判断させる感じで作りたいのです。 シェル初心者で恐縮なのですが どなたかご存知の方いらっしゃいましたらご教授お願いします。
168 名前:デフォルトの名無しさん mailto:sage [2005/11/11(金) 11:52:07 ] >>167 君がやり方を分からなかろうと知ったことでは無いし、"初心者"が免罪符になると思っているなら書き込むな
169 名前:デフォルトの名無しさん mailto:sage [2005/11/11(金) 14:39:13 ] >>166 ここじゃなくて、使っているOSの端末ドライバについて 質問するようなスレに行ってください -- それは端末ドライバのせいなんだよ
170 名前:デフォルトの名無しさん mailto:sage [2005/11/11(金) 17:14:36 ] >>167 それは質問ではなく「作ってよこせ」というお願いですよ。
171 名前:デフォルトの名無しさん mailto:sage [2005/11/19(土) 15:19:56 ] 最近bashを勉強中ですが、ちょっと質問させてください シェルスクリプトでコマンドを実行して 失敗したら強制終了させたいのですがどうしたらいいでしょうか? COMMAND=mkdir test if ! $COMMAND then echo "失敗" exit 1 fi echo "成功" これじゃ、だめですよね?
172 名前:デフォルトの名無しさん mailto:sage [2005/11/19(土) 16:12:54 ] ヒント:直前のコマンドの終了ステータスは変数 $? に格納される。
173 名前:デフォルトの名無しさん mailto:sage [2005/11/19(土) 17:00:01 ] ありがとう>>172 さん 親切な方がいて助かりました ついでにもう1つ質問させてください シェルスクリプトでヒアドキュメントを使ってファイルに書き込むにはどうしたらいいでしょうか?
174 名前:デフォルトの名無しさん mailto:sage [2005/11/19(土) 17:08:01 ] >>173 command > file <<EOF ... ... ... EOF
175 名前:デフォルトの名無しさん mailto:sage [2005/11/19(土) 17:30:08 ] >>174 ありがとうございますー! 素敵です・・・
176 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 10:21:45 ] いや、manページを読めば判ることで素敵って言われても。
177 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 12:24:42 ] >>176 すいません 何のmanページ見たらいいのかわかりませんでした・・・ そこでまた質問させてください useraddを実行したとき自動でパスワードを入力させるにはどうしたらいいでしょうか?
178 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 12:53:51 ] つ[man bash]
179 名前:デフォルトの名無しさん mailto:sage [2005/11/21(月) 19:49:25 ] 仏の顔もってやつだなw
180 名前:177 mailto:sage [2005/11/21(月) 23:41:48 ] ちょっと質問間違えました シェルスクリプトでpasswd hogeを実行した場合 パスワードを求められますが、これを全部シェルスクリプトで行いたい。 これって無理でしょうか?
181 名前:デフォルトの名無しさん mailto:sage [2005/11/22(火) 00:58:02 ] このスレで、passwordとかパスワードとか検索して、その前後100回読んで、 あと、UNIX板のシェルスクリプトスレでも同じことして、 それでもわからなければあきらめろ
182 名前:177 mailto:sage [2005/11/22(火) 01:48:17 ] >>181 ありがとう がんばってみます
183 名前:デフォルトの名無しさん mailto:sage [2005/11/22(火) 02:18:59 ] なんかUNIX板で似たような質問を見てきた気がするけど、気のせいかな?
184 名前:デフォルトの名無しさん mailto:sage [2005/11/22(火) 04:40:34 ] >>183 がんばる=他のスレでも質問する だったみたいだな。w
185 名前:デフォルトの名無しさん [2005/11/26(土) 11:08:04 ] shellスクリプトの開発環境ってありますか? べた打ち、ベタ読みは不便で・・・ 命令文や変数に色がつく程度でも良いのですが・・・
186 名前:デフォルトの名無しさん mailto:sage [2005/11/26(土) 11:33:47 ] >>185 お使いのエディタに、キーワードを登録してください。 登録済みキーワードに色がつかないエディタをお使いなら、適宜乗り換えてください。
187 名前:デフォルトの名無しさん mailto:sage [2005/11/26(土) 17:29:36 ] 試しにxyzzy bash-mode でぐぐったら引っかかった。 いいかも、これ。
188 名前:デフォルトの名無しさん mailto:sage [2005/11/26(土) 20:10:23 ] 何で色が付かないと不便なんだろう 漏れは逆に色が付いてると禿しく見にくい
189 名前:デフォルトの名無しさん mailto:sage [2005/11/26(土) 21:31:21 ] 色使いが悪いだけじゃないのか
190 名前:デフォルトの名無しさん mailto:sage [2005/11/26(土) 22:30:11 ] エディタ操作って「慣れ」とか「親しんだ環境」が最重要事項だから
191 名前:デフォルトの名無しさん [2005/11/26(土) 23:20:32 ] >>186 えーとえーと、 viエディタでガリガリ書いて、コンパイルして ってのに疲れたんです。 teratarm君はお目目に優しくないし・・・ エディタが擬似的に実行したりしてくれないかなあ・・・ >>187 情報ありがとうございます。 でもエディタそのものの使用で挫折しました。
192 名前:デフォルトの名無しさん mailto:sage [2005/11/26(土) 23:23:07 ] >>191 コンパイル?
193 名前:デフォルトの名無しさん [2005/11/27(日) 00:05:10 ] >>192 まちげーた・・・ sh ほにゃらら で、毎回実行して ってのが正解です。 別にshって打つのは辛くないです。パス通す方が雌鳥なだけです。 まあその程度の人間だってことです。俺は。
194 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 00:14:21 ] パス通す?
195 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 00:44:41 ] 実行権限与えるのがめんどくさい、じゃねーのか? パスが通ってなかったら、sh 打ったって実行できん。 chmod 777 hoge するのが面倒なら、それこそシェルスクリプト組んどけ。
196 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 00:50:44 ] #!/hoge すら書いてなさそうな香具師だな
197 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 01:28:22 ] まあ何だか知らないが、今までvi使ってたんならvimはどうよ。あれ 色つくだろ。
198 名前:デフォルトの名無しさん [2005/11/27(日) 01:32:53 ] なるほどー。 でも何でか、sh でカレントから新しくシェルを起動できるんだけどな? ファイル名単体で打ったらダメだけど・・・環境変数に書いた覚えないし。 と思ったら、スクリプトの一行目が #!/bin/sh だったことを思い出した。 なるほど。そうか、パスは通してるのか。ふむふむ。 「実行権限を与えてパスを通す」。なるほどなるほど。 いやー、どれだけ自分の知識が曖昧か再認識しましたよ。
199 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 02:00:46 ] >>197 どうやらvimにシェルは無いっぽいです。 というわけで、terapadの色の設定を ガリガリ書き換えることにしました。 皆様お世話になりました。 また何かあったらよろしくお願いします。
200 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 02:14:08 ] 200
201 名前:デフォルトの名無しさん mailto:sage [2005/11/27(日) 10:30:51 ] >>195 >パスが通ってなかったら、sh 打ったって実行できん。 へ?
202 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 00:05:03 ] 俺も>>195 は意味不明だが、スルーした方がよい気がする
203 名前:デフォルトの名無しさん [2005/12/04(日) 19:53:23 ] ファイル名を一括置換するシェルスクリプト #! /bin/sh for nm in temp*; do mv $nm HOGE${nm#tr}; done temp → HOGEにするのはわかるのですが、 hhh_a_xxxxxxxxx.txt → hhhaxxxxxxxxx.txt のように _ を削除(一括置換)するスクリプトを教えてください。 ※xxxxxxxxxは可変
204 名前:デフォルトの名無しさん mailto:sage [2005/12/04(日) 21:14:19 ] >>203 方法は色々あるけど tr -d あたりがお勧め。
205 名前:デフォルトの名無しさん mailto:sage [2005/12/04(日) 22:40:36 ] >>204 tr のコマンドの意味はわかったんだけど、どうやってコマンド組み合わせればいいの? tr は標準出力のものを対象にしてると書いてあったけど、コマンドの組み合わせ方が、わかんないです。
206 名前:デフォルトの名無しさん mailto:sage [2005/12/04(日) 23:17:46 ] >>204 #!/bin/sh for f in hoge* do mv $f `echo $f | tr -d 削除文字` done できたよ。ありがとう。
207 名前:デフォルトの名無しさん [2005/12/09(金) 19:09:12 ] 質問なんですけど、 NTのコマンドプロンプトで テキストファイルが二つあって 中身を片方にアペンドしたいのですが どう記述したらいいでしょうか? マニュアルも何もなくて一人で困ってます
208 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 19:10:20 ] type a.txt >> b.txt
209 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 20:00:54 ] ありがとうございました ホント助かります
210 名前:デフォルトの名無しさん mailto:sage [2005/12/10(土) 02:05:23 ] helpコマンドがある
211 名前:デフォルトの名無しさん [2005/12/12(月) 13:58:44 ] 数100人のユーザがいるLinuxで 全ユーザのパスワードを一括で設定できる シェルスクリプトを教えろよ。
212 名前:デフォルトの名無しさん mailto:sage [2005/12/12(月) 14:04:46 ] sed 's/:[^:]:/:hoge:/'
213 名前:デフォルトの名無しさん mailto:sage [2005/12/12(月) 22:19:23 ] evalって問答無用に変数を展開しちゃうんですよね?
214 名前:デフォルトの名無しさん mailto:sage [2005/12/12(月) 22:39:28 ] どういう局面のことを言ってるのかわからんけど、 変数を展開するのはevalじゃないと思われ。 多分だけど、eval以前に変数が展開されてるんちゃうか。再確認してみ。 evalは展開された結果を評価してるだけのはず。
215 名前:デフォルトの名無しさん [2005/12/19(月) 15:43:31 ] user> ./a.out < a000001.txt > result.txt で結果をtxt化しているのですが、a000001.txtをa100000.txtまで処理させて 一個一個の結果を足して一つのtotal_result.txtしていきたいのです。 どのようにしたら良いのでしょうか? 具体的にはa000001.txtは以下のように出力されたとします。 1 0 3 2 4 3 3 7 7 4 8 3 5 8 1 6 2 8 7 0 4 8 2 3 a000002.txtも以下のように出力されたとします。 1 0 3 2 2 6 3 4 7 4 6 3 5 2 2 6 6 9 7 1 1 8 1 2
216 名前:デフォルトの名無しさん [2005/12/19(月) 15:44:16 ] これが10万まで続くのですが、結果の2列目と3列目を足していきたのです。 1 0 6 2 6 9 3 11 14 4 14 6 5 10 3 6 8 17 7 1 5 8 3 5 (これは先ほどの二つの結果の合計です)
217 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 16:06:02 ] スレ違い回答だが awk '{x[$1]+=$2;y[$1]+=$3;} END {for(i=1;i<=3;i++)printf("%d %d %d\n",i,x[i],y[i]);}' result*.txt
218 名前:215 mailto:sage [2005/12/19(月) 18:20:06 ] >>217 さん レスありがとうございます。 UNIX初心者な者で解答をみてもよく分からないのが現状です。 gccでコンパイルした後、どうしていけば10万のファイルの結果を合計していけるのでしょうか? スレ違いとは思いますが、ご指導いただけたらと思います
219 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 19:12:10 ] んなのプログラムの方変更した方が早いよ
220 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 19:14:39 ] んなのが調べられないぐらいのレベルなら 聞いてボーッと回答待つより1万行のバッチ書け。
221 名前:デフォルトの名無しさん mailto:sage [2005/12/20(火) 20:43:04 ] 変数置換えで入れ子したい! ${${NAME##*/}%.*} こゆー事したい場合どんなのがスマート? わかりにくいね、上のはbasename ${NAME%.*} なんだけど
222 名前:デフォルトの名無しさん mailto:sage [2005/12/21(水) 02:55:27 ] >>221 $ x=/a/b/c.d $ y=${x#${x%?}} $ echo $y d こういう事ならできるけど、前後を一変に取り除く方法は知らない。 $ x=/a/b/c.d $ y=${x%.*} $ y=${y##*/} $ echo $y c これじゃダメなの?
223 名前:デフォルトの名無しさん mailto:sage [2005/12/21(水) 09:50:00 ] >>215 joinを知れば何かが見えてくる。
224 名前:デフォルトの名無しさん mailto:sage [2006/01/07(土) 16:12:11 ] 質問です。 例えばdateで現時刻をvar.txtに出力するとします。 date > var.txt txtファイルの中身は時間が書いてあると思うのですが、 もう一度↑のコマンドを実行した場合に、中身も上書きされてしまいますよね? それで同じファイルに↑のコマンドの実行結果を書き足していくことは不可能ですよね。 可能でしたらその方法をおしえてくだしあー
225 名前:デフォルトの名無しさん mailto:sage [2006/01/07(土) 16:19:45 ] >>224 date >> var.txt
226 名前:デフォルトの名無しさん mailto:sage [2006/01/07(土) 16:20:23 ] >>225 どうも
227 名前:デフォルトの名無しさん [2006/01/09(月) 18:04:46 ] ある年月が入力された時に、その前後の年月を出力するには どのようにすればよいでしょうか? 例: 200512と入力されると、200511 200601が出力される
228 名前:デフォルトの名無しさん mailto:sage [2006/01/09(月) 18:07:50 ] >>227 つ date コマンド
229 名前:デフォルトの名無しさん mailto:sage [2006/01/09(月) 18:21:10 ] dateコマンドでどのようにして前の月や次の月を 表示させるのですか?
230 名前:デフォルトの名無しさん mailto:sage [2006/01/09(月) 18:21:27 ] >>227 cut,sed,date,exprくらいでできそう
231 名前:デフォルトの名無しさん mailto:sage [2006/01/09(月) 20:53:50 ] >229 すくなくともgnuのdateはできるよ ttp://www.linux.or.jp/JM/html/GNU_sh-utils/man1/date.1.html
232 名前:227 mailto:sage [2006/01/09(月) 22:31:15 ] >231 おおこんなことができるのですね。 勉強になりました。 これでなんとかできそうです、ありがとうございました。
233 名前:デフォルトの名無しさん mailto:sage [2006/01/09(月) 22:38:31 ] どんな気持ちでこんなものを通したのか・・・ date --date '2 days ago' days agoって・・・
234 名前:227 mailto:sage [2006/01/09(月) 23:50:58 ] 行けそうと思ったのですが、現在時からの日にち計算しかできませんでした。 うーん。。 特定した日にちから指定するのは無理かもしれません。。
235 名前:デフォルトの名無しさん [2006/01/10(火) 00:05:08 ] 試してないので外れだったらスマンが date --date '20060101 + 1 month'
236 名前:227 mailto:sage [2006/01/10(火) 00:12:55 ] >234 いけました汗 ずっと1 monthの部分を外に出して実行してた大馬鹿者でした。 ありがとうございました。
237 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 05:42:11 ] bash って何て読むんですか? ばっしゅ ヴぁっしゅ びーしぇる ヴぉーんしぇる ヴぉーんあげいんしぇる ぷろんぷと・ヴぁっしゅ ヴぁにっしゅ 皆さん何て読んでますか?
238 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 06:54:52 ] bash
239 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 06:59:25 ] シーシェルは孤高
240 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 10:36:42 ] csh使ってる奴って変態なの?
241 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 12:13:36 ] Solarisだと標準がcshだし。
242 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 17:05:01 ] tcshが使えるのにcshを使ってたら変態 スクリプト書くのにもcshを使ってたら変態
243 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 20:09:55 ] >>241 こらこら、嘘を教えなさんな。
244 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 20:22:49 ] Solaris 1 のころならな
245 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 21:42:11 ] >>243 Admintoolでshとcsh以外選べたっけ?
246 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 22:10:04 ] >>245 admintool 自体が obsolete.
247 名前:デフォルトの名無しさん mailto:sage [2006/01/10(火) 22:33:06 ] そうだったのか。
248 名前:デフォルトの名無しさん mailto:sage [2006/01/11(水) 03:43:32 ] Oracle入れるとcsh押し売りされるよね
249 名前:デフォルトの名無しさん mailto:sage [2006/01/11(水) 04:03:14 ] あれは謎シェルだねw 何で直さないんだろうか。
250 名前:デフォルトの名無しさん [2006/01/22(日) 17:16:33 ] command | tee log | grep hoge としたときに、commandの終了ステータスを知る方法はありませんか? command > log ret=$? grep hoge log としとけばretを見ることで可能なんですが、それ以外で。
251 名前:デフォルトの名無しさん mailto:sage [2006/01/23(月) 00:42:08 ] kwsk
252 名前:デフォルトの名無しさん mailto:sage [2006/01/23(月) 16:39:20 ] (command; echo $? >/tmp/hoge) | .... じゃだめ?
253 名前:デフォルトの名無しさん mailto:sage [2006/01/26(木) 12:23:51 ] >>252 おお、なるほど! ありがとうございます。
254 名前:デフォルトの名無しさん mailto:sage [2006/01/27(金) 22:18:39 ] シエル先輩をいぢくるスレはここですか?
255 名前:デフォルトの名無しさん mailto:sage [2006/01/31(火) 06:00:01 ] >>250 もう遅いかな? bash には PIPESTATUS ってシェル変数があるよ。 $ true | false | exit 3 | true $ echo ${PIPESTATUS[@]} 0 1 3 0
256 名前:デフォルトの名無しさん [2006/02/19(日) 05:53:58 ] ファイルの更新日時を取得する方法を教えてください
257 名前:デフォルトの名無しさん mailto:sage [2006/02/19(日) 12:04:08 ] >>256 stat でもSunとかHPとかないOSもあるかも。
258 名前:デフォルトの名無しさん mailto:sage [2006/02/19(日) 13:39:39 ] >>256 つ[`ls -l`]
259 名前:デフォルトの名無しさん [2006/02/25(土) 01:29:18 ] 超初心者な質問で恐縮なのですが、、 *.jpgと*.JPGのファイルを判断して *-new.JPGのように名前を変更するには どのようにしたら良いでしょうか? お知恵をお貸しください。 よろしくお願いします。
260 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 01:53:34 ] ls *.jpg|sed -e 's/\(.*\).jpg/mv \1.jpg \1-new.JPG/' > /tmp/foo とでもして、 source /tmp/foo でどう?
261 名前:デフォルトの名無しさん mailto:sage [2006/02/25(土) 02:50:31 ] bash + find ならこんな感じ? find . -regex '.*\.\(jpg\|JPG\)' |while read i; do mv "$i" "${i%.*}-new.JPG"; done
262 名前:デフォルトの名無しさん [2006/03/14(火) 17:51:21 ] @@@
263 名前:デフォルトの名無しさん mailto:sage [2006/03/14(火) 18:29:29 ] 【積年の】旦那にしてる密かな仕返し【恨みじゃー】 human5.2ch.net/test/read.cgi/ms/1141694640/ 8 名前:可愛い奥様[] 投稿日:2006/03/07(火) 11:05:23 ID:8dtluKkp 夫の歯ブラシで洗面所の排水溝掃除。 洗面所をビショビショに汚した罰だ。 20 名前:可愛い奥様[age] 投稿日:2006/03/08(水) 00:40:17 ID:pRrk6A21 前に頭きた時あって 1度だけ歯ブラシで肛門カキカキしちゃった 22 名前:可愛い奥様[] 投稿日:2006/03/08(水) 01:27:12 ID:gU5mHc7J よかった。どこのお宅も同じようなことしてて。 24 名前:可愛い奥様[] 投稿日:2006/03/08(水) 01:36:35 ID:SSSFsTqE そうそう、ヘンなモノはダンナのお皿へ直行だよね。 41 名前:可愛い奥様[] 投稿日:2006/03/08(水) 11:55:18 ID:sjj+/60Q 見てるだけで気が晴れるな! 皆さん、頑張ってね! 42 名前:可愛い奥様[sage] 投稿日:2006/03/08(水) 20:33:51 ID:Ju2N1s7+ 年金分割が楽しみじゃのう 63 名前:可愛い奥様[] 投稿日:2006/03/10(金) 08:55:20 ID:qLfJYpJR 家族で密かにはぶっている。 男性は肉体が汚く、精神が美しい傾向がある。(気に入らない相手に肉体的攻撃を加える⇒精神的攻撃も加える男は猛者) 女は肉体が美しく、精神が汚い傾向がある。(気に入らない相手に精神的攻撃を加える⇒肉体的攻撃も加える女は猛者) 女は隠れて悪事をする。気に入らない女子を便所でボコったり、便器舐めさせたり、男の友人を使ってレイプ、仲間外れにしたり。陰口、嫉妬。 女は対人関係において、この汚い性格を隠そうとするため、外面が非常によくなる。(猫かぶり) 男性諸君は外面に騙されないように気を付けて下さい。
264 名前:デフォルトの名無しさん mailto:sage [2006/03/18(土) 01:37:12 ] ²
265 名前:http://www.vector.co.jp/soft/win95/util/se072729.html mailto:http://msdn2.microsoft.com/ja-jp/library/h2k70f3s.aspx [2006/03/18(土) 20:34:48 ] TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
266 名前:デフォルトの名無しさん [2006/05/30(火) 23:27:37 ] 質問です。Solaris9で、 rsh 192.168.1.1 su - user -c
267 名前:デフォルトの名無しさん [2006/05/30(火) 23:30:23 ] 質問です。Solaris9で、 rsh 192.168.1.1 su - user -c "ls -l" みたいな事やりたいんですけど、 "ls -l"のオプション部分が有効になりません。 なんとかならないでしょうか?
268 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 03:19:58 ] >>267 リモートで実行するコマンドをまとめて括れ rsh 192.168.1.1 'su - user -c "ls -l"'
269 名前:デフォルトの名無しさん [2006/05/31(水) 11:10:05 ] 初歩的ですみませんがファイルのreadで質問があります 以下のreadの仕方では最終行にリターンコードがないと 最終行を読んでくれません。※リターンコードがあればreadしてくれますが・・・。 読む方法はないでしょうか cat /aaa.txt | while read FILE do echo $FILE done aaa.txtの内容(この例だとghiを読み込まない) abc def ghi
270 名前:デフォルトの名無しさん mailto:sage [2006/05/31(水) 11:43:23 ] >>269 catじゃなくて、必ず改行するタイプのフィルターに通せばいい。 例えば、awk '{print;}'でもいける。
271 名前:デフォルトの名無しさん [2006/06/09(金) 13:30:25 ] 〜日前のファイルを削除するようなスクリプトを作成したいのですが どのような感じになりますか?
272 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 13:34:39 ] >>271 findではいけない理由があるのかね。 取り敢えず、1日(24時間)以上前のファイルを無条件に削除するならこんな感じ。 find . -mtime +1 -exec rm {} \;
273 名前:デフォルトの名無しさん mailto:sage [2006/06/09(金) 14:18:24 ] ctimeじゃないのか
274 名前:デフォルトの名無しさん [2006/06/09(金) 23:03:08 ] >>269 それ、最後の行まで普通にでたんだが、OSによるもんなのか 当方HP
275 名前:デフォルトの名無しさん mailto:sage [2006/06/10(土) 08:59:55 ] 何となく本末転倒な対処 perl -wne 'chomp;print $_."\n";' ./aaa.txt | while read FILE do echo $FILE done
276 名前:デフォルトの名無しさん mailto:sage [2006/06/12(月) 17:01:03 ] こんな感じかなあ。(以下は Linux でシェルは bash 3.00.16 使ってます)。 $ perl -e 'print "abc\ndef\nghi"' >a $ od -c a 0000000 a b c \n d e f \n g h i 0000013 $ cat a | while read s ; do echo "* $s" ; done * abc * def $ ( cat a ; echo '' ) | while read s ; do echo "* $s" ; done * abc * def * ghi $ awk 1 a | while read s ; do echo "* $s" ; done * abc * def * ghi $
277 名前:デフォルトの名無しさん [2006/06/13(火) 11:26:53 ] >>272 数日前のファイルは無条件に削除という認識ではあってるのですが ディレクトリの指定をする場合にはどのようになりますか?
278 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 12:03:13 ] >>277 man で調べりゃいいじゃないか。
279 名前:272:'.'はカレントディレクトリとその配下 mailto:sage [2006/06/13(火) 12:12:52 ] >>277 取り敢えずディレクトリ指定しているんだけどなぁ。
280 名前:デフォルトの名無しさん [2006/06/13(火) 13:19:34 ] >>279 例えば、フォルダを指定した場合(/tmp) find /tmp -mtime +1 -exec rm {} \; 上記で/tmpディレクトリ以下の1日以上経過したファイルの削除が行われる と思って、よろしいのでしょうか?
281 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 14:05:59 ] ttp://www.google.com/search?hl=ja&q=manpage+of+find&lr=lang_ja
282 名前:デフォルトの名無しさん [2006/06/13(火) 14:19:50 ] 「(::´┏┓`:)なんでそんなに英語を使ってやんのが好きなの?」
283 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 14:52:23 ] >>280 何が消されるのか不安なら -exec から後ろをなくしてみればいい。
284 名前:デフォルトの名無しさん mailto:sage [2006/06/13(火) 16:54:29 ] >>280 どうして、マニュアル見て自分で確認せずに聞いて済まそうとするかねえ。 嘘教えられて、重要なファイル消すはめに陥ったらどうするんだよ。
285 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 16:04:58 ] 初歩的なことを一つ教えてください。 bshで関数定義したものを別のシェルで呼び出すことは出来ますか? 出来るとすると呼び出し方はどのようになりますでしょうか。
286 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 17:02:26 ] できます。 関数が入ったファイルfoo.shをbar.shの中で使いたければ、bar.shの中で . ./foo.sh などとすれば普通に呼べます。
287 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 17:06:41 ] なんだ別のシェルって、そういう意味か。 シ ェ ル ス ク リ プ ト っ て 書 け よ。
288 名前:デフォルトの名無しさん mailto:sage [2006/06/14(水) 21:09:56 ] bshスクリプトを/bin/sh以外のシェル、たとえばcshから呼べますか?だったら 「呼べない」が答えですな。というか、そういう質問なのか?
289 名前:285 mailto:sage [2006/06/15(木) 00:14:48 ] bshで書かれたシェルスクリプト内の関数を、 別のbshで書かれたシェルスクリプトで使用することはできますか? ということで・・・(´・ω・`)
290 名前:デフォルトの名無しさん mailto:sage [2006/06/23(金) 14:19:28 ] while文で一つのリストファイルから呼び出しをかけて、ループさせることは 可能だと思うのですが同じwhile文中で違うリストファイルから呼び出しをかけて 変数として扱うことは可能でしょうか?
291 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 01:05:24 ] リストファイルって? 呼び出しって? かけるって?
292 名前:デフォルトの名無しさん mailto:sage [2006/06/24(土) 13:18:35 ] >>290 の要求がどうなのかは知らんけど、俺も心当たりある。 ... | while read var; do ...; done っていうパターンあるじゃんか。そうじゃなくて while [ ... ] do if [ ... ]; then read var1 ただしファイルディスクリプタ1(パイプやファイル)から; else read var2 ただしファイルディスクリプタ2(別なパイプやファイル)から; fi done のようなことをやりたいと思うことはあったわ。 俺はexecによるディスクリプタコピーととサブシェルプロセスを組み合わせて やろうとして挫折して、perlに日和った。
293 名前:デフォルトの名無しさん [2006/06/25(日) 02:48:36 ] sudo等でパスワードを求めるプロンプトに expect以外で自動入力する方法はありますか?
294 名前:271 mailto:sage [2006/07/03(月) 10:12:10 ] 教えていただいた通りにやってみたのですがディレクトリを削除しようとします。 find /tmp -mtime +1 -exec rm {} \; ディレクトリ内のファイルのみ削除させる方法はあるのでしょうか? よろしくお願いします。
295 名前:デフォルトの名無しさん mailto:sage [2006/07/03(月) 10:42:10 ] -type f
296 名前:271 [2006/07/05(水) 10:00:59 ] どうやっても上手く動作しません。 どうやってもエラーが出てしまいます。 エラーの出ない方法があれば、御教示願います。 よろしくお願いします。
297 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 11:18:04 ] >>296 >>295
298 名前:271 mailto:sage [2006/07/05(水) 11:31:26 ] 何度もすみません。 295さんの使い方が良くわかっていませんでした。 -type fとすることでファイルを見るというオプションだったのですね。 これで解決することができました。ありがとうございます。
299 名前:デフォルトの名無しさん [2006/07/06(木) 12:01:34 ] DSCN0001.jpg〜DSCN9999.jpgのファイルを全てtravel2006GW0001.jpg〜travel2006GW9999.jpgに変更したいのですが これを実現するLinuxのシェルスクリプトはどう記述したらいいですか? それと travel2006GW0001.jpg travel2006GW0002.jpg ・ ・ ・ のようにtxtに打ち出すのもお願いします
300 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 13:16:58 ] >>299 マルチ死ね。これだからLinux使いの糞は... (ry
301 名前:デフォルトの名無しさん [2006/07/06(木) 13:23:53 ] もう用済みじゃぼけぇwww
302 名前:デフォルトの名無しさん [2006/07/06(木) 14:08:25 ] >>300 用済みなのは君だけ
303 名前:デフォルトの名無しさん mailto:sage [2006/07/06(木) 23:21:48 ] >>299 #!/bin/sh echo # | tee foo$$ cd $1 ls DSCN*.jpg | sed -e 's/\(.*\)\([0-9][0-9]*\)\(.*\)/mv \1\2\3 travel2006GW\2\3/' | tee -a foo$$ source foo$$ rm foo$$
304 名前:デフォルトの名無しさん mailto:sage [2006/07/07(金) 08:21:44 ] >>299 $ for i in `seq -w 1 9999` ; do for> mv DSCN${i}.jpg travel2006GW${i}.jpg for> echo travel2006GW${i}.jpg for> done > list
305 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 14:49:15 ] >>299 #!/bin/sh for f in DSCN*.jpg do f2=`echo $f | sed 's/DSCN/travel2006GW/'` echo $f2 mv $f $f2 done
306 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 16:41:26 ] >>305 >f2=`echo $f | sed 's/DSCN/travel2006GW/'` f2=${f/DSCN/travel2006GW} でいいんじゃねんか
307 名前:デフォルトの名無しさん mailto:sage [2006/07/13(木) 18:24:56 ] >>306 ああ、そうだ。bash はそれで行ける。
308 名前:デフォルトの名無しさん [2006/07/14(金) 15:56:42 ] Bシェルを使用しています。 質問させてください。 ファイル(hoge.dat)の中のデータが下記のように3行あるとします。 1,2,3,4,5 6,7,8,9,10 11,12,13,14,15 この中から「8,9,10」だけを取りたいと思っています。 cut -d "," -f3- $hoge.dat では 3,4,5 8,9,10 13,14,15 を取って来るのですが、何かよい方法はないでしょうか? よろしくお願いします。
309 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 17:59:15 ] そのあと普通に grep かますんじゃ駄目なの? cut -d "," -f3- $hoge.dat | grep '8,9,10'
310 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 18:23:08 ] だよな 何を根拠に8,9,10なのか何も書かずにいたら echo 8,9,10 だってりっぱな回答だ
311 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 19:00:32 ] これでどうだ! awk -F, 'NR==2{for(i=3;i<=NF;i++)if(s!="")s=s","$i;else s=$i;print s}' hoge.txt でも、未確認。
312 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 20:50:24 ] これでも喰らえ! head -2 hoge.txt | tail -1 | sed 's/....//'
313 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 21:06:11 ] マジレス grep -v 1,2 hoge.txt | grep -v 11 | cut -b 5-10
314 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 21:37:57 ] head -c 21 hoge.txt | tail -c 7
315 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 22:33:44 ] クマー echo `sed -e 's/$/,/' hage.dat` | cut -d "," -f8,9,10
316 名前:デフォルトの名無しさん mailto:sage [2006/07/14(金) 23:29:04 ] こっちのほうがいいや。 sed -ne '1h;1!H;${x;s/\n/,/g;p}' hoge.dat | cut -d "," -f 8-10
317 名前:デフォルトの名無しさん mailto:sage [2006/07/18(火) 09:56:22 ] ええい。これでどうだ。 perl -ne 'if($.==2){chomp;print join(",",(split/,/)[2..4])."\n";}' hoge.dat ていうか >>308 はどこ行った?
318 名前:Linax初心者 [2006/07/24(月) 23:32:10 ] b-shallとc-shallで入力された日付が有効かどうかの確認のシェルスクリプトを作りたいのですがうるう年の計算や入力された日付が正しいかどうか判断して 正しい日付を入力させるスクリプトなんですが、初心者でわかりませんので よろしくお願いします。
319 名前:デフォルトの名無しさん mailto:sage [2006/07/24(月) 23:42:20 ] >>318 なんか死ね。
320 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 01:03:54 ] Linaxに関しては我々も初心者なもので・・・
321 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 01:25:39 ] えーと、スクリプトを作りたいと言うことは理解できました。 で、なにをお願いされたらよいのでしょう。
322 名前:Linax初心者 [2006/07/25(火) 06:33:39 ] すいません初心者で。まずは日付をキーボードから 入力して存在する日付かどうか判断して、うるう年の 計算して入力された日付が正しければ、正常表示を 間違いなら、再入力を促すものです。たとえば20061313はありえない 日付ですが20060220は正しい日付でその年がうるう年かどうか 判断して2006年 2月20日 水曜日と表示したいのですが 教えていただけますか。よろしくお願いします
323 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 08:45:49 ] えーと、なにを教えればよいのでしょう。
324 名前:Linax初心者 [2006/07/25(火) 09:42:19 ] すいませんが、会社の嫌がらせでまったくコンピュータ したことがパソコンぐらいの45才です。リストラされそうなのですが まったく知識がなくて本を読んでもよくわかりませんから できましたらはじめから教えていただけませんか。 お願いします。うるう年の計算がわかりませんしその日が何曜日かも わかりませんのでよろしくお願いします
325 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 09:55:25 ] >>324 それ以外にも足りん能力がわんさかあると見受けられるので、あきらめてホームレスって下さい。
326 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 10:16:18 ] とても45歳に見えない若々しいおじ様なのかしら♪
327 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 20:40:45 ] しかもマルチポスト どうやって釣られてあげればいいのかな?
328 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 22:15:54 ] まずはマスタファイルを作るんだ 20060725,火 20060726,水 20060727,木 20060728,金 : : あとはわかるな?
329 名前:デフォルトの名無しさん mailto:sage [2006/07/25(火) 22:33:45 ] そうそう、マスタファイルを作るスクリプトを作ればかなり効率が上がるよ
330 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 21:58:18 ] ディレクトリがさ abc/ def/ ghi/ ってな風に同じ階層に3つあって、それぞれの中に srcに対応したMakefileがあんだけどmakeすると abc/ def/ ghi/ ~lib.a とか自ディレクトリより一つ上に生成されてるのよ んでabc、def、ghiどれmakeしても同じ名前のライブラリ作ってんだけど これ作った人は何したかったのかわかんねぇ? これが今日発生したバグですた・・・。 ぼすけてw
331 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 22:56:47 ] >>330 お前にはうかがい知れないすごい思想なのは分かった。
332 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 09:15:04 ] sed -f henkan.txt input.txt のhenkan.txtの部分を ヒアドキュメントで書く方法ないでしょうか。無いか。 たんにテキストファイル増やすのが面倒なだけなんですが…
333 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 11:13:36 ] >>332 もしかして、sedスクリプトのコメントをスクリプトファイルに入れたいって話? それともその行が書かれたシェルスクリプト内にコメントを入れたいって話? シェルもsedもコメントは#で始まるから、どちらの場合も好きなところに書けばいいとおもうが。
334 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 00:07:14 ] >>333 はぁ?
335 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 04:00:04 ] >>332 複数処理なら、以下の何れかでいけると思う。 1) sed -e '処理1' -e '処理2' ... file 2) sed ' 処理1 処理2 .... ' file ※ 複数行をシングルか、ダブルの引用符で囲む 囲みの中が複数行でも、sedには1つの引数として渡される 3) sed '処理1^J処理2^J...' file ※ ^J は vi で入力するなら ctrl+ESC 後に ctrl+J OSの違いやsedのバージョンによっては駄目な方法もあるかも シェルによって駄目とかはないと思うが、c系は自信ない
336 名前:335 mailto:sage [2006/08/01(火) 04:16:53 ] >>332 追加でこんなんでもいいわけだが・・・ 4) sed '処理1' file | sed '処理2' | sed ... つうか、何がしたいの? 複数処理をしたいんじゃないならスレ汚し、すまんす
337 名前:335 mailto:sage [2006/08/01(火) 04:28:16 ] ついでだからもう一つ、スレ汚しすまん ヒアドキュメントに拘るなら、sedの代わりにedかex使え ed file <<EOF ... EOF
338 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 10:14:10 ] 332です。ありがとうございます。 これだけ方法があるのにsedのmanを見て何も思い付かなかった 頭の悪さに恥じ入るばかりでございます
339 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 06:38:49 ] >>335 処理の中身にもよるが、こういう書き方でもたいていは動くはず。 一行でかけるし、プロセスを一つにまとめられるのでわりとお勧め。 $ sed '処理1; 処理2; 処理3; ...' file
340 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 08:28:05 ] >>339 プロセスを一つにまとめられるので それじゃまるで>>335 はプロセスが一つじゃないと言ってるように聞こえる。
341 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 14:19:39 ] >>340 そういやプロセスが複数なのは >>336 だけだったな。 レス番を間違えた
342 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 22:11:20 ] >>339 みんなが4000行かかるプログラムをたった1行で書いてやるぜ!的な。
343 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 22:49:29 ] よーし、俺がたった1行でコンソール埋め尽くしちゃる echo *{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}
344 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 11:12:37 ] 毎月定期的に取得しているファイル名を、例えば、 filename_`date +%Y%m%d`.txt などとして日付けを付けて保存しています。 これが先月のものと差がない場合、新しい方を破棄したくて、 date コマンドで先月の同じ日を吐き出すことができないかと思っているのですが、 date は現在の日付けを表示することしかできないのでしょうか?具体的には、 diff filename_20060801.txt filename_20060701.txt で内容が完全に同じだったら、filename_20060801.txt を削除するようにしたいです。 環境は Linux、kernel-2.6.9-34 です。CentOS です。 どなたかアドバイスをお願いいたします。
345 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 11:53:21 ] >>344 date -d "last month" +%Y%m%d
346 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 12:32:05 ] うおお、それでいいんですか! どうもありがとうございます。
347 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 13:22:13 ] >>345 HPUXのdateはそんな便利な機能ないからうらやましいな。 前日とかならTZ変えればいいけど
348 名前:デフォルトの名無しさん [2006/10/12(木) 15:54:09 ] 申し訳ありません。 cshで@引数が、空であるかどうかと、A引数が、数字(何桁でも可)のみ受けとる という条件文を書きたいのですが、 @は、if ( $# -eq )や if(x$name =x)とやってもうまくいきません。 Aは、ダイレクトにif(0<=#1<=9) というやりかた?しかわかりません。 もうしわけないのですが、ご教授願えませんか? ヒントや参考文献でもかまいません。宜しくお願いします。
349 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 23:34:19 ] cshやめたらいいんじゃない
350 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 17:12:45 ] >>348 1. 引数が空 if ( $#argv == 0 ) then echo 空 else echo なんかある。 endif 2. 数値かどうか わかんねえ。こんな風にでもすれば? set n = `echo "$argv[1]" | sed 's/[0-9][0-9]*//g'` if ( '' == "$n" ) then echo "$argv[1] は数値だ。" else echo "$argv[1] は数値ではない。" endif
351 名前:デフォルトの名無しさん [2006/10/13(金) 18:56:57 ] >>350 ありがとうございます。大変助かります。 やはり、sedコマンド使うんですね。 sedとawkを使うべきかなと思いながら、 あまりよく分かっていなかったんです。 これから試してみます。
352 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 20:31:27 ] >>351 本当は何か別の方法あるかも知れないけど、俺は知らない。 あと、その sed の使い方だとマイナス記号や小数点や数字と数字の途中にスペースが あった場合とかが考慮されていないので、その辺は自分でなんとかして。
353 名前:デフォルトの名無しさん [2006/10/19(木) 10:01:09 ] cshの環境で、アプリケーションログを /backup/apl -mtime +6 -exec rm {} \; 上記のようい週次バックアップしています。 これを、直近のデータのみリストアする場合、 (最新のデータのみで、あとはいらない) どのような表現を使えばいいのでしょうか?
354 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 21:09:43 ] 日本語でおk
355 名前:デフォルトの名無しさん mailto: [2006/10/20(金) 22:47:35 ] rshについて質問させて頂きます。 ある書籍に以下の記述がありました。 $ STAT=`rsh hostname "sh -c 'ls; echo \\$?'"` \マークが1個多いと思うのですが・・・。 正誤表には記載がありませんでした。 分かる方がいましたら是非回答をお願い致します。
356 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 00:09:39 ] >>355 引数が二回展開されるから。 まず local のシェルが引数を展開して rsh に (hostname) と (sh -c 'ls; echo \$?') を渡す。 で、rsh が hostname のシェルで (sh -c 'ls; echo \$?') を実行する。 この時にもう一度展開される。
357 名前:デフォルトの名無しさん mailto: [2006/10/21(土) 11:56:53 ] >>356 早速のご回答ありがとうございます。 >で、rsh が hostname のシェルで (sh -c 'ls; echo \$?') を実行する。 >この時にもう一度展開される。 ダブルクォーテーションで囲まれた中の$は、 シェルによってメタキャラクタと認識されてしまうので \マークでクォートしなくてはいけないのですが、 シングルクォーテーションで囲まれた$は メタキャラクタとは認識されないので、 \マークでクォートする必要はない、 というのが私の認識です。 よって、hostnameのシェルで実行される (sh -c 'ls; echo \$?')の$はメタキャラクタとは 認識されないので、\マークは不要であると 思っています。 ご指摘の程よろしくお願い致します。 ちなみに今回の質問は、 書籍「入門UNIXシェルプログラミング 改訂第2版」 のP.132についてです。
358 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 19:23:38 ] >>357 csh 系や zsh の挙動は良く知らないが bash のクォート除去はそこまで賢くない。 ダブルクォートの中にシングルクォートがあっても その中身は保護されない。 例) $ echo "$SHELL" '$SHELL' "'$SHELL'" /bin/bash $SHELL '/bin/bash'
359 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 20:31:06 ] cshなんですが、 ヒアドキュメントの内容を変数に格納するのはどうやったらいいんでしょうか
360 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 04:00:06 ] 負の遺産を量産するな。shか最悪kshで書き直せ。 (t)cshが許されるのはログインシェルまで。
361 名前:359 mailto:sage [2006/10/25(水) 13:13:03 ] 古いsoralisのメンテしてる上に周りがcshしか理解できないんで仕方なく・・・ 本当はbash使いたいんですけどね
362 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 15:43:34 ] 別に仕方ないことないだろに。
363 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 18:22:40 ] >>356 エスケープの処理はバッククォートとダブルクォートのときじゃないか? rshが受け取る文字列は(sh -c 'ls; echo $?')だと思うんだけど。 (STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`) ローカルのシェルが、バッククォートとして実行する文字を解釈 -> (rsh hostname "sh -c 'ls; echo \$?'") バッククォートが、rshを呼び出す為に引数を展開 -> (hostname) (sh -c 'ls; echo $?') rshがhostnameに入って、ホストのシェルで第二引数を実行 -> (sh -c 'ls; echo $?') sh -c の処理 -> (ls; echo $?) >ダブルクォートの中にシングルクォートがあっても >その中身は保護されない。 ダブルクォートの中のシングルクォートは単なる文字なのでこれはこれで合ってるけど。
364 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 23:14:19 ] >>363 bash の man を参照するとわかるがクォートの除去は 各種展開が終わってから行われる。 冗長に処理の流れを書くとこうなる。 1. コマンド実行 -> (STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`) 2. ローカルのシェルがコマンド置換(バッククォートの処理)を行う -> (rsh hostname "sh -c 'ls; echo \\$?'") 3. サブシェルが起動してバッククォートの中身を展開する -> (rsh) (hostname) (sh -c 'ls; echo \$?') 4. サブシェルが rsh に引数 (hostname) (sh -c 'ls; echo \$?') を渡す 5. rsh が hostname のシェルに (sh -c 'ls; echo \$?') を渡す 6. hostname のシェルが引数を展開する -> (sh) (-c) (ls; echo \$?) 7. hostname のシェルが sh に (-c) (ls; echo \$?) を渡す 8. sh が引数を展開、実行する -> (ls; echo $?) 9. sh -> hostname のシェル -> rsh -> サブシェルの順に返り値が渡り、コマンド置換が終了 10. STAT に返り値が代入される
365 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 02:27:55 ] >>364 > bash の man を参照するとわかるがクォートの除去は > 各種展開が終わってから行われる。 EXPANTIONSのとこにあるこれ? The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion. ここにあるのは、どの順で実行されていくかの説明で、クォートの解釈は別の段階だぞ。 Expansion is performed on the command line after it has been split into words. ってあるとおり、(1)シェルが一行読み込まれる → (2)単語への分割 → (3)各要素を展開する のうち(2)の話だ。(3)にある単語分割とは別物 #1行じゃない場合はちょっとおいといてくれ > 2. ローカルのシェルがコマンド置換(バッククォートの処理)を行う -> (rsh hostname "sh -c 'ls; echo \\$?'") これの前に単語への分割があって、バッククォートを使っているとバックスラッシュの前にあるバックスラッシュはエスケープとして扱われるから、 (STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`) -> (STAT) (=) (`rsh hostname "sh -c 'ls; echo \$?'"`) この段階でバックスラッシュは一個になる。 (っていうか、そうじゃないと入れ子になったバッククォートの範囲を確定できないし) コマンド置換の展開が実行されると、サブシェルがまた単語への分割を実施して、 今回はダブルクォートのルールに従ってバックスラッシュは$に対するエスケープ文字になる。 (rsh hostname "sh -c 'ls; echo \$?'") -> (rsh) (hostname) ("sh -c 'ls; echo $?'") 「bash -v -x」してから「echo `echo "'\\$abc'"`」ってやってみ。 読み込んだ文字と、展開結果が出てくる。 サブシェルが読み込んだ文字列は echo "'\$abc'" になってて、すでに一回バックスラッシュが処理されてる。
366 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 03:36:14 ] >>365 ほー、そうだったのか。 やっぱりこういう事は自分で検証しないとダメだな。 的確な突っ込み感謝。
367 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 12:33:25 ] >366 そういや、肝心の355はどこいったんだ?
368 名前:デフォルトの名無しさん mailto: [2006/11/02(木) 23:45:43 ] 355です。 はっ!、と思って只今本スレを確認しました。 しばらくの間に様々な回答を頂き、本当にありがとうございます。 これからじっくり読ませて頂きます!
369 名前:デフォルトの名無しさん [2006/11/04(土) 20:27:36 ] 微妙にスレ違いかもですが あるファイルに対する処理をパイプで繋げて、 最終的に同名のファイルに書くのはアリなんでしょうか cat hoge.txt | grep "foo" | uniq | sort > hoge.txt 現状動いてはいるんですが・・・ ちなみにbashです
370 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:33:13 ] >>369 途中のコマンドがエラーを吐くと空になるが、いいのか? 期待通りに動いているのなら、アリではあるが どこの環境でも動くという保証は無い。 俺ならいったん変数に入れてから書き出すかな。 a=`grep "foo" hoge.txt | sort -u` if [ -n "$a" ] ; then echo "$a" > hoge.txt fi
371 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:35:18 ] あ、よく考えたら uniq | sort と sort -u は違うな。 適当に読み替えてくれ。
372 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:37:33 ] >>369 >最終的に同名のファイルに書くのはアリなんでしょうか ダメ。
373 名前:デフォルトの名無しさん [2006/11/04(土) 23:26:40 ] 特定の時間帯のログだけ抽出したい場合ってどうしたらいいんでしょうか?
374 名前:デフォルトの名無しさん [2006/11/04(土) 23:29:03 ] awk
375 名前:デフォルトの名無しさん [2006/11/05(日) 04:29:12 ] PM18::00からAM1:00までの場合はどうすれば?
376 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:31:11 ] ログファイルの仕様は?
377 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:34:07 ] やりかたはログによる
378 名前:デフォルトの名無しさん [2006/11/05(日) 04:46:30 ] 2006/11/04,01:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,02:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,03:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,04:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,16:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,21:37:33,xxxxxxxxxxxxxxxxxxxxxxx こんなかんじ
379 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:52:32 ] ぱっと思い付かないけど、俺ならperl使うかな。 ログをとる時間とタイミングが決まってるなら検討付けて timeコマンドで1:00にtail -10とかでがばっと適当にログを切り出して保存する。
380 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:56:47 ] >>378 のフォーマットなら1行野郎でできる awk -F '[,:]' '$2>=18||$2<1' logfile
381 名前:379 mailto:sage [2006/11/05(日) 05:24:52 ] >>380 お前マジ頭いいな
382 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 10:47:41 ] >>375 >PM18::00 それは一体何時なんだ? もし、18時のことを書きたいなら6PMと書かないと意味が通じないわけだが。
383 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 10:48:59 ] 通じなくてよし
384 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:16:24 ] なんか、awkの話になってるんで便乗で質問ですが シェルスクリプトから awk -f 手続きファイル 参照ファイル とやって、-vでawkスクリプトに引数を渡してawk内で使用するのって具体的にはどうやればいいんですかね?
385 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:28:58 ] ・・・・・<dateAndTime>20061101130655</dateAndTime>・・・・・・・・・・・・・・・・・ ・・<dateAndTime>20061101160213</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・<dateAndTime>20061101180159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・<dateAndTime>20061102200159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・<dateAndTime>20061103210159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・<dateAndTime>20061104220159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・<dateAndTime>20061104131259</dateAndTime>・・・・・・・・・・・・・・・・・ ・・<dateAndTime>20061104011359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・<dateAndTime>20061104052359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・<dateAndTime>20061105062059</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・<dateAndTime>20061106072159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・<dateAndTime>20061106114359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・<dateAndTime>20061107221359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・<dateAndTime>20061108230559</dateAndTime>・・・・・・・・・・・・・・・・・ ログがタグ形式で、こんな感じだったらawkではどうする?
386 名前:明日まで [2006/11/05(日) 14:36:03 ] こういうシェルを私みたいな女の子にも理解できるように解説してよ 引数付(1〜5)で実行したshellが何を引数として入力 したかを,switch文を使って表示させたい。。 【その1】引数無し、もしくは引数が1〜5以外の場合 % ./test.sh Invalid number. % 【その2】引数が1〜5の場合 (5を入力した場合) % ./test.sh 5 You have imput 5.
387 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:52:33 ] >>384 たぶん勉強すればどうにかなるんだろうけど、 awkで引数に関することでごにょごにょするのがめんどくなったのでPerlに移った。 awkは短い命令やパイプラインで使ったりはするけど、引数でごにょごにょするのは Perlでやることにした。 >>
388 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:55:02 ] >>386 case文でnull,$1〜$5までのケース書いて、その他は(*にでも書けば良いじゃん
389 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 15:30:16 ] >>384 別にawkに限った話じゃないので、普通に引き数で渡せば宜しい。 後は、awkかnawkかgawkか、変数定義かARGVを使うかの違いがあるだけ。 >>385 外部プロセスでsedを呼んで処理するか、awkを呼び出すシェルスクリプト側でsedを呼んで処理する。
390 名前:デフォルトの名無しさん [2006/11/05(日) 20:52:42 ] 誰かこのシェル作って 今日中にやらないといけないんです、お願いします。 引数付(1〜5)で実行したshellが何を引数として入力 したかを,switch文を使って表示させたい。。 【その1】引数無し、もしくは引数が1〜5以外の場合 % ./test.sh Invalid number. % 【その2】引数が1〜5の場合 (5を入力した場合) % ./test.sh 5 You have imput 5.
391 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 22:22:18 ] シェルスクリプトの中身↓ awk -f xxx.awk -v awkNoHensu=${shellNoHensu} aaa.txt xxx.awkの中身↓ { print ${awkNoHensu} } awkってよくわかんないけど引数ってこんなかんじでいけるのかな? 横レスですが、外部プロセスでsedを呼ぶってひょっとしてsystemコマンド(system関数)?
392 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 23:29:32 ] awkはCのpopen()相当をかなり変態的かつシンプルな形で表現できる。 Ex. -- #!awk -f BEGIN { if (ARGC > 1) { cmd = "wc -l " ARGV[1]; cmd | getline fileLineCnt; close(cmd); } } { if (fileLineCnt) { printf("%d/%d %s\n", NR, fileLineCnt, $0); } } -- sedで前処理するのも、これと同じ要領。
393 名前:392 mailto:sage [2006/11/05(日) 23:33:02 ] おっと、折角だから最後のブロックを訂正。 -- { if (fileLineCnt) { printf("%d/%d:", NR, fileLineCnt); } print; } -- これでコマンドライン引き数がないときはただのフィルターになる。 #>392のは引き数がないと何もしなかった。
394 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 02:23:46 ] >>391 awkスクリプトの中で参照するときに$つけなくてもよい。つかつけちゃダメ。 $つけたらフィールド参照になっちゃうから。 awk -v foo=ほげほげ ... で渡したのなら、単に foo で参照できる。
395 名前:デフォルトの名無しさん [2006/11/06(月) 17:18:33 ] grepでは1行が2048バイトの制限がありますが、 awkやsedの制限はどうなっているのかどなたか教えてください
396 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 20:23:22 ] 知らない。不安なら perl 使っとけ。メモリの続く限り無制限だから。
397 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 22:09:24 ] 2048バイト制限のあるgrepって、どのgrepのこと?
398 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 00:30:09 ] >>392 それはawk -v で引数を渡せばいいですか?
399 名前:392 mailto:sage [2006/11/07(火) 03:18:46 ] めんどくさい香具師だなぁ。 >393のスクリプトにfooとでも名づけて実行ビット立てたら foo foo とでもして味噌。
400 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 23:31:42 ] >>395 sedにも制限あったはず。それでperlにしたことがある。 てか試せ
401 名前:デフォルトの名無しさん [2006/11/07(火) 23:49:35 ] >>391 awkに-vでシェルの変数を引数で渡す場合、BEGIN内でしか参照できないからあんまり意味ないですよー 嘘言ってたらごめんなさい
402 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 00:30:45 ] >>401 ぇ…(´Д`υ) % awk -v foo=hello 'END { print foo }' ^Dhello %
403 名前:デフォルトの名無しさん [2006/11/08(水) 01:25:16 ] −−−−−−−−−−−−−−− BEGIN{} /○○/{ print$1 } END{} −−−−−−−−−−−−−−− ○○のところにシェルから持ってきた変数って使えますかね? 使えたら変数によって検索条件を変えられるんでawk最強って話になるんですが。
404 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 01:41:35 ] 例えば,↓のようにできる % cat emp.data Beth 4.00 0 Dan 3.75 0 Kathy 4.00 10 Mark 5.00 20 Mary 5.50 22 Susie 4.25 18 % awk -v name=Kathy '$1 ~ name { print $2 }' emp.data 4.00 %
405 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 01:50:47 ] >>395 GNU sed とか gawkなら多分制限はない(メモリの許す限り)。 SUSv3をみたところ、OSごとに一行の最大の長さを定義している LINE_MAX という定数があって、そこまでは使えることが保証 されているだけみたい。 で、FreeBSDとSolarisはこのLINE_MAXは2048バイトのようだ。
406 名前:403 [2006/11/08(水) 02:00:33 ] テキストをawkでカンマ区切りなどに成型した後ならそれはかなり使えそう技ですね。 しばし感心してしまいました。 でも、仮に以下のような感じのデータだったらやっぱできないんでしょうかね? 行にある、特定の文字列だけにヒットするような感じで。 たとえば/○○/のところに、BOOという引数を与えて、BOOを含む行だけ検索して特定の処理をするみたいな? TXT −−−−−−−−−−−−−−− AAAAADSLADLAS UEJNDNKA KDJSALJDLKSA HHHHHBOOA+aDSA DSKAJDKASL DSKLA+KDAS −−−−−−−−−−−−−−− AWK −−−−−−−−−−−−−−− BEGIN{} /○○/{ 何かしらの処理 } END{} −−−−−−−−−−−−−−−
407 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 02:07:10 ] >>406 awk -v pattern=BOO '$0 ~ pattern { print }'
408 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 13:59:33 ] >>403 そんなもんこうやって無理矢理やってしまえばできる。 awk '/'"$x"'/{ ... }'
409 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 21:08:39 ] つうかもうちょっとawkを勉強して、試した上で聞けよな・・
410 名前:デフォルトの名無しさん mailto:sage [2006/11/09(木) 22:19:29 ] >>409 でも、Awk神がいるからか、 最近のこのスレの話の流れはなかなか為になってるよ。 まあ、シェルはある程度分かるが、 長年Awkを馬鹿にして敬遠してきた俺から言わせてもらえばだけどね。 んで、このスレ読んでAwkでも勉強してみようと思い立ち オライリーの書籍を注文してしまったw 今思えば、俺が今まで仕事でやってきた案件なんぞ PerlやRuby使うまでもないことばっかりってことが判明してちと鬱だがね・・・orz...
411 名前:デフォルトの名無しさん mailto:sage [2006/11/09(木) 22:25:23 ] ファイル処理に便利だしね シェルスクリプト作ってた筈なのに 気がつくとawkとsedの処理が8割だった事がある
412 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 00:34:43 ] 下手な文字列処理なんかだと、Cで書くよりよっぽど早いしメンテナンスしやすいからな。
413 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 13:50:16 ] うちの高専で半年くらいawkばっかりやらせてた測量学の教官がいた
414 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 13:53:17 ] ↑ 授業で
415 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 15:36:22 ] ときどきでいいのでawkスレのことも思い出してあげてください。 pc8.2ch.net/test/read.cgi/tech/1023556171/
416 名前:デフォルトの名無しさん mailto:sage [2006/11/12(日) 16:23:26 ] >>410 「一寸、微笑ましい」という本心をコメントする。
417 名前:デフォルトの名無しさん [2006/11/13(月) 17:30:40 ] >>380 23:15〜03:15とか 04:30〜9:30とか 分の単位がある場合でも 一行で簡潔にかけたりする?
418 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 19:14:24 ] >>417 awk -F '[,:]' '$2$3>="2315"||$2$3<"0315"' logfile awk -F '[,:]' '$2$3>="0430"&&$2$3<"0930"' logfile
419 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 21:42:59 ] >>417 $2>=23&&$3>=15||$2<2||$2<3&&$3<15 こんな感じの書き方をすりゃいいんでないの?とアドバイスをしようと思ったら >>418 がなんかすごい技を繰り出してて…恥ずかしくなってきた罠。
420 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 21:59:53 ] >>412 AWKの文字列処理ってCより速いの?
421 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:18:38 ] >418 -F × -f ○
422 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:56:55 ] >>421 been opened if it were a file name. The option -v followed by var=value is an assignment to be done before prog is executed; any number of -v options may be present. The -F fs option defines the input field separator to be the regular expression fs. /usr/share/man/cat1/awk.1 line 26/250 (11%)
423 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 23:05:47 ] >>421 コマンドラインで FS の設定をしてるから間違っとらんよ。
424 名前:デフォルトの名無しさん [2006/11/13(月) 23:38:44 ] リストファイルから一行ずつパターンを読み込ませて テキストファイルを一行ずつパターン検索したいんですが awkでファイルから入力する方法ってありますか?
425 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 23:51:26 ] getline関数は現在の入力ファイルから次の入力レコードを $0 に代入する。 getline < file は file から次の入力レコードを $0 に代入する。 getline x は変数 x に代入する。 cmd | getline は cmd の出力を getline にパイプする。 getline は入力が成功すると1,ファイルの末尾で 0,エラーで -1 を返す。
426 名前:412 mailto:sage [2006/11/13(月) 23:56:23 ] >>420 「速い」じゃなくて「早い」だ。つまり、どっちが早くプログラミングできるかってこと。
427 名前:デフォルトの名無しさん [2006/11/13(月) 23:57:53 ] 変数を受け取って、一連の処理を行うようにしたコマンドの羅列だろ。 ひとつずつコマンドを打ち込んで処理するのが面倒くさいから 判定とか分岐とか呼び出しとかを使って、処理自体を複雑・多様化するようにしたんだろ。 更に、ひとくくりの処理を名前を付けて登録できるから、コマンドはそれひとつで 自分で組んだ複数の処理をしてくれる。 基本的に古臭いものだし、フロントエンドを設けてGUI化したのを 使うのが最適だと思うのに、何故に今更ながらのコマンドシェルなんだ? 馬鹿?
428 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 00:08:47 ] 〃∩ ∧_∧ ⊂⌒( ・ω・) `ヽ_っ⌒/⌒c はいはいわろすわろす ⌒ ⌒
429 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 07:07:15 ] >>424 同じファイルの次行レコードをgetlineで読めるはずだけど 処理中に別ファイルは読めないんじゃないかな fopenとかないし引数とらせるとかなら方法あるかもな
430 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 07:37:30 ] >>429 >425
431 名前:デフォルトの名無しさん [2006/11/14(火) 19:44:15 ] パターンファイルに一致するレコードを削除したいのですが、どうやったら実現できるでしょうか? シェルでもアークでも構いません。御指南下さい。 テキストファイル(テキスト.txt) 20061110,AAA 20061111,BBB 20061112,CCC 20061113,DDD ・ ・ ・ ・ ・ パターンファイル(パターン.ptn) AAA CCC GGG
432 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 19:45:09 ] >シェル 失せろ >アーク 消えろ
433 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 20:35:18 ] % cat foo.awk BEGIN { while (getline < ptn == 1) pattern[n++] = $0 } { for (i = 0; i < n; i++) if ($0 ~ pattern[i]) break if (i == n) print } % awk -f foo.awk -v ptn=pattern.ptn text.txt 20061111,BBB 20061113,DDD 20061114,EEE ……
434 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 20:51:08 ] grep -v -f パターン.ptn テキスト.txt
435 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 21:52:58 ] >431 アークじゃないよ。 オークって読むよ。 >433 awkって何でもできるんだな。
436 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 22:07:46 ] >>415 にも書いてるけどawkスレも使ってやってください。 awkについて語るスレ pc8.2ch.net/test/read.cgi/tech/1023556171/
437 名前:デフォルトの名無しさん [2006/11/14(火) 23:03:02 ] >>433 オークってよむんですか。 ありがとうございます。
438 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:37:29 ] bashなんですが、daemonの起動スクリプトとかで 変数にブレースがついてたり、ついてなかったりするのは どういう意図があるの?
439 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:58:40 ] >>438 1. 変数と文字列を明示的に区切りたいから ex) ${foo}bar 2. ブレース展開を使っている ex) ${foo%.*} 3. ただの気まぐれ
440 名前:デフォルトの名無しさん [2006/11/16(木) 00:52:32 ] getline 変数 で、次のレコードを読んで変数に代入になると思いますが、 更にgetline 変数を使うと更に次の行が読み込まれるのでしょうか? そのあとawk処理を終えて次のレコードをawkが読みに行ったとき、getlineの影響を受けて読んでいる行が進んでしまいますか? AWKスクリプト { getline A PRINT A getline A PRINT A } 読み込みファイル AAAAA BBBBB CCCCC DDDDD 出力結果はこう? AAAAA BBBBB CCCCC DDDDD 出力結果はこう? AAAAA BBBBB BBBBB CCCCC CCCCC DDDDD
441 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 00:57:16 ] やってみればいいじゃん。 つーか、シェルからの起動も絡まないawkの話はawkのスレでやれよ。
442 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:02:20 ] スレ名変えればいいだろ、 【シェルって】サーバ用途のスクリプト【貝殻?】
443 名前:デフォルトの名無しさん [2006/11/16(木) 01:07:00 ] sedなんかを使って特定のタグで囲まれたところを出力することって可能ですか? sdak;dkslakdas;das<TAG>dkalkdlas;kdsla;kds;akdsal;dkslad;</TAG>dlaskldkalsfocmdcsdlc,ds
444 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:12:20 ] 行内に開始タグ終了タグが1セットだけあるなら、 sed -ne 's/<TAG>\(.*\)<\/TAG>/\1/p'
445 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:14:40 ] >>441 たとえば>433のawkスクリプトでやってることをシェルスクリプトで実現したらどうなるかとかってのを >441自身が率先してレスしてやるとかすればこのスレももっと進歩するんじゃないの? 絡まない話と切って捨てるのではなく絡める努力なんてこともしてみたらいかがか?
446 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:20:07 ] AwkにはSYSTEM関数もあるし UNIXのコマンドも使えちゃうので 必ずしも無関係とは言えないか
447 名前:デフォルトの名無しさん [2006/11/17(金) 00:46:21 ] 寂しいスレになったね。
448 名前:デフォルトの名無しさん [2006/11/28(火) 00:16:29 ] あるファイルの一部(何行もある)を違うファイルに書き換えるのはどうやるの? 例えば、 aaa aaa aaa aaa aaa aaa abc 1 2 abc 3 4 bbb bbb bbb というファイルを abc 1 10 abc 3 20 と言うファイルを使って aaa aaa aaa aaa aaa aaa abc 1 2 10 abc 3 4 20 bbb bbb bbb にしたいんだけど。。 どえらく行があって普通にsedの置換する行を書かせて実行したら 一日で終わらないくらい時間がかかってしまって。。。 もしくは、行単位で置換じゃなくて、数行単位で置換は出来ないのでしょうか? 偉い人教えてください。
449 名前:デフォルトの名無しさん [2006/11/28(火) 02:05:01 ] >>448 正直説明が分かりづらいです。 というか全くわかんない。 ちゃんと質問した方が良い。 その質問じゃ法則がいまいちわからない。 ファイルの一部を違うファイルに書き換える?? catとか使って結合したらいかが?
450 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 02:11:28 ] マルチ乙
451 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 11:34:00 ] >>448 それはスペース区切りで先頭の項目をキーにして残りのデータは重複なしで マージするという処理をしたいということか? あれ? でも、 aaa とかは 元から重複してるな。 駄目だ。やっぱ法則が分からん。
452 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 14:02:55 ] >>448 二つのファイルを第1フィールドと第2フィールドを“,”とかでくっつけて (それぞれ test1.txt, test2.txt とする)、join(1) する: join -a1 test1.txt test2.txt 最後に“,”を削る。 それか、awk の連想配列を使って join する。
453 名前:デフォルトの名無しさん [2006/11/28(火) 23:56:25 ] 回答ありがとうございました。 分かりずらかったかと思いますので再度書き込ませてください。 一連の序列が混ざったファイルがあります。 例えば、 aaa bbb ccc ddd . ccc ddd eee fff . こんな感じの序列が続いた後に linux 123 987 786 0 linux 123 903 673 linux 123 876 986 0 . linux 234 983 934 0 linux 234 073 345 0 . linux 345 093 945 0 linux 345 495 384 . xyz abc def ghi xyz ade dfe sdg . となっていて変えたいところはlinux〜です。
454 名前:デフォルトの名無しさん [2006/11/28(火) 23:57:11 ] ここの行を linux 123 987 786 22 linux 123 903 673 22 . linux 234 983 934 85 linux 234 073 345 85 . linux 345 093 945 45 linux 345 495 384 45 としたいのです。 最後の0はあったりなかったします。 最後の行に各々の22,85,45を追加(または0を置換)したいのです。 2列目は123,234,345のようにまとまりがあります。 あとはランダムです。 存在するファイルは 123 22 234 85 345 45 . というファイルです。
455 名前:デフォルトの名無しさん [2006/11/28(火) 23:59:27 ] 自分は一行ずつ置換するためsedを作成するためのプログラムを作成しました。 ですが、数が一万行を超えるので、一日ではとても終わらないものになりました。 ファイルを分割してlinuxを含まない上下のファイルをとっておいて、 置換ではなくてlinux〜のファイルを作ってしまいcatで付けようとか考えていますが、 cutとかで分割する際にそんな指定って出来るんでしたっけ? 質問ばかりですいません。 宜しくお願いします。
456 名前:デフォルトの名無しさん [2006/11/29(水) 00:10:55 ] 追加ですが、 linux 123 987 786 22 linux 123 903 673 22 . linux 234 983 934 85 linux 234 073 345 85 . linux 345 093 945 45 linux 345 495 384 45 というファイルは作成出来るのですが、 これを元のファイルに反映させたいです。 手動でやるしかないですかね。。。
457 名前:デフォルトの名無しさん [2006/11/29(水) 00:21:19 ] 元ファイルをtest1.dat 参照ファイルをtest2.datとして join -a1 -o 1.1 1.2 1.3 1.4 2.2 test1.dat test2.dat とすればいいですかね。。。 joinは使ったことが無いので分かりませんが。。。
458 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:07:28 ] 例示ばかりで、肝心の変換のための法則について 何も書かれちゃいねぇ! 「変えたいところは」「ここの行を…としたい」 「あったりなかったりします」 場所と結果だけ示されてもねぇ。。
459 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:12:43 ] ここはこうだから、これをこれと入れ換えます。 という説明はできないもんだろうか。 関係ないけど先日会社に面接に来た香具師。 「自己アピールは大切ですから」と言いつつ何ら具体的なことは何も言わないで帰った。 要は、客観視できていないし説明することもできないらしい。 #そのくせ、ランバ・ラルの台詞を語ってはいたのだが。
460 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:17:11 ] 何か耳が痛いな。
461 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:23:42 ] 言語機能の差が、スクリプト処理の決定的差ではないという事をおしえてやる
462 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 11:23:46 ] 1万行の処理なんて一瞬で終わると思うんだが…… 仮に行数Lに対して実行時間が O(L^2) だとしてもちょっと待てば終わるくらいだと思
463 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 12:06:13 ] すごい遅いマシン使ってるのかな?
464 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 17:32:54 ] シェルスクリプトじゃないけど。awkでやってみた。 BEGIN{ while(getline<ARGV[2]){ cv[$1]=$2; } ARGV[2]=""; } $1=="linux"{ $5=cv[$2]; } { print; }
465 名前:デフォルトの名無しさん [2006/12/05(火) 21:39:41 ] csh で if($hoge == hoge) とかやったばあい、 $hoge が -f などの場合 ファイルに関する演算子の -f とみなされて 比較してくれません。 こういう場合、どうすればいいのでしょうか?
466 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 22:17:11 ] あ、適当な文字を両辺の先頭に付ければいけますね。 何か格好悪いので、もっといい解決法があればよろしくお願いします。
467 名前:デフォルトの名無しさん [2006/12/06(水) 22:42:36 ] ファイル名の拡張子より前の名前を抽出するシェルを作っています。 例えばtest.shであれば ls test.sh | awk -F '[.]' '{print $1}' でtestと出力が得られるのですが、もしファイル名がtest_1.00.shの時は test_1 のような出力になってしまいます。 awkの$NFで拡張子のshは得られるのですが、 $NF「以外全て」を出力を得るにはどのようにすればよいでしょうか?
468 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 22:48:02 ] >>467 man basenameでだめなんか。 それから、シェルスクリプトのことをシェル呼ぶなってば。
469 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 22:49:51 ] シェルスク? シェクリ? ルスクリ?
470 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:02:51 ] >>468 できますた。 ありがとうございました。
471 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:13:44 ] >>467 awkでやるなら jgawk -F. "{print jsubstr($0,0,jlength($0)-jlength($NF)-1)}" でどう?
472 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:28:06 ] >>471 試してみたのですが残念ながら、現在の環境ではjgawkというのが入ってないみたいです… basenameはcaseで知ってる拡張子を洗いざらい場合分けするスクリプトかいて処理しました。 (txt f90 c c++ java shなど) jgawkのインストールについて調べてみます
473 名前:デフォルトの名無しさん [2006/12/06(水) 23:29:05 ] c++じゃなくてcppだった…
474 名前:デフォルトの名無しさん [2006/12/06(水) 23:34:47 ] ちなみにローカルな目的は、 a2psを使ってpsファイルを作る事でした。 a2ps test1.00.sh -o test1.00.ps 拡張子を取り除いてpsの拡張子を付けるためのスクリプトを作る方法を考えていました。 basename&case文で対応はできたのですが、jgawkというのが使えるのであれば より汎用性のあるスクリプトができそうですね。
475 名前:デフォルトの名無しさん [2006/12/06(水) 23:40:59 ] ちなみに、gawkはありましたが $ gawk -F. "{print jsubstr($0,0,jlength($0)-jlength($NF)-1)}" test1.00.sh gawk: cmd. line:1: (FILENAME=test1.00.sh FNR=1) fatal: function `jsubstr' not defined でした。
476 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:01:50 ] >>475 jgawkのjはJapanese(日本語)のj、 jlengthやjsubstrのjも同じ。 データーに日本語が入ってないならjは除けていいよ。
477 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:27:39 ] >>467 Solaris のawkみたいに腐ったやつだとわからないけど、gawkなら NF--; print $0 で取れないか?
478 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:33:01 ] >>477 jgawkでやったら aaa.bbb.ccc.dddが aaa bbb cccになった。
479 名前:デフォルトの名無しさん [2006/12/08(金) 01:05:00 ] NFってなに? Systemコマンドの使い方教えて
480 名前:477 mailto:sage [2006/12/08(金) 01:21:03 ] >>478 スマソ。OFSを設定してクレイ。 gawk -F'[.]' -v OFS='.' '{NF--; print} あたりでよろしこ。
481 名前:デフォルトの名無しさん [2006/12/13(水) 21:04:58 ] shellってすごいね
482 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:27:33 ] #!/bin/sh dump -0f /path/to/hda1.dump /dev/hda1 dump -0f /path/to/hda2.dump /dev/hda2 このスクリプトを実行して、hda1の実行途中でCtrl+Cを押したら hda1は終了するけど次行のhda2のバックアップが開始されます。 スクリプト自体を終了するにはどうしますか?
483 名前:デフォルトの名無しさん [2006/12/24(日) 10:47:11 ] >>482 dump は使ったことないので、勘ですが dump -0f /path/to/hda1.dump /dev/hda1 if [ $? -ne 0 ] then dump -0f /path/to/hda2.dump /dev/hda2 fi じゃ、だめですか?
484 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 12:55:55 ] #!/bin/sh -e dump -0f /path/to/hda1.dump /dev/hda1 dump -0f /path/to/hda2.dump /dev/hda2
485 名前:デフォルトの名無しさん [2006/12/26(火) 23:54:08 ] sedで-dオプションを使って、特定の文字列がヒットした時に、 その行を削除したいのですがうまくいきません。 manpageみても使い方がよくわからず、困り果てております。 どうやって使えばいいかご教授お願いします。
486 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 23:58:45 ] >>485 -dオプション??? 単純に行削除だけなら例えば以下のように。 -- sed -e '1,5d' #最初の5行を削除 sed -e '/pattern/d' #patternを含む業を削除
487 名前:デフォルトの名無しさん [2006/12/27(水) 06:42:35 ] >>486 使い方思いっきり間違ってました ありがとうございます 助かりました
488 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 17:11:03 ] てか、パターンを含む行を削除したいだけなら grep -v でやれば良い。
489 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 01:09:04 ] きっとgrepでは業(カルマ)を削除できないのだろう。
490 名前:デフォルトの名無しさん [2006/12/29(金) 16:00:50 ] sedでレコードのor検索やand検索ってできますか?
491 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 16:12:11 ] RDBでいうレコードの概念は、区切り文字とのパターンマッチでおおよそシミュレート可能。 その上で、パターン/X/と/Y/のandは/X/{/Y/}で、orは /X/... /Y/... でシミュレート可能。
492 名前:デフォルトの名無しさん [2006/12/30(土) 12:08:44 ] 例えばレコードの100バイト目から105バイト目を置換したいんだけど、 全角・半角が不規則に混ざっているので、 s/(.{100,100})......)/\1abcdef/ とか正規表現でやってもうまくいかないんだよね。 良い方法あるかな? ちなみにUNIX、sedでやるつもり。
493 名前:デフォルトの名無しさん mailto:sage [2006/12/30(土) 15:00:03 ] >>492 多バイト文字を途中でぶった切ってもいいの? $ LC_ALL=C sed -e 's/^\(.\{99\}\)\.\{6\}/\1abcdef/' とか。LC_ALLは状況しだいでLANGとかLC_COLLATEあたりでもOK。 あとこの正規表現はGNU sed でないと多分食ってくれない。
494 名前:492 mailto:sage [2006/12/30(土) 23:40:41 ] うちはcshなので env LC_ALL=C sed 〜 って感じですね! ありがd! 後いい忘れたけど固定長ファイルで置換部分は必ず1バイト文字なのでぶった切られることはないです。
495 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 14:18:06 ] RDB=ラーメンデータベース
496 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 00:18:43 ] よく勘違いされてるんだけど、 ラーメン(Rahmen)というのはドイツ語で、 英語のframeに相当する単語なんだ。 だから「枠」とか「骨格」とか「軸組み」とかいうような ニュアンスなんだよ、本来であれば。
497 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 09:39:49 ] ラーメン違い。本来も糞もない。
498 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 12:33:20 ] 遅レス気味すまそ。 >>483 そういうの書くなら dump -0f path/to/hda1.dump /dev/hda1 || exit 1 と || exit の方が、見やすくって良くないか。
499 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:26:49 ] 質問があります。 Vine4.0を使用していまして #!/bin/sh declare -i MAX MAX=10 while[ $MAX -lt $1 ] do echo $MAX MAX=$MAX+1 done というスクリプトを書いたのですがいざ実行してみると下記のようなエラー?がでてしまします。 command not foundということは何かがたりないのでしょうか? アドバイスお願いします。 . a05.sh 12 bash: while[ 10 -lt 12 ]: command not found bash: a05.sh: line 5: syntax error near unexpected token `do' bash: a05.sh: line 5: `do'
500 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 02:35:36 ] whileの後ろに空白がないんじゃないか?>499
501 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 03:45:07 ] >>499 空白入りの引数を渡すとエラーを吐くから $1 の所をクォートしておくと吉
502 名前:499 mailto:sage [2007/01/06(土) 02:58:14 ] >>500 ,501 whileの後ろに空白をいれたら無事に動作しました。 クォートとは''の事ですよね?参考になりました。 ありがとうございました。 新しい質問なんですけど #!/bin/bash while [ -f .count.lock ]; do sleep 0.1 done touch .count.lock declare -i INTEG INTEG='cat access_count.txt' INTEG=$INTEG+1 echo $INTEG >| access_count.txt echo "$INTEG" rm -f .count.lock を動作させると bash: cat access_count.txt: syntax error in expression (error token is "access_count.txt") 15 ←access_count.txtの内容を書き換えてもどんどんインデントされていきます。 の様に吐き出されてしまいます。 INTEG='cat access_count.txt'の部分が悪い様なのですがINTEGにcatを使って ファイルの内容を代入することはできないのでしょうか? access_count.txtの中身は 0 とだけ入っています。 よろしくお願いします。
503 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 03:33:25 ] コーテーションの向きを確認すべきかと
504 名前:492 mailto:sage [2007/01/06(土) 11:02:47 ] すいません、また来ました… \{99\}使えんかったorz .を99個書くしかないんかね〜
505 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 21:31:43 ] >>504 sedを使わない方法 (dd bs=1 count=99;dd bs=6 count=1 of=/dev/null; echo -n abcdef; cat)
506 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 02:48:47 ] >>504 使ってる sed がGNU sedでないとかない? echo abcdefghijklmn | sed -e 's/^\(.\{5\}\).../\1XXX/' で abcdeXXXijklmn になるよ(Fedora Core5) あと、493は後ろのドットに余計な\がついてるからそれはとっておくんなまし。
507 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 15:39:41 ] >>504 awk '{print substr(1, 99, $0) "12345" substr($0, 105)}' hoge.txt
508 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 23:38:53 ] >>504 printf "%099d\n" |tr 0 \.
509 名前:504 mailto:sage [2007/01/16(火) 00:52:23 ] やっぱawkじゃね〜 サンクスコ
510 名前:デフォルトの名無しさん mailto:sagw [2007/01/16(火) 17:35:01 ] ちょいとawkスクリプトでお尋ねしたいんだが、 2つ以上のファイルから文字列の切り出しってできますかね? 色々試してみたのだけれど全然できなかったんで hoge1.dat の$1,$3 と hoge2.dat の$5,$2 を 1行でhogehoge.datに出力という形 GMTっていうマイナーなツールで絵を描いてるんだけど、GMT内の計算スクリプトで出たデータのお尻に 別のデータを加えてそのまま描けないかなぁって試行錯誤してるんですが。
511 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 17:44:04 ] できます。しかし、残念ながらスレ違いにつきawkスクリプトは割愛。
512 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:08:10 ] >>511 スクリプトが複数行に渡らずにできるならなんとかサンプル探してやってみる
513 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:33:03 ] >>512 なぜにワンライナーにこだわるん?
514 名前:512 mailto:sage [2007/01/16(火) 19:44:23 ] スレ違いだけど一応 >>513 簡単に言えば頭の悪い素人だから。 マニュアルになりそうなもんは見たりするんだけど、大体そういうのって一行で処理終わらせるのが多くて。 専門用語がてんでダメだし、 何故処理できるのか?を理解してなくて、「こうやればこういうのができる」でしか認識してなく 自分自身、誰かが書いたソースの簡単な処理や変数を弄るだけしかできないって分かってる。 複数行に渡ると検索でHITしにくいし、「できる」て事さえ分かれば後は調べたらなんとかなるかな、と スレ読んでたら組み合わせ次第でなんとかできそうだわ
515 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 19:55:53 ] カラム数が固定ならpasteとawkをパイプで繋ぐのが楽かな。
516 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 00:33:49 ] 一応、書いてみたんだがな…、1行ぢゃないから駄目か #!/usr/bin/gawk -f BEGIN{ while( (getline line1 < "hoge1.dat" ) > 0 && \ (getline line2 < "hoge2.dat" ) > 0 ){ split(line1,col1) split(line2,col2) print col1[1],col1[3],col2[5],col2[2] } }
517 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 01:45:36 ] >>510 bash 限定かも $ paste <( awk '{print $1,$3}' hoge1.dat ) <( awk '{print $5,$2}' hoge2.dat )
518 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 10:59:01 ] 対話式のスクリプトを作っており、read で入力されたIPアドレスを 正規表現でIPアドレス規則が正しいかを判断さえたいのですが、 どうしたらいいですかね。
519 名前:デフォルトの名無しさん [2007/01/24(水) 11:51:57 ] 関数やサブシェルについての質問です。 まずサブルーチンの方ですが、以下のようにしました。 「Name_sub.sh」 #!/bin/sh echo "What is your name and age ?" read your_name your_age CHECK_NAME () { echo $1 $2 } CHECK_NAME $your_name $your_age これ単体で実行すると、正常に$your_name $your_ageが戻ってくることを確認しました。 これを他のmainスクリプトから呼び出して使おうとしました。 「Name_main.sh」 #!/bin/sh var=(`./Name_sub.sh`) echo '${var[@]} = ' ${var[@]} ここで、Name_sub.shの戻り値を配列varに入れようとすると、 Name_sub.shの対話部分が表示されませんでした。 対話部分をプロンプトに表示して、関数のCHECK_NAMEの戻り値のみ 配列varに代入するにはどうすればよいのでしょうか?
520 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 12:29:27 ] とりあえずtmp.txtファイルに値を保存して、その値をmainで読み込むことにしました。
521 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 13:17:20 ] source を使うケースじゃないのかな。
522 名前:デフォルトの名無しさん [2007/01/25(木) 15:51:10 ] >>518 sh や bash の場合 (ksh もこうだったかも知れない) IFS=. とすると set で指定した変数は '.' で区切られて $n に入るようになる。 たとえば ipaddr に 172.24.1.2 と入っているときに IFS=. set $ipaddr とやると $1 に 172, $2 に 24, $3 に 1, $4 に 2 が入り、更に $# が 4になる(4つに分割されたということ)。 なのでまずはこの直後に if [ $# -ne 4 ]; then echo Error ; exit 1 ; fi のようなことをして4つでなければエラー扱いにしてしまえば良いと思う。 更に $1 から $4 に入っているので for でループさせることもできる。 なのでここで数値が 0 〜 255 になっていなければエラーにすれば良い。 # n に 172, 24, 1, 2 の順で代入されてループする。 for n do if [ 0 -gt "$n" -o 255 -lt "$n" ]; then echo Error ; exit 1 ; fi done テストで数を先に書いている理由は n には何が入ってくるか分からないから。 ('-' で始まるオプションのようなものを入れられてしまうとテストコマンドの 動作が変わってしまうかも知れないため)
523 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 16:05:50 ] どうしても正規表現を使わないと我慢ならんという場合はこんな感じかな。 なんか無理があるが。 if perl -e '$_='\'"$ipaddr"\'';if(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/){if($1>=0&&$1<=255&&$2>=0&&$2<=255&&$3>=0&&$3<=255&&$4>=0&&$4<=255){exit 0}}exit 1;' then echo ok else echo ng fi
524 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 17:38:15 ] 正規表現の時は >=0 の判定はいらんと思う。 どちらにしろ面倒だけど。
525 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 22:03:14 ] あ、そうだね。いらないね。
526 名前:デフォルトの名無しさん [2007/02/07(水) 22:53:33 ] [質問] シェルスクリプト初心者です. power 12.34 dBm power 13.45 dBm power 14.56 dBm ある,power(電力) の変化を確認するのに while true; do sleep 1 echo `command`; done で 表示しているのですが 改行して新たな出力を出さないで, 前の出力を消し power 値 dBm の値のところだけが変わる ようにしたいのですが,いい方法ありませんか? clear は使わずにお願いします. 分かりにくい説明ですみませんがどうかよろしくお願いします.
527 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:09:16 ] >>526 キャリッジリターンを使うと吉。 command が複数行出力しているとこれでは上手くいかないけど。 while true; do sleep 1; echo -en "`command`\r" ; done 詳細は man printf かな?
528 名前:デフォルトの名無しさん [2007/02/11(日) 11:20:30 ] シェルスクリプトって例外処理できます? 例えば一つ上の行でエラーが発生したときはそのシェルスクリプトの処理を終了するとか。
529 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 12:14:42 ] >>528 プロセスの終了ステータスを見て条件分岐することはできる。
530 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 13:13:06 ] >>528 普通は>>529 の終了ステータスを使う。エラー時に終了するだけならこれで十分。 シグナルが飛ぶならtrapでシグナルハンドラを書くのもあり。 try/catch/throwに直接対応するものは、Bourne shell、csh、bashにはない。
531 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 20:02:45 ] set -eしとけば、(検査されていない)終了ステータスが0以外の場合は スクリプトが終了する。終了処理はtrap "..." 0
532 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 08:56:55 ] どもですm(_ _)m
533 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:47:34 ] リダイレクトのことで質問なんですが echo hoge > test ls -l < test とやるとlsは標準入力(つまりtest)の内容を読み込むのなら 普通にls -lとした場合はキーボードからの入力を読み込もうとすると思うんですが、 そうはならないのは何故なんでしょうか?
534 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:19:42 ] >>533 入力がリダイレクトされても、lsは何も読むわけではない。 つまり、ls -l < test と書いても ls -l と書いても同じ事。
535 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:42:01 ] たしかにls -l < testとやっても変わらないみたいです。 今、入門UNIXシェルプログラミングという本で勉強しているのですが、 その本の89ページには echo abc nnn > xyz ls -l < xyz とするとls -l abc nnnとしたときと同じ結果になる。書いてあったのですが、 この本が書かれた時と今ではlsの動作が異なるということなんでしょうか?
536 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:55:46 ] いつの時代か知らんが、lsが標準入力から引数を貰うような作りになってる という話は聞いたことがないな。 ls -l `cat xyz`とか xargs ls -l < xyz ならありえる。 xargsは、はしょって言うと、標準入力から受け取ったものを、自分に与えられ た引数につなげたて、その全体を実行するコマンド。、
537 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:01:14 ] うーんサンプルコードを見ても特にxargsを使っているわけではないようです。 本のタイトル名で検索したらサポートページがあったので、後で この件に関してメールを送ってみようかと思います。ありがとうございました。
538 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:12:21 ] >>537 物はこれか? ttp://shop.sbcr.jp/isbn/shell/index.htm ここには載っていないようだな。 ttp://shop.sbcr.jp/isbn/shell/errata.htm
539 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:17:38 ] この本か。 会社に置きっぱなしだから明日確認してみる。
540 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:22:57 ] 著者名のつづりのミスもみつけられんとこ信用するな
541 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 01:49:29 ] >>535 ls -l `< xyz` なら期待通りの結果になるよ。 bash 依存の記法だったと記憶しているけど。
542 名前:539 mailto:sage [2007/04/05(木) 10:21:44 ] 入門UNIXシェルプログラミング(ソフトバンク株式会社、Bruce Blinn、初版) の87ページに確かに載っているな ---------- $ cat xyz # xyzファイルの中身を確認 abc nnn $ ls -l < xyz # xyzファイルを「標準入力」としてリダイレクトする ---------- ls (GNU coreutils) 5.97では動きませんでしたがええ。
543 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:53:34 ] リダイレクトのことで質問なんですが 中身がスペース一つのファイルsampleを cat test | sed -e 's/ / /' > test2 とするとtest2にスペース10個が出力されるので cat test | sed -e 's/ / /' > test とするとtestの中にはスペースが10個入っていると思うんですが、 中身を見てみると空になってしまいます。 一つのコマンドの中で同じファイルに対して入出力のリダイレクトを行うと 空になってしまうのはわかるんですが、今回の場合はどうしてうまくいかないのでしょうか?
544 名前:543 mailto:sage [2007/04/05(木) 12:55:16 ] すいません、上の例でのtestはsampleの間違いですorz
545 名前:543 mailto:sage [2007/04/05(木) 12:57:52 ] 何度もすいませんorz どうやら連続した半角スペースは一つにまとめられてしまうみたいで、 上の例のs/ / /はs/スペース1個/スペース10個/ってことです。
546 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:50:57 ] >>545 一部のOSのようにパイプラインを非同期にしか実装してない環境ならいざ知らず、 まともなOSではパイプラインの前後のプロセスは同時に実行されるので、 パイプラインに接続する一つのファイルを読み書きしようとすれば当然そうなる。
547 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 14:50:40 ] つまり上の例だと ・最初に書き込み用にファイルを開く、当然ファイルの中身は空になる。 ・catは空のファイルの中身を出力する ・空がsedに渡されるので当然空をファイルに書き込む という順番で処理が行われるんでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:14:56 ] ちょっと違うな。 cat test | sed -e 's/ / /' > test の場合、 シェルがtestを"w"で開いてからcatとsedを起動する筈だから、 catが起動された時点でtestは既に空の筈だ。 空の入力に対してcatは何も出力しないし、sedも同じように何も出力しない。 従って、空になるのはcatやsedが起動される前と言うことだ。 ちなみに、どうしても同じファイルに読み書きしたいなら sed -e 's/ / /' < test | tee test のようにしてしまえばいい。 これなら、シェルがtestを開いてからteeがtestを開こうとするので (unixの開きっ放しのファイルは削除できたように見えてもそれは見掛けだけ仕様に基づき) 無事に処理される筈だ。
549 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:27:54 ] まず最優先でリダイレクトのための処理が行われて、それから コマンドの処理が行われるんですね。わかりました。ありがとうございます。
550 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:02:21 ] なんか今一判っていない悪寒。
551 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 02:40:06 ] >>549 GNU sed 使ってるなら -i オプションつけとけ
552 名前:デフォルトの名無しさん [2007/04/07(土) 19:35:57 ] シェルを初めて組みます。 Cシェルで、自分のグローバルIPを取得して、そのIPをメールで送信するようなプログラムを 組みたいと思っております。 で、グローバルIPの取得の仕方が分からないのですが、 どのようにかけばよいのでしょうか? OSはRedHat10です。
553 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:07:14 ] シェルスクリプトのことをシェルゆーな。 Cシェルで書くな。 プライベートアドレス 10.x.x.x 172. {16-32} .x.x 192.168.x.x 割り当てられているIPアドレスは LANG=C /sbin/ifconfig |sed -n 's/inet addr:¥([^ ][^ ]*¥) .*/¥1/p' で取れるから、あとはawkでも使って該当しないものを除外すれば いいんじゃないか? と書いてから気づいたが、家のダイアルアップルータに繋がっている LinuxからグローバルIPアドレスを取ろうとするなら、Linuxにはプライ ベートIPアドレスしか割り当てられてない。取るべきはルータに付いてる グローバルIPアドレスになるから別の方法が必要だぞ。
554 名前:デフォルトの名無しさん [2007/04/07(土) 22:25:30 ] >>553 すいません、ありがとうございます。 何もわかってないんで^^; ずばり、そのとおりで、取得したいのはルータについてるグローバルIPです。。
555 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:42:16 ] >>554 ダイアルアップルータやモデムにはtelnetサーバが内蔵されていることがある。 叩くコマンドが分かれば、expectを使って取得できるかもしれない。 httpサーバを内蔵していることもあるが、こっちはずばりIPアドレスを確認する ページを持ってるかもね。
556 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:00:35 ] >>554 誰もおまいのルータの仕様を知っているやつはいないからな・・・ うちのFLASHWAVE 2040 M1ならID:PASS@ ルータのIP/doKeeping.htmlを wgetで取得してvar sIpAddress="*.*.*.*";の場所を取得すればわかる。
557 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:37:43 ] 何も考えずにメール出せば、大抵はReceived:にIPアドレスが自動的に書かれる。 書かれないならば、書いてくれるメールサーバを提供しているISPに乗り換える。
558 名前:537 mailto:sage [2007/04/11(水) 10:24:46 ] ソフトバンクさんからメールの返事が届きました。 正誤表も更新したみたいです。
559 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:36:15 ] alias定義で改行の前に入れる\にはどのような作用があるのでしょうか? csh でいろいろと試してみたところ、下のようにwhile文などが使えるようになりますが、 一方で、引数を扱ったりwhile文のネストをしたりすると正常に動作しなくなってしまいます。 alias loop '\ set count = 1\ while ( $count <= 5 )\ echo hoge\ @ count++\ end\ '
560 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:45:23 ] 未だだね。
561 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:46:29 ] あーいけね、>560は>558の話ね。 >>559 行末のバックスラッシュは改行文字をエスケープする。
562 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 13:19:26 ] >>561 「改行文字をエスケープする」の意味を具体的に教えて欲しいのです。 >>559 のコードで\+改行を空白に置き換えると動かなくなります。 妙な副作用がなぜ出るのかも謎です。
563 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:34:26 ] >>552 診断君とかにアクセスしてIP抜いてもらって それをパースするのはだめなんか?
564 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:36:33 ] ワンクリ詐欺サイトにアクセスすればIPアドレス教えてくれそうだな。
565 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:29:53 ] >>563 頻度にもよるけどあんま他人様のとこに頼るのもいかんと思う。 自前で取れるんならそうした方が優しいし確実。一応 ttp://info.ddo.jp/remote_addr.php とか使うとワンライナーでやれるけど。
566 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:59:30 ] >>562 シェルスクリプトにおける改行の意味を調べてみると良いよ。 alias loop 'set count = 1;while ( $count <= 5 );echo hoge;@ count++;end;'
567 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 05:02:58 ] >>566 while?
568 名前:デフォルトの名無しさん [2007/04/13(金) 21:22:17 ] 質問させてください。 以下のように、test-serverへ接続し、 date;hostname;whoamiを実行するスクリプトを書いてます。 date;hostname;whoamiの結果をリダイレクトし、 スクリプト本体があるサーバに保存したいのですが、 その場合、どう記述すれば良いでしょうか。 #/bin/bash HOST=test-server UNAME=root PASSWD=*** expect -c " set timeout 20 spawn telnet $HOST expect login:\ ; send \"$UNAME\r\" expect sword:\ ; send \"$PASSWD\r\" expect \"$\" ; send \"ls\r\" expect \"$\" ; send \"date;hostname;whoami\r\" expect \"$\" ; send \"exit\r\"
569 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 11:40:37 ] そのスクリプトの出力をリダイレクトすればいいのではなくて?
570 名前:568 mailto:sage [2007/04/17(火) 21:48:16 ] その方法が分からないのです。expect内部でリダイレクトすると 接続先にファイルが出来てしまうんじゃ無いでしょうか
571 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:45:47 ] >>570 にほんごよめますか?
572 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:08:52 ] ラッパー側のスクリプトの出力をリダイレクトしようとしても、 expectの中で起動したプロセスの出力はexpectが全部食っちゃうん じゃないの?
573 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:39:33 ] あるプログラムをバックグラウンド実行して、 そのプログラムが一定時間後に終了していなかったら終了させる、みたいなことはできますか? こんなイメージです。 #!/bin/sh /bin/hoge & # 数十分かかる。途中で固まるかもしれない。 sleep 3600 # 念のため一時間待ってみる [ hoge が終了していなかったら hogeをkillする。終了していたら無視 ] exit
574 名前:デフォルトの名無しさん mailto:age [2007/04/21(土) 18:41:17 ] あげ
575 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:50:35 ] >>573 こういう事? #!/bin/sh -x DURATION=3600 hoge & PID=$! echo ${PID} sleep ${DURATION} kill ${PID} exit
576 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:51:49 ] >>573 pid控えておいて、atコマンドで終了スクリプトを仕込むとか。
577 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:30:31 ] 一時間の間にpidが再利用されない保証があるなら。
578 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:44:35 ] kill する前に親プロセスの PID を確認すれば。
579 名前:デフォルトの名無しさん [2007/04/21(土) 20:11:19 ] データを 1バイトだけ 読み込むコマンドってなんだっけ?
580 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:21:18 ] >>579 head -c 1 ?
581 名前:573 mailto:age [2007/04/21(土) 22:39:07 ] >>575 こういうことです!ありがとうございます。 >>576 atd動いていないッス。。。 >>577 >>578 pidが再利用されない補償はもちろん無いです。 ググっていますがPPIDを確認をするコマンドが見あたらないorz $!や$$でPIDが取れるようなのでpsコマンドの結果から何とかしてみます。
582 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 17:22:43 ] waitか何かで子プロセスの終了待てなかったっけ?
583 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:14:45 ] >>573 pid=$! count=0 while [ $count -lt 60 ]; do sleep 60 kill -0 $pid || break count=`expr $count + 1` done [ $count -lt 60 ] || kill $pid
584 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:15:16 ] 待つよ。
585 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:16:01 ] むぅ、30秒差で… >>582 waitで待つよ。
586 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 11:19:01 ] >>583 kill -0 $pid ってどういう意味?
587 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:32:55 ] kill -0 $pid 2>/dev/null || break の方がベターだな。 >>586 man 2 kill The kill() system call sends the signal given by sig to pid, a process or a group of processes. The sig argument may be one of the signals speci- fied in sigaction(2) or it may be 0, in which case error checking is per- formed but no signal is actually sent. This can be used to check the validity of pid. プロセスが存在してそのプロセスにシグナルを送る権限があれば正常終了。 それ以外はエラー。つまり、プロセスの生存確認に使用できる。
588 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:58:56 ] >>587 なるほど。 日本語man読んでも意味がわかんなかったんだ ありがとう
589 名前:デフォルトの名無しさん [2007/04/27(金) 13:30:22 ] シェルブリッド
590 名前:デフォルトの名無しさん [2007/04/28(土) 16:07:15 ] ♪ア・ソ〜レ ア・チョン! ア・チョン! ア・チョン! チョン! チョン! バカ!
591 名前:デフォルトの名無しさん [2007/05/04(金) 00:27:06 ] a.txt 2 4 23 87 483 3 b.txt 89 34 111 8 3 97 とある場合 program a.txt b.txt と打てば 以下のようにに表示されるシェルスクリプトってできませぬか? 2+89=91 4+34=38 23+111=134 87+8=95 483+3=486 3+97=100
592 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:35:51 ] >>591 スクリプトにするまでもないが、 #!/bin/sh paste a.txt b.txt | awk '{ print $1 "+" $2 "=" $1 + $2}'
593 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:36:40 ] あああ、paste $* | awk 以下略
594 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 22:00:14 ] ああpasteって知らなんだサンキュー
595 名前:デフォルトの名無しさん [2007/05/10(木) 19:24:42 ] 自演さらしあげ
596 名前:デフォルトの名無しさん [2007/06/18(月) 22:07:54 ] 既存ファイルの一部のみ書き換える事ってできますか? (ファイル名変えずに) NHK,1 NTV,4 TBS,6 FTV,8 ANB,10 というテキストがあったとして sed 's/N/X/g' という操作をして XHK,1 XTV,4 TBS,6 FTV,8 AXB,10 としたいです。
597 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:23:39 ] 別のファイルに出力した後で、mvかcp
598 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:34:19 ] -i オプションあるならそれ使え
599 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:36:31 ] (mv file file.bak&& sed -e 's/N/X/g' >file) <file
600 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:47:14 ] sed -i 's/N/X/g' file
601 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:04:16 ] sed -i ってどんな機能??
602 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:23:41 ] 手元のsedにはないオプションだ。
603 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:47:04 ] なら perl 使っとけ。 perl -i -pe 's/N/X/g' file
604 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:36:49 ] edでいいんじゃね?
605 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:30:13 ] ファイルのある文字列を含む行と行の間を取得するにはどうしたらいいのでしょうか? 例えば「abc」「def」を含む行の間、2・3・4行目を取得をしたいです。 grepでやろうとしたのですが、どうしてもうまくいきません。。 abcaa aaaaa bbbbb ccccc defbb
606 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:36:36 ] >>605 sed -n '/abc/,/def/p' < text | sed '1d;$d' なんか冗長なのと、該当箇所が複数あると駄目だな。
607 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:37:59 ] パイプの後段を sed '/abc/d;/def/d' にすれば該当箇所が複数あってもOKかも。
608 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:47:05 ] >>605 sed -n '1,/abc/b; /def/q; p'
609 名前:605 mailto:sage [2007/06/27(水) 01:12:46 ] レスありがとうございます。 無理やりawkで冗長なものを作ろうとしてました。 もっと修行して出直します。
610 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:37:53 ] >>609 別にawkでいいんじゃね。ラクだし ↓複数箇所でも大丈夫 awk '/aaa/{f=1;next} /bbb/{f=0} f{print}'
611 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 23:03:01 ] つーかやり無理一行で作らんでも、perlとかで普通に作ればいいんじゃね。 冗長だろうがなんだろうが。
612 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:04:28 ] awkでがんばって一行で作ったのの速度と perlでシコシコださく書いたのの速度は どっちが速いですかね
613 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:11:24 ] 別に全然頑張ってない
614 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:19:38 ] awkで一行で書けるものがperlで一行で書けない理由は無い。
615 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:09:13 ] 一行に納める必要はないです。 バックリファレンスなどの特殊な機能を使わなければ 遅延評価DFAで動くawkは行数が増えても遅くなりません。 逆に頑張って一行で書いてもあんまり高速化しません。
616 名前:デフォルトの名無しさん [2007/07/04(水) 23:12:58 ] 九九の表を作るスクリプトなんですけど cshで@を使わないで書き直したらどうなりますか? #!/bin/csh -f echo " | 1 2 3 4 5 6 7 8 9" echo "--|------------------" foreach i (1 2 3 4 5 6 7 8 9) eaco -n " $i|" foreach j (1 2 3 4 5 6 7 8 9) @ seki = $i @ seki *= $j printf "%3d" $seki end echo "" end echo "--|------------------"
617 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:21:45 ] @を使わないならBourne Shellでやるようにexprを使えば?
618 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:25:05 ] >>617 Borne shellで書き換えは出来るんですけど 課題としてcshで@を使わないで書き直すように指示されてるんです
619 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:35:33 ] ばか?
620 名前:デフォルトの名無しさん [2007/07/05(木) 00:28:33 ] しつもん スイッチのポートとその先のPCのMACをSNMPで対応付けたいのですが、 #!/bin/bash while [MACアドレスがある限り];do snmpwalk -c コミュ IP .1.3.6.1.2.1.17.4.3.1.1 >aa snmpwalk -c コミュ IP .1.3.6.1.2.1.17.4.3.1.2 >bb snmpwalk -c コミュ IP .1.3.6.1.2.1.17.1.4.1.2 >cc snmpwalk -c コミュ IP .1.3.6.1.2.1.31.1.1.1.1 >dd grep MAC aa > mib grep mibの右側 bb >bridge grep bridgeの右側 cc >ifindex grep ifindexの右側 dd >port paste MAC,port >output.txt done <mac.txt みたいなたらい回ししか出来ないんですか? 関係ないけどどうして演算結果を変数に入れるのがあんなに変な形式なんだろう?
621 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:40:18 ] >>618 #!/bin/csh -f echo ' @を使わないことに何の意味があるの?' echo 'あんた馬鹿じゃねーの?'
622 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:02:45 ] >>618 Bourne Shellでやる「ように」と書いたのが見えませんでしたか? ・cshでも``記法は使えるでしょ? ・exprはBourne Shellの内部コマンドじゃないでしょ?
623 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:37:06 ] >>620 コマンド置換を山ほどネストすれば一時ファイルはもっと減るんじゃね? つかこの程度のことにbash使うな で、変な形式って?
624 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:53:44 ] 文字列+数値(たまに数値の無い行がある)の並んだファイルを置換したいです ○○○1 ××××200 △△ □□66 とか並んでるのを、 ○○○2 ××××201 △△ □□67 みたいに。 sedで左 >file1 sedで右 | sed -e "s/\([0-9][0-9]*\)/&+1/" | bc >file2 paste file1 file2 > file3 で解決かと思ったら、△△の行がbcで勝手に詰められて結果がずれてしまう… 私の頭ではこれ以上思いつきませんでした。助けて
625 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:56:27 ] awkでいいじゃん。
626 名前:赤帽勉強中 mailto:sage [2007/08/02(木) 21:45:16 ] ・lftpを使用してファイルアップロードと削除を行う(mirrorは使わない) ・アップロードと削除の対象ファイルはリストから読み込ませる って機能のスクリプトを作ろうとしているんですけど、 ファイル名をリストから読み込ませてのアップロードと削除がどうやれば良いのか。。。 どなたかlftpに詳しい方、アドバイスを下さいませ。(-∧-;) ナムナム
627 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:19:08 ] lftp使ったことないのでmanを見てみたが、manの範囲でできる。 実行するコマンドをテキストファイルに羅列して lftp -f そのファイル 標準出力からコマンドを食わせることができればきれいなんだけどな。 cat <<EOF > commands user hoge pass cd hoge EOF sed 's!^!put !' < put_file_names >> commands sed 's!^!del !' < del_file_names >> commands lftp -f commands とかそんな感じじゃね?
628 名前:赤帽勉強中 mailto:sage [2007/08/02(木) 23:10:38 ] >>627 レスありがとうございます♪おかげで何とかなりそうですよ。 実はmanを見たりググったりしていたんですが何じゃこりゃ?って感じで理解できていませんでした(汗 まだまだ全然勉強が足りませんですね。。。ヾ(´▽`;)ゝアセアセ
629 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:52:33 ] ふつうrsync
630 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 12:59:17 ] ついでなので、ワタシの使っているコマンドライン公開 lftp -u USER,PASS HOST -e 'set ftp:passive-mode 0;set ftp:ssl-allow 0;mirror -Rev' 2>&1 >>629 ftp しか使えない環境でも、rsync って使えますか?
631 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:37:12 ] >>630 使えません
632 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:49:39 ] sshオーバーで耐えろ
633 名前:デフォルトの名無しさん [2007/08/13(月) 00:26:07 ] シェルスクリプトでURLのリンク先を開くにはどうしたらいいでしょうか?
634 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 01:06:27 ] >>633 汎用的なのは telnet + expect SSL や TLS を使用しているなら openssl 接続先が http なら wget とか curl とか ftp なら ftp コマンド
635 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 04:04:17 ] UNIXパワーツールの92Pに PS1='`date "+%D %T"` $PWD $ ' というカスタマイズが紹介されていたんですが +%D %Tをダブルクォートで囲むのは何故なんでしょうか?
636 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 08:04:47 ] >>635 そのPS1への代入の段階で展開させず、PS1に%Dを引き渡すため。 勿論それは、プロンプト表示の段階で展開されることを期待している。
637 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:05:22 ] >>636 シングルクォートで囲んでいるので、ダブルクォートで囲まなくても 代入の時点ではdateコマンドは実行されないのではないでしょうか?
638 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:19:05 ] >>637 date +%D %T と実行してみろ。話はそれからだ。 >>636 それでは"が必要な理由の説明になっていない。
639 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 22:55:46 ] >>635 論点とは違うが、 PS1='\d \t \w \$ ' これと大差ない気がする。
640 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 08:41:29 ] >>639 それ移植性ある?(PS1に移植性も何もないが、移植性のある.profileとか 一時期凝ってたんで)
641 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 01:16:48 ] >>640 移植性というか、依存するのはシェルのバージョンだから、 ttp://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbBZ bash なら上の「プロンプト」の項に載っている奴は 少なくとも bash 2.05b 以降で使えるはず。 ついでに bash 3.2.17 の info を確認したら、二つ新しいのがあった。 これには移植性が無いって事だな。w `\D{FORMAT}' The FORMAT is passed to `strftime'(3) and the result is inserted into the prompt string; an empty FORMAT results in a locale-specific time representation. The braces are required. `\A' The time, in 24-hour HH:MM format.
642 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 01:59:47 ] echo $ とすると$が出力されるのに echo $"" や echo $'' とするとなにも出力されなくなるのはどうしてなんでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:15:52 ] >>642 後者は$が変数参照の一部と見做されるから。 抑止するには$を''で囲むか\でエスケープすればいい。
644 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:31:25 ] >>643 >>後者は$が変数参照の一部と見做されるから。 変数名が空の文字列の変数を参照しようとするってことなんでしょうか?
645 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 11:25:41 ] そんなようなもんじゃない? その割には、そんな変数は定義できないと思ったけど。
646 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 15:26:44 ] bash の話だと、 $"" と $'' は特殊な quoting の構文になってる。 zsh にも $'' はあるみたいだね。
647 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 19:47:15 ] man hogeの結果に対してgrepをしたい場合、どのように書けばいいのでしょうか?
648 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 21:41:37 ] うちのMacではそのまま man man | grep -i optionとかできるんだけど、 これって特殊?
649 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 21:51:12 ] >>647 PAGERをcatにしたらどう?
650 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:04:53 ] >>648 いやそんなことはないと思う linuxとかでもそうでしょ んでも、grep前にcol -bとかはさんだほうがモアベターだと思う
651 名前:647 mailto:sage [2007/08/28(火) 22:18:05 ] 今の環境はUbuntuなんですが デフォルトの状態でman hoge | grep "文字" をやるとエラーか文字化けか再フォーマットしてます〜というメッセージが出て止まってしまう みたいです。 言われたとおりPAGERをcatにしてみたら普通の文字はgrepできるようになったんですが、 man ls | grep -i のように-iの行を見ようとすると man: コマンドはステータス 13 で終了しました: /usr/bin/zsoelim /tmp/zman9mAoS0 | iconv -c -f EUC-JP -t UTF-8 | /usr/bin/tbl | /usr/bin/nroff -mandoc -Tutf8 | /usr/bin/col -b -p -x | /usr/bin/pager -s このようなメッセージが出て終了してしまいます。
652 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:47:15 ] nroff -man manページのtroffソース | grep ... はどう?
653 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 23:51:44 ] grep -e -i
654 名前:647 mailto:sage [2007/08/29(水) 09:18:30 ] >>652 実行してみると↓のようなエラーが出てきました。 普通にmanを実行するときちんと表示されるのに、それをリダイレクトしたりすると 文字化けするあたり、どこかがおかしいのだと思います。 653さんのようにやってみたところ日本語の部分が文字化けしてることを 除けばmanの情報をgrepできるようになりました。
655 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 10:30:44 ] >>654 grepで、オプション文字列と誤解されそうなキーワード(具体的には-で始まる)を検索する場合は、 -eなどでガードする必要があります。 なんてのは、シェルスクリプトと何にも関係ないマニュアルページを読めば済むことじゃないか。 鼬害だ、このすっとこどっこい。
656 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 12:51:20 ] おまいの選択している文字コードがmanファイルの文字コードと 違うんだから最初に LANG= で指定すると幸せになれるかもな。
657 名前:647 mailto:sage [2007/08/29(水) 15:05:01 ] >>655 すいません、すっとこどっこいでしたorz >>656 ja_JP.UTF-8以外に設定するとmanが英語で表示されてしまうみたいです。 この際、英語中心で読むようにしていこうかと思います。
658 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 17:48:29 ] そうか。 ちなみに俺は euc.jp の文字コードを使っているので 普通にman manすると文字が化けるが man -P cat man | grep man で日本語の所もgrepでけたぞ。
659 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 21:33:33 ] bash並にファイル操作が簡単で普通に数値計算できる言語はないものかねえ
660 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 22:36:05 ] >>659 具体的にどんなものをイメージしている? 計算部分は別プログラムを呼ぶのじゃダメ? awkでもperlでも、寧ろいっそ、octaveでも。
661 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 10:56:27 ] もう死にそうだからダメ元で助けてくれるえろい人頼ってみる YYYYMMDDNNNN.hogeというバイナリファイルが山ほどあり、NNNN部分は連番ではなくばらばら その中身を表示させるコマンドがある。表示内容が --内容ここから ヘッダ(ファイルにより行数ランダム) 1 : YYMMDD hhmm filesize 2 : YYMMDD hhmm filesize --ここまで YYYYMMDDNNNN.hogeのファイル名をYYMMDD.hhmmにリネームする awkで頑張ってみたけどヘッダの行数が統一されてないせいでお手上げ 一つ一つ表示させてはcpでリネームしてるんだが死にそう。 空白行の次の行だけをテキストか何かに出力する方法というか書き方って無い?
662 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:20:04 ] >>661 sed -e '1,/^$d' -e q YYYYMMDDNNNN.hoge
663 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:20:56 ] 訂正 sed -e '1,/^$/d' -e q YYYYMMDDNNNN.hoge
664 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:23:07 ] >>662-663 thx、やってみる
665 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:10:59 ] A="a\ta" echo $A ってすると次のようにメタキャラクタが展開されちゃうんだけど a[タブ]a これをecho $A |コマンド で展開せずに使いたいの。 ノーミソたりなくてやり方がさっぱり!おしえてエロい人! kshつかってます。
666 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:29:17 ] >>665 echo '$A' | こまんど ってことか? シェルスクリプト以前の問題だと思うが。
667 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:39:13 ] >>665 板違い。エロイ人に聞きたいなら。 sakura01.bbspink.com/hneta/
668 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:14:51 ] >>665 sed 's/<tab>/\\t/g' っていうことをしたいのだろうか
669 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:29:15 ] echo "${A}"
670 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:56:37 ] >>668 どうもありがとう!それです! Winのディレクトリ表記が全部タブに変換されてこまってました。
671 名前:デフォルトの名無しさん [2007/09/21(金) 16:39:07 ] とあるお気に入りのウェブサイトで、アドレスは一定のまま、 不定期に交換される画像(例えば www.example.com/cover.jpg ) を 毎日定時にチェックし、変更があったらそれをダウンロードし、 ファイル名にその日の日付を加えて保存する、という処理をさせたいです。 どのように書けばいいんでしょうか?
672 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:06:57 ] >>671 curl -I --header 'If-Modified-Since: Fri, 21 Sep 2007 09:00:00 GMT' URL とかやって、HTTPステータスが 304 Not Modified かどうかを見る。
673 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:40:26 ] 欧米エロサイトのサンプル画像取得か?
674 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:49:05 ] NASAのImage of the Dayとか。
675 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:02:35 ] >>672 別にHEADする必要なくね?更新確認と取得はHTTPならワンアクションで できるわけで。
676 名前:デフォルトの名無しさん [2007/10/18(木) 22:26:18 ] 質問させてください。 main.shというシェルスクリプトがあり、 main.shの中で、sub.shを実行させています。 sub.shは、5秒くらいで処理が完了します。 その後に、last.shというシェルを実行させたいのですが、 シェルコマンドで、"○○秒待つ"といったコマンドはありますでしょうか。 環境はbashになります。よろしくお願いします。
677 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:33:10 ] sleep ミリ秒
678 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:35:13 ] そもそもsub.shは非同期なの? 終わるのを待てばいいだけの話だったりはしないんだよね?
679 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:37:01 ] >>676 sleep 5 あと、『シェルブリッド』 じゃなくて 『シェルブリット』 だから。 そこは絶対間違えないように。
680 名前:675 mailto:sage [2007/10/18(木) 22:44:34 ] >>677-679 ありがとうございます! >>678 cronに登録したかったので 待つコマンドが無いかと思ってました。
681 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:47:19 ] ふと思ったんですが、sleepコマンド使うと、 PCのリソースを全て停止してしまうとかあるんでしょうか
682 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 23:29:41 ] ない
683 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 00:19:22 ] ふと思ったんですが、この方は自分で調べるとかないんでしょうか sleepなんて基本中の基本じゃん。
684 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 01:02:09 ] main.sh ------------ #!/bin/bash bash sub.sh bash last.sh ------------ で、いいのではないかと思うのは気のせいか。
685 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 01:19:02 ] >>684 たぶん>>678 も同じ疑問を持って書いたんだと思う。
686 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 09:31:43 ] >>683 sleep というコマンドを知らなかったとき、 この情報に辿り着くために必要な検索単語ってなんだ?
687 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:52:26 ] シェル 秒 待つ www.google.co.jp/search?q=%E3%82%B7%E3%82%A7%E3%83%AB+%E7%A7%92+%E5%BE%85%E3%81%A4
688 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 00:00:31 ] シェルスクリプトの本くらい立ち読みでいいから流し読みしろよ。 流し読みで覚えられないなら買え。 それやった上でsleepなんぞ知らないって言うなら諦めろ。
689 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 08:04:10 ] usleep
690 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 12:16:49 ] usleepなんて無いだろw
691 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 17:44:38 ] 何怒ってんのかね 気に入らなけりゃスルーすればいいのに
692 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 19:20:58 ] >>691 オマエモナーw
693 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 19:52:12 ] usleepのuがμのつもりだったと理解したときASCIIの世界に生きる人に同情した。
694 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:17:49 ] おいおい そこまで意地張ったのになんでnanosleepなんだよ!! かなり天邪鬼だ
695 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 22:04:14 ] >>693 マイクロは uC という表記方法もあるよ
696 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 23:15:22 ] >>695 結局それも「字形が似てるから代用」には違いないんでしょ?
697 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 23:46:50 ] μなんてDBCSローカルな文字つかって喜んでる椰子キモイ
698 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 23:50:13 ] μ(greek small letter mu)ならいいのか
699 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 10:48:43 ] 技術系だと割と当たり前に使うけどなぁ。usecとかum、uFとか。或いは組み合わせでug/lとかも。
700 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 14:35:50 ] それだってu(ユー)にマイクロの意味があるわけじゃないだろ? あくまでμの代用であることには違いないと思うが。
701 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 17:57:36 ] 不毛だ
702 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:38:48 ] 習慣
703 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:39:35 ] bashスクリプト中で cmd echo "foo-san" ってやると echo "foo-san" foo-san って感じに、実行されるコマンドの内容が先に表示される関数って、定番なのありますか? cmd() を echo $*;eval $* にしてみたけど、" とか ' とかの処理が旨くいかない。 DOS の echo on モードみたいのでもいいかも。
704 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:47:46 ] >>703 set -x
705 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:49:12 ] echo "." |xargs -t
706 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:52:26 ] >704 おーなるほど、そういうコマンドがあるのかー。勉強になりました。 >705 ありがとうございます。 でも echo つかうと、ダブルクォーテーションが表示されないのが、ちょっとかな、と。
707 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 11:10:16 ] >>706 set -v
708 名前:デフォルトの名無しさん [2007/10/24(水) 21:03:29 ] 親フォルダ内でシェルスクリプトを開いて、 Folder1に移動し、ABCを実行する。 1時間おきにプロセスABCがあるかチェックする。 終了したら、親フォルダに移動しFolder2でも同じことをする というスクリプトを書いたんですけど、 whileのdoで文法エラーが出て困ってます。 #!/bin/sh for i in 1 2 do cd Folder$i nohup ./ABC & while[$isAlive -eq 1] do sleep 1h isAlive='ps -ef | grep " ABC " |\ grep -v grep | wc - |' done cd .. done
709 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:18:40 ] while[$isAlive -eq 1] while文の文法の一部ではない。 [というコマンドの最後に ] いう引数があるコマンド行(リスト)。 よって空白が必須。
710 名前:708 [2007/10/24(水) 21:31:41 ] >>709 whileのところはできました。 ありがとうございます。 今度は、forのdoがおかしいって出ました。 forのなかでwhile制御することってできないんでしょうか?
711 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:41:40 ] エラーメッセージ書いてー。 '(単一引用符)は`(逆向き単一引用符)の間違いだよな? wc - |(マイナス、スペース、縦棒) は wc -l(マイナス、エル) の間違い?
712 名前:708 [2007/10/24(水) 22:21:55 ] 10行目、doが、syntax error です。って表示されました。 逆向き単一引用符で、wc -lエルです。 失礼しました。
713 名前:708 [2007/10/24(水) 22:24:03 ] 連投すいません。 エラーは、forじゃなかったです。 whileのところでした。
714 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 23:01:32 ] もっかいきっちりコピペしろ
715 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 00:23:06 ] 俺が同じマシン使ってたらABCという名前で永久に終了しないプログラムを動かしてやる。
716 名前:708 [2007/10/25(木) 03:03:38 ] >>714 ごめんなさい。もいっかい書き直します。 これの、whileのdoで文法エラーがでます。 >>715 永久に終了しない・・・作ってほしい #!/bin/sh for i in 1 2 do cd Folder$i nohup ./ppln & while[ $isAlive -eq 1 ] do sleep 1h isAlive=`ps -ef | grep " ppln " | grep -v grep | wc -l` done cd .. done
717 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 04:58:38 ] >>716 while と [ の間にスペースが足りないのはコピペミスだよね? 最初の while のチェックの時に $isAlive が未定義。 で、 [ コマンドが引数が足りないってエラーを吐く。 だから [ コマンドに与える変数はクォートで括っておくが基本。 while [ "$isAlive" -eq 1 ] あと pgrep があれば while の処理はもっと簡単に書けるよ。
718 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 08:21:46 ] ただ、>>715 がいうように、 既に誰かが同じ名前の無関係なプロセスを走らせていたらどうする? 「永久に」っていう細かいところでただの煽りとか思わずに、本質読み取らなきゃ。
719 名前:708 [2007/10/25(木) 16:02:00 ] >>717 ご指摘通りに作り直したら動きました。修正したものを張っときます。 >>718 おっしゃるとおりです。全然見えてませんでした。 実際に、スクリプトの名前を”ABC-sc.sh”としたら、 プロセスの出力が”2”とされてしまい、うまくいきませんでした。 もうちょっと改良について考えたいと思います。 プログラミングとかLinuxは初心者で、まだまだ勉強しないといけないって感じてます。 #!/bin/sh for i in 1 2 do cd Folder$i nohup ./ABC & sleep 20 isAlive=`ps -ef | grep "ABC" | grep -v grep | wc -l` echo "$isAlive" while [ "$isAlive" -eq 1 ] do sleep 1h isAlive=`ps -ef | grep "ABC" | grep -v grep | wc -l` echo "$isAlive" done cd .. done
720 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 01:12:26 ] >>719 $! という変数は知ってる? nohup ./ABC & echo "$!" # ← ABC の PID が表示される これなら >>718 の罠にはかからないよ
721 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 09:35:42 ] バックグラウンドで動かす意味なくね?
722 名前:デフォルトの名無しさん [2007/10/28(日) 21:40:09 ] 引数に対応した干支を表示するシェルスクリプトを Bshellで作成したいのですが、作成方法を教えて頂けないでしょうか?
723 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:31:24 ] eto=`expr ¥( $1 + 8 ¥) % 12` 年は西暦。子年を0にしたかったので8を加えてある。
724 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 12:33:07 ] >>719 ps -efではなく、psのフォーマット指定を使えば混乱が減らせると思う。 # >720も手だけど。 ps -efだと、例えば引き数が"ABC"なプロセスでも混乱してしまうよ。
725 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:21:20 ] >>716 初心者のくせに我輩を煽るとはいい度胸してるな。おととい来やがれ。 度胸に免じて、厨房どもに一つテクを授けてやろう。 kill -0で生存確認しろ。
726 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 08:34:30 ] 質問お願いします! 適当なファイルを作ってその中には数字を記述しておいて、キーボードからそのファイルを読み込んで、その記述してある数字に+2を行った結果を画面上に出力するというシェルを作りたいのですが、どのようにすればよいか教えていただけませんでしょうか? readとループ文を使って作りたいんですが自分で調べてもあんまりわかったんでみなさんのお力をお貸しいただけないでしょうか?
727 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 10:07:29 ] #!/bin/sh read num while `test $num` do echo `expr $num + 2` read num done ちょっと違うか。
728 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 11:34:29 ] awk使っていいなら凋落。 awk '{print $1 + 2;}' 適当なファイル
729 名前:c mailto:sage [2007/12/04(火) 13:14:06 ] % cat x 100 % cat add2 #!/bin/sh num=`cat $1` expr $num + 2 % ./add2 x 102
730 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 13:18:06 ] ん? こっちか? % cat x 100 200 500 % cat add2 #!/bin/sh exec < "$1" while read num do expr $num + 2 done % ./add2 x 102 202 502
731 名前:>>726 mailto:sage [2007/12/04(火) 14:04:57 ] >>727 >>728 >>729 >>730 回答サンクスです! いろいろな考え方ができるのですね。勉強になりました。 ぜんぶやってみたいと思います。助かりました!ありがとうございます。
732 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 00:36:45 ] シェルってゆうな。クズ。
733 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 20:46:08 ] >>732 やっぱりフルネームで言わなきゃ駄目なのか?
734 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 21:02:25 ] まあそれ抜きにしてもアレだろ
735 名前:login:Penguin [2007/12/07(金) 18:11:42 ] 午前2時まで、pingを10秒ごとに打ちたいのですが きれいな書き方おしえてください
736 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 18:29:03 ] # crontab */10 0-1 * * * ping toTarget
737 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 18:32:54 ] いけね、10分ごとにしちまったw おまけにpingが無期限実行だぜ。 つーことで訂正。 # crontab 0 0 * * * ping -i 10 -c 720 toTarget
738 名前:735 [2007/12/07(金) 18:35:34 ] >>737 さま ありがとう!
739 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 10:55:42 ] 既にシェルスクリプトじゃなくてUNIXよろず相談室だな(w
740 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 18:52:32 ] Linuxのpasswdみたいにコマンドを打った後に出てくる質問に答えていく場合は #!/bin/sh passwd aaaa pass pass とかじゃ無理みたいなのですが、どうすればいいのでしょうか?
741 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:04:22 ] ホントによろず相談室だなぁ…… >>740 リダイレクトでもしてみたら? passwdコマンドがリダイレクトを受け付けるとも思えないけど知っておいて損はないし。
742 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:19:44 ] >>740 対話的処理をしたいときは expect
743 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:11:49 ] >>740 Tclに嫌気が差したら Expect.pm (Perl)
744 名前:740 mailto:sage [2007/12/23(日) 00:02:58 ] >>742 で以下のようにしてみたのですが #!/bin/sh passwd testid expect \"*:\" send "test\n" expect \"*:\" send "test\n" cronのメールで useradd: user testid exists New UNIX password: New UNIX password: New UNIX password: passwd: Authentication information cannot be recovered Changing password for user testid. aaaa: line 6: expect: command not found aaaa: line 7: send: command not found aaaa: line 8: expect: command not found aaaa: line 9: send: command not found といわれました。 expectが見つからない・・?何か入れる必要あるんでしょうか?
745 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:32:51 ] cronから起動されるときのPATHがどうなるかmanで勉強する。 which expectしてみる。 $PATHの値を見てみる。 locate expectしてみる。 パッケージ管理システムを使ってるならそれを使ってインストールされてるか見てみる。(rpm系Linuxのrpm -q expectみたく) /usr/localや/optなどのそれっぽいディレクトリの下のどこかにあるのかもしれない。 あと、expectの使い方って expect -c " ... spawn passwd #パスワードコマンド起動 expect ログイン要求を待つ send ログイン名 云々 " じゃなかったっけ?
746 名前:740 mailto:sage [2007/12/23(日) 14:11:46 ] >>745 ズバリですね。yum install expectとしたらインストールされていないらしく入れますか?と。 expect -c " spawn passwd id expect \":\" ; send 〜でできました。 大変参考になりました、ありがとうございます。
747 名前:デフォルトの名無しさん [2007/12/29(土) 11:20:36 ] 初心者的な質問で,申し訳ないです。 ヒアドキュメントで変数に代入する方法がわからなくて。 list=<<EOT A B C EOT echo $list としても$listには何も代入されなくって。
748 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 11:33:39 ] ヒアドキュメントは、PerlやらRubyやらでは変数への代入に使うけど、 シェルスクリプトでは、コマンドの標準入力をすげ替えるモノじゃないかな。
749 名前:747 mailto:sage [2007/12/29(土) 12:23:18 ] >>748 なるほど,標準入力のかわりだったのですか。 ということで read list <<EOT #--> A としたらという結果。あともう一歩というところまできました。
750 名前:747 mailto:sage [2007/12/29(土) 12:38:15 ] とりあえず while read line; do list="$list $line";done <<EOS A B C EOS echo $list で ん〜,改行がなくなってしまう...
751 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:21:26 ] そりゃぁ、echoすれば改行は消えるね。
752 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:26:09 ] >>750 ダブルクォートをつけてみな。 echo "$list" 見た目がいまいちかもしれんが、こうやって代入する事もできるよ list='A B C'
753 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:50:43 ] zshとbashじゃそこの挙動違うんだな
754 名前:デフォルトの名無しさん [2008/01/02(水) 15:16:56 ] シェル初心者ですが pingして反応が無かったらまたAにGOTOして というのを書いているつもりなんですが これをcronで実行させると A:: not found となります。 GOTOさせる場合の正しい書き方を教えてください #!/bin/sh PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin HOST=192.168.1.6 TIMEOUT=5 A:; /sbin/ping -t $TIMEOUT -o $HOST if [ $? != 0 ]; then goto A; else /bin/echo "$HOST is Alive!" fi
755 名前:デフォルトの名無しさん [2008/01/02(水) 16:35:27 ] あっ、gotoでなくてもいいのか こうすればいいてことですね while [ $? != 0 ] do /sbin/ping -t $TIMEOUT -o $HOST done
756 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 05:20:05 ] >>755 すでに解決しているようだが、こんな書き方もできる。 until /sbin/ping -t $TIMEOUT -o $HOST do : done
757 名前:デフォルトの名無しさん [2008/02/09(土) 17:00:30 ] 自分に渡されたコマンドオプションをそのままほかのコマンドに渡したいのですが うまくいきません runruby.shに cmd=ruby ${cmd}" $@" と書いて ./runruby -e 'puts "Hello"'を実行すると ruby: No such file or directory -- -e (LoadError)と言われてしまいます
758 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:11:50 ] >runruby.shに : : >./runruby -e 'puts "Hello"'を実行すると runruby.shはどこに行った? それと、そのrunruby.shによるとrubyに" -e"を渡すことになるぞ。
759 名前:757 mailto:sage [2008/02/09(土) 17:18:29 ] >>758 申し訳ございません 間違いました ./runruby.sh -e 'puts "Hello"'でした runruby.shの内容を cmd=ruby ${cmd} ${@} にしてみたらエラーメッセージはでなくなったのですがHelloも表示されず終了しましたorz
760 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:22:54 ] なんで"$@"にしないの?
761 名前:757 mailto:sage [2008/02/09(土) 17:31:24 ] >>760 できました!! ありがとうございます
762 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:33:10 ] つまり、rubyコマンドはコマンドライン引き数の先頭が空白だとファイル名と看做すってことか。
763 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:39:39 ] bashでしか試してないけど、、、 ${cmd}" $@" -> "ruby\ -e" "puts \"Hello\"" $cmd "$@" -> "ruby" "-e" "puts \"Hello\"" "${cmd} $@" -> "ruby -e" "puts \"Hello\"" "${cmd}" "$@" -> "ruby" "-e" "puts \"Hello\"" "$@" -> "$1" "$2" ... "str$@" -> "str$1" "$2" ... "str $@" -> "str $1" "$2" ... って感じで展開されているのかな?
764 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:42:01 ] 3つ目、 x "${cmd} $@" -> "ruby -e" "puts \"Hello\"" o "${cmd} $@" -> "ruby\ -e" "puts \"Hello\""
765 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:59:05 ] よく見たら、 "$@" じゃなくて " $@" なのかよ。
766 名前:デフォルトの名無しさん [2008/02/11(月) 18:09:03 ] configureでif test x"$enable_shared" = xyes; thenっていうふうに xを付け加えて比較してるのをよく見るのですがxはなんのためですか?
767 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:12:40 ] 空文字列のときも大丈夫にするためかな xつけないとtestで構文エラー出ちゃうでしょ?
768 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:13:32 ] $enable_sharedがマイナスで始まってる場合を考慮……はconfigureでは不要か。
769 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:38:48 ] 変数をクォートしないとこうなるけど、この場合は関係ないか $ x='-n 3 -o 1' $ if test $x = 1; then echo ok; fi ok
770 名前:デフォルトの名無しさん [2008/02/15(金) 18:24:02 ] echo `df` だと1行で出力されて echo "`df`" だと複数行出力になるのはなんででしょうか?
771 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:00:26 ] >>770 echo "foo bar" のようにダブルクォートの中では、改行が区切り文字にならなくなるから
772 名前:デフォルトの名無しさん [2008/02/15(金) 19:44:39 ] >>771 ああ、そうか。改行って""の中だと改行として有効なのか。 ふむ、""がないと、単なる区切りになっちゃうわけですね。
773 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:27:13 ] >>767-768 configure普通autoconfで自動生成するから、 ハイフンで始まっていたり=だったりするのを考慮したコードが 不必要な部分でも出てくるだけ。
774 名前:デフォルトの名無しさん [2008/02/16(土) 02:22:13 ] 自分が所持している映画のDVDのリストを整理しているのですが、 CSV形式で、例えば次のようになっている時に、 "jean-luc godard","1967 week end" "jean-luc godard","1965 pierrot le fou" "jean-luc godard","1960 a bout de souffle" を "Jean-Luc Godard","1967","Week End" "Jean-Luc Godard","1965","Pierrot Le Fou" "Jean-Luc Godard","1960","A Bout De Souffle" と一括変換したいのですが、どのようにすればいいのでしょうか? やりたいことは、 1). まず、2番目のフィールドが"制作年 タイトル"となっているのを"制作年","タイトル"に分けたいのと、 2). 次に、総ての単語の頭文字を大文字にしたい、 ということなんです。 1). は sed で何とかなりそうなのですが、2). が分かりません。 どなたかお助け下さい。 あるいは他に正しいスレがあるようでしたら誘導をお願いします。
775 名前:デフォルトの名無しさん [2008/02/16(土) 02:24:27 ] すみません。やはり 1). もよく分かりません。 どなたか助けてください。お願いします。
776 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 02:34:45 ] 手抜きですが perl -pe 's/\b(\w+)/\u$1/g; s/"(\d+)\s*/"$1","/'
777 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 03:11:07 ] ただシェルじゃないんだよなそれだと。。。 俺もPerlとかでしか思いつかないけど
778 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 03:14:45 ] >>774 シェルスクリプトだけでは無理でも(1)も(2)もawkでできますね。 取り敢えず(1)はこんな感じ。 awk -F, '{$2 = substr($2, 1, 5) "\",\"" substr($2, 6);} {print;}'
779 名前:デフォルトの名無しさん [2008/02/18(月) 01:45:59 ] [root@hoge admin]# ls -l | grep forward -rwsr-xr-x 1 root admin 300 2月 18 01:16 setforward.sh [root@ibm admin]# cat setforward.sh #!/bin/bash # set variable PATH=/home/ USER=$1 ADDRESS=$2 cd $PATH$1 cat << EOF > .forward "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1" EOF cat << EOF > .procmailrc :0 c ! $ADDRESS EOF [root@hoge admin]# ./setforward.sh admin test@example.jp ./setforward.sh: line 14: cat: command not found ./setforward.sh: line 20: cat: command not found CentOS5.0です。 一般ユーザに、他のユーザの転送設定をさせたいと考えています。 こんな感じでcatコマンドが無いと言われてしまいます。 そのくせ、空っぽの.forwardと.procmailrcファイルが作成されます。 なぜcommand not foundになってしまうんでしょうか?
780 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:51:29 ] PATHは使っちゃだめよ
781 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:05:32 ] 環境変数PATHはコマンド(実行ファイル)を検索するためのものだから、 違う変数名にしないと駄目よ。
782 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:13:29 ] >>779 大文字の変数は環境変数で使われる事が多いから 小文字を使った方がいいよ。
783 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:42:13 ] >>779 自分で勝手にサーチパスを潰しておいて、見つけてくれないと文句を言うとはなんてぇゆとりだ。
784 名前:779 [2008/02/18(月) 13:10:40 ] >780-783 ありがとうございます。 m(_ _)m 続けてもう一つ・・・ -rwsr-xr-x 1 root root 300 2月 18 01:16 setforward.sh このシェルを動かして、一般ユーザで 他の一般ユーザの転送設定をしようとすると、 「cd」のところで"/home/user: 許可がありません"と 弾かれてしまいます。 SUIDをつけてあるのに、何がいけないんでしょうか? またまたよろしくお願いします。
785 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:26:00 ] mount nosuid されてるとか。
786 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:38:28 ] >>784 別に cd する必要ないんじゃないか? #!/bin/bash # set variable path=/home/ user=$1 address=$2 cat << EOF > "$path/$user/.forward" "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1" EOF cat << EOF > "$path/$user/.procmailrc" :0 c ! $address EOF
787 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:46:42 ] OSによってはスクリプトのsuidを意図的に無視するモノがある。 Linuxとか。
788 名前:779,784 mailto:age [2008/02/19(火) 01:49:15 ] >785-787 ありがとうございます。 /etc/fstabのマウントオプションは、「defaults」でした。 明示的に「async、auto、dev、exec、nouser、rw、suid」 としてみましたが、ダメです。 そして>786氏のスクリプトもダメでした。 最初のcatで弾かれます。 しかも786氏スクリプトは、ユーザ自身の転送設定を しようとすると、.forwardファイルが 「"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1" EOF cat << EOF > "$path/$user/.procmailrc" :0 c ! $address EOF」となってしまい、 .procmailrcファイルは作成されませんでした。 引き続きよろしくお願いします。
789 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:03:08 ] >>788 最初の EOF の前後にごみが入ったんじゃないか? まあ、見栄えを気にしないのなら echo でもいいけどな。 echo > "$path/$user/.forward" "\"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1\"" echo > "$path/$user/.procmailrc" ":0 c ! $address" > 最初のcatで弾かれます。 原因は多分 >>787
790 名前:779,784 [2008/02/20(水) 04:11:45 ] さっき本屋で分かっちゃいました。 CentOS徹底入門 第2版 www.amazon.co.jp/dp/4798114626/ に書いてありました。 >787さんの通りでした。 なんとかならんものか、CentOSスレッドででも 質問してみます。 ありがとうございました。
791 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:25:28 ] >>790 sudo を(きちんと設定して)使えば。 ていうか、一般ユーザに他のユーザの転送設定をさせる理由がわからん。
792 名前:779,784 [2008/02/20(水) 14:07:08 ] >791 ありがとうございます。 自社でちっさいデータセンタを持っています。 で、その中に他の会社のドメインと同居してるんです。 複数ドメインを管理するGUIのソフトが未熟で、 会社に届いたメールを携帯に転送する場合があるんですが、 転送すると全部そっちに転送されちゃうんです。 それを回避するには、今のところCUIで手書きして あげるしかないんです。 私は情シス部隊所属、DCは開発部隊のもの。 与えられたドメインごとの管理者ユーザは、CUIだと 他のユーザの$HOMEに入れないんですよ。 それで、SUIDつけたスクリプトならイケるんじゃないかと 考えた次第です。 なんか表現が未熟ですがご理解いただけましたでしょうか?
793 名前:デフォルトの名無しさん [2008/02/27(水) 12:09:36 ] 教えてください 日付の切り出しかたわかりません data.txt 2/1 XXXXXXXX 2/2〜2/5 XXXXXXXXX 2/7〜2/8 XXXXXXX 2/12 XXXXXXXXXX 2/20〜2/28 XXXXXXXXX と書かれた行があり 今日より以前の日付の行を削除するにはどうすればいいですか 正規表現板で聞いたのですが正規表現の問題と言うよりプログラムの方でたずねる みたいナノデ 日付に〜が入っているためなおさら難しくさっぱりわかりません
794 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 13:02:15 ] シェルスクリプトで実装するのか?そうでないならスレ違いだが
795 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:19:20 ] >>792 今日より以前を削除とは? 今日が2/27で 2/5〜2/28 xxxxxx というデータを 2/27〜2/28 xxxx にしちゃうのか、そのまま生かすのか?
796 名前:デフォルトの名無しさん [2008/02/27(水) 16:57:32 ] 初心者な質問ですみません。 あるディレクトリの中に数百のファイルがあり、 AAA_01.txt AAA_02.txt ... のようなファイル名になっています。 それを、下記のように、AAAの箇所をDATE関数で日付を取得したいのです。 20080226_01.txt 20080226_02.txt ... どのようにすればよろしいでしょうか。
797 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 17:15:22 ] >>796 日本語で
798 名前:デフォルトの名無しさん [2008/02/27(水) 17:27:00 ] >>795 今日が2/27だと 2/20〜2/28 XXXXXXXXX の行を残してそれ以前の日付の行を削除したいのです。
799 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:02:38 ] あーなるほど、PIMのスケジューラみたいなものを考えているってことか。 シェルスクリプトだけでどうこうできるフォーマットじゃないし、チルダの所為で awkかなんかの一行野郎で済ませることも難しそうだ。
800 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:11:01 ] バカみたいにawk使えばいけそうじゃない? 実行して試してないけど下みたいな感じで。 DATE=`date +"%m/%d"` M=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $1}' ` D=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $2}' ` while read LINE;do if [[ `echo ${LINE} | awk '{print $1}'` = [*][〜][*] ]] ;then MM=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $1}'` DD=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $2}'` else MM=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $1}'` DD=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $2}'` fi if [[ ${M}=<${MM} && ${D}=<${DD} ]] ;then echo ${LINE} >> ${OUT_FILE} fi done < ${IN_FILE} みたいな。
801 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:14:11 ] あ、dateコマンドで出てきた数値の頭に0がついてたらだめかも。 そのへんは0区切りで$2を取るとか適当にやってください。
802 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:51:41 ] bashで数値を10桁程の数値をカンマ区切りにしたいのですが、どのような書き方をしたらできるでしょうか?
803 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:57:06 ] >>800 それはOneLinerとは言えないんじゃ……と突っ込もうと思ったら OneLinerを腐るほど呼んでたのねw
804 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 05:18:51 ] >>802 標準のコマンドで何かありそうなきもするし、 awk とか sed とか perl とかなら OneLiner で済みそうだが あえて bash 限定で書いてみたぞ。 expr 使えば bourne sh でも動くようになると思う。 #! /usr/bin/env bash num=$1 result='' figure=$[ ${#num} % 3 ] (( figure > 0 )) && read -n "$figure" result <<< "$num" while read -n 3 i ; do [[ -n "$i" ]] && result="${result},${i}" done <<< "${num:$figure}" echo "${result#,}
805 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:41:18 ] expr使っていいんだったらexpr $num : '.*\(...\)'で済んじゃうだろ。 以下1行に詰め込めないこともないawk解。 { out="" for (l=length(src=$0) - 3; l>0; l-=3) { out="," substr(src,l+1,3) out; src=substr(src,0,l); } print src out; }
806 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 21:28:47 ] >>804 >>805 なるほど、さまざまな方法があるんですね。 とても参考になりました、ありがとうございました。
807 名前:デフォルトの名無しさん [2008/03/04(火) 17:15:40 ] cシェルについて質問させてください。 /(スラッシュ)一文字にマッチさせるには どのように記述すれば良いでしょうか。 以下のようにやりましたが、うまくいきません。 よろしくお願い致します。 #!/bin/csh -f set etc = / echo $etc if ($etc =~ ^/$) then echo ok else echo ng endif
808 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:24:54 ] sh系みたいにtestコマンドを使って、if [ -$etc == -/ ] then としたらどうだろう。
809 名前:デフォルトの名無しさん [2008/03/04(火) 17:36:26 ] >>808 即レスありがとうございます! 出来ました<(_ _)>
810 名前:デフォルトの名無しさん [2008/03/10(月) 15:02:33 ] while read lineでファイルを読み込んで その行にABCと言う文字があるかないか判定して あれば 処理1 なければ 処理2という if文での書き方教えてください
811 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:33:37 ] case $line in *ABC*) 処理1 ;; *) 処理2 ;; esac ってif文でかよ!
812 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:20:20 ] grepと組み合わせないと無理か。 1行ごとにgrepなんか起動したくないが。
813 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:24:46 ] line2=${line%%ABC*}${line##*ABC} # で削って if [ ${line} = ${line2} ]; then # 処理1 else # 処理2 fi # とか?
814 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:49:58 ] if [[ $line =~ ABC ]]; then echo matched else echo did not match fi こういうこと?
815 名前:デフォルトの名無しさん [2008/03/12(水) 23:35:10 ] 1レコードのXMLを、シェルを使って字下げなどを自動で行って表示させたいのですが、 なにかうまい方法はないでしょうか? --------------------------- <all><a>123</a><b><c>456</c><d>789</d></b></all> ↓ <all> <a>123</a> <b> <c>456</c> <d>789</d> </b> </all> ------------------------ というような感じで・・・
816 名前:デフォルトの名無しさん [2008/03/12(水) 23:37:16 ] ↑ すいません、4タブで字下げされてると思ってください。
817 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:48:55 ] 整形式XML全般を扱うというのは、かなり難しいんじゃないか? perlとかrubyとか使うべき。 よほど単純化されてるんなら、まずはタグ1個が1行になるように改行して、 開始タグなら字下げを増やして、終了タグなら字下げを減らして、って感じか。 ただこれでは <c>456</c> とか無理だが。
818 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:26:53 ] >>815 おおざっぱに手順を考えてみた。 めんどくさそうなので実装はまかせた。 1. 行の最初にあるタグとその閉じタグの間に他のタグがあれば、タグの頭で改行する。 この時にインデントの深さをタブ幅文プラスしてタグ名を記録する。 2. インデントの深さが 0 以上ならインデントする 3. タグの間にタグが無いなら閉じタグで改行 4. 記録したタグの閉じタグを見つけたらインデントの深さを減らして記録から削除。 5. 1-4 繰り返し
819 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:29:03 ] xmllint --format に食わせればおk
820 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:13:44 ] cron などによってある時刻に自動的に起動させるプロセスで、 実行開始から xxxx秒 とか経過してもまだ終了しない場合 強制的に終了させる方法にはどんな方法があるでしょうか? そして、その方法で注意しておかなければならない 点とかあれば教えてください
821 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:00:29 ] 起動したいプロセスをバックグランドで起動して、 必要な秒数sleepしたら問答無用でkillするとか。 そのプロセスが、適切な後処理のために特殊なシグナルを利用できるのなら、 killでそのシグナルを指定すればいい。
822 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:33:55 ] >>820 ロックファイルを作るタイプはプロセスだけ殺しちゃうと 困った事になるかもしれない。
823 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:44:02 ] だからそういうプロセスは適切なシグナルハンドラを用意するべきなんだよね。
824 名前:デフォルトの名無しさん [2008/03/25(火) 22:12:46 ] Cシェル(ソラリス)について教えてください。 test.txtに、helloが入っていたら、OK、 無ければ、NGと判定させたいのですが、 以下のようにしてもIF文が不正ですと言われます。 Bシェルでは、うまくいくのですが、Cシェル用の記述方法等 ありましたらアドバイスください。 if ( cat test.txt | grep "hello" ) then echo OK else echo NG endif
825 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:14:58 ] $status
826 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 00:19:08 ] >cat test.txt | grep "hello" なんでgrep "hello" test.txtにしないんだ?
827 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 08:23:26 ] B shell 使えばいいじゃん。
828 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:06:37 ] ファイル 1.txt 2.txt 3.txt test.bash が存在するディレクトリで以下の 内容を実行するとなぜ1が返ってきますか?4になぜならないのかわかりません。 --test.bash-- #!/bin/bash current_files=$(ls) echo ${#current_files[@]}
829 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:32:48 ] for で current_files の中身を見てみると分かるかと。 for file in "${current_files[@]}"; do echo "[[[$file]]]"; done
830 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:59:01 ] >>828 × current_files=$(ls) ○ current_files=( $(ls) ) 空白入りのファイル名があると期待通り動かないから気をつけろ
831 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:19:09 ] いつもそこで悩むんだけど、 空白入りのファイル名があっても大丈夫な方法ってないの?
832 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:46:20 ] >>831 つperl つruby つpython
833 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:49:45 ] つzsh
834 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:54:25 ] >>831 あるにはあるが、正直面倒。 1) 一時的 IFS 変更 IFS=$'\n' current_files=( $(ls) ) 2) for + ワイルドカード for file in * ; do current_files[${#current_files[@]}]=$file done 3) while + read + here strings (パイプは不可) while read file ; do current_files[${#current_files[@]}]=$file done <<< "$(ls -1)"
835 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:18:29 ] >>834 ほうほう・・・。3 とか凄いですな。
836 名前:828 mailto:sage [2008/03/28(金) 09:29:29 ] うぉぉ・・!激しく助かりました。 シェルなんて初めてなんでw奥が深いな。
837 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 23:14:01 ] ファイルから読んだ文字列をfindに引数として渡して、 ファイル一覧を取得するスクリプトを作りたいのですが、うまくいきません。 以下の内容でおかしな部分があったら指摘をお願いします。 ディレクトリ構成 dir +---nkf_args +---filelist.sh +---a.cpp +---b.cpp +---a.h +---b.h ---------------------------- nkf_argsファイル -name "*.cpp" -or -name "*.h" ---------------------------- filelist.shファイル #!/bin/sh #nkf_argsファイルから引数文字列取得 nkf_args=`cat nkf_args` #findで条件に一致したファイルリスト取得 files=`find ./ $nkf_args` for filename in files do echo "$filename" done
838 名前:837 mailto:sage [2008/03/30(日) 23:16:40 ] 続き スクリプト実行結果 予想値 a.cpp a.h b.cpp b.h 結果 出力無し ここまで --------------------------------
839 名前:837 mailto:sage [2008/03/30(日) 23:19:28 ] ちなみに引数ファイルに書かれているものの ダブルクォーテーションを外すことで *.cppに関する結果は得られましたが、 *.hに関する結果は得られませんでした。
840 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:03:22 ] 取り敢えず、filelist.shの1行目を#!/bin/sh -xにして実行してみたら?
841 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:32:52 ] そのfindでのORって-oだったりしませんか?
842 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:35:38 ] >>841 POSIXのfindなら、-orは-oと同じ(とmanに書かれている)だから大丈夫。
843 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:12:40 ] >>839 そのやり方を試してみました。 -------------------------------------- 出力 ++ cat nkf_args + nkf_args='-name "*.c" -or -name "*.cpp"' ++ find ./ -name '"*.c"' -or -name '"*.cpp"' + files= -------------------------------------- 出力結果を見るとダブルクォーテーション部分が、 さらにシングルクォーテーションで囲まれるから駄目なのかと思い、 ダブルクォーテーションを外してやってみました。 -------------------------------------- 出力 ++ cat nkf_args + nkf_args='-name *.cpp -or -name *.h' ++ find ./ -name a.cpp b.cpp -or -name a.h b.h find: paths must precede expression Usage: find [path...] [expression] + files= -------------------------------------- ダブルクォーテーションを外した結果は 作業ディレクトリにあったファイル名に置き換えられて 無効な引数になってしまいました。 以上の結果を踏まえて、条件に合うファイルがないディレクトリから スクリプトを実行した結果、想定していた結果が得られました。 ただ、根本的な解決になっていない(どういう動作をするか分かっていないと、正しい結果が得られない)ので、 これをディレクトリ状態に依存しないようにしたいのですが、どういう方法があるのでしょうか? よろしくお願いします。
844 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:42:39 ] files=`find ./ $nkf_args` を files=`eval find ./ $nkf_args` としたらうちでは上手くいったよ。
845 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:56:20 ] >>844 試してみたところ、想定している結果が得られました。 皆さんありがとうございました。
846 名前:デフォルトの名無しさん [2008/04/02(水) 09:40:50 ] Cシェルで、以下のようなテキストファイルに保存した内容と コマンドを組み合わせた処理をしたいと考えています。 ・command.txtの内容 grep httpd /bin/csh -f set command = `cat command.txt` ps -ef | "command" > kekka.txt 上記のように試したのですが、書式が不正の為、 エラーとなります。 ps -ef | grep httpdの実行結果を、kekka.txtに保存したのですが、 どのようにすれば良いでしょうか。アドバイスお願いいたします。
847 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 09:51:35 ] "command" → $command
848 名前:デフォルトの名無しさん [2008/04/02(水) 10:44:30 ] >>847 即レスありがとうございます。 ps -ef | "$command" > kekka.txt としても grep httpd: コマンドが見つかりません。という エラーが発生します。 ps -ef | grep httpdの実行は可能です。 何が問題となっていますでしょうか。
849 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 10:52:50 ] アホ
850 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 11:38:28 ] 847のすべての文字を100回音読しなさい
851 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 11:38:37 ] >>848 #!/bin/sh command=`cat command.txt` ps -ef | $command > kekka.txt
852 名前:848 [2008/04/02(水) 16:06:20 ] すみません。よく読んでダブルクォーテーションを外したところ、 正常に実行できました。ありがとうございます。 恥の書き捨てでもう一つ質問させてください。 コマンドにパイプ繋ぎで複数の指定をしたいと思ってます。 command.txtの内容が、grep httpdであれば実行できるのですが、 grep httpd | grep -v grepとすると、以下のようなエラーになります。 > grep httpd | grep -v grep > grep: | をオープンできません。 > grep: grep をオープンできません。 > grep: -v をオープンできません。 > grep: grep をオープンできません。 これを防ぐ方法は無いでしょうか。 もしくは、command.txtに「ps -ef | grep httpd | grep -v grep > kekka.txt」と 書いてあって、それをそのまま、Cシェルで実行する方法は無いでしょうか。
853 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 16:13:03 ] csh -f command.txt csh -fc "$command" csh -fc "`cat command.txt`"
854 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 16:14:04 ] >>852 ttp://www.kiso.tsukuba.ac.jp/~makimura/text/node239.html
855 名前:848 [2008/04/02(水) 17:07:37 ] >>853 ありがとうございます。<(_ _)>
856 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:08:25 ] >>848 source command.txt
857 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 23:56:01 ] シェルでroot権限で実行してるのに、 ファイルが作れないとか、パーミッションエラーが出る 場合があるんだけどどうしてなの? OSが同じ他のマシンじゃ正常に実行できる 細かいところでマシンの仕様がちがってるんだろうけど なんでなんだよ。root権限なのに。。。
858 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 00:29:17 ] >>857 情報が少ないな。少なくとも # ls -ld . 位は欲しい。
859 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 00:36:06 ] root でも root の書き込み属性がないと書き込めないよ
860 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 02:18:59 ] BSD系ならchflagsあたりが関係してるかもしれん
861 名前:デフォルトの名無しさん [2008/04/29(火) 22:02:37 ] bashなのですが $ tgts=`find . -name \*.\[hc\]` $ for tgt in $tgts; do cp ${tgt} ${tgt}.orig done で cp: `ここにファイル名ずらずら` にアクセス中: File name too long と言われてしまいます。 tgts=`find . -name \*.\[hc\] -printf "%p "`としてIFS=" "でも同じでした。 tgts=`find . -name \*.\[ch\] -print0`だと cp: `./aaa.h' と `./aaa.h' は同じファイルですとか言われてしまいます><
862 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 22:08:13 ] エラーの原因はよくわからないけど、パイプするかfind -execするかしたらどう
863 名前:861 mailto:sage [2008/04/29(火) 22:27:15 ] すみません bashでなくてzshでした bashだとちゃんと動きました
864 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 22:29:44 ] zshなら$tgtsが単語に分割されないから。${=tgts}だといい
865 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 19:00:56 ] シェルスクリプト修正の工数見積もりにあたって、修正対象のスクリプトのステップ数を出したいのですが、みなさんはどのような方法で行っているのでしょうか? よろしくお願いいたします。
866 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:17:06 ] >>865 先に(こっそり)スクリプトを書いて、実績を「工数見積」として出す。 シェルスクリプトを「ステップ数」で見積もるなど馬鹿馬鹿しくてやってられない。 ステップ数換算で、ど〜の・こ〜の言うのは太古のCOBOLの悪習。
867 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 06:24:34 ] >>865 そういう話はマ板向きじゃないのだろうか。 まあそれはそれとして、シェルスクリプトなんてやってることは 一般のアプリケーションプログラムに比べて小さくて特定されてるんだから 修正するのは新しく作り直すのと同義だろ。 新規作成と同額でいいんじゃね? /etc/rc.d/並みの複雑怪奇なスクリプトだったらこの話はあてはまらないが、 そういうのはperl,python,rubyで書かないのが間違い。
868 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:10:59 ] echo "hoge" | read Hage echo $Hage これって読み込んでくれないの?
869 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:57:12 ] >>868 echo "hoge" | (read Hage) の状態になって、サブシェルの変数をセットして終わる。 echo "hoge" | (read Hage; echo $hage) zshなら大丈夫。
870 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:00:26 ] 読み込むよ。これ試して味噌。 -- echo foo | (read; echo $REPLY) -- って書くために検証してたら先を越されたw
871 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:37:59 ] >>869 ,>>870 thx. でもよくわからない。 #!/bin/sh alert --info "Whitch Resolution" "1600x1200" "1280x1024" "1024x768" >RES read Res <RES && rm RES echo "Resolusion is "$Res case "$Res" in "1024x768" ) echo "mode 1024 768 32" >/boot/home/config/settings/kernel/drivers/vesa ;; "1280x1024" ) echo "mode 1280 1024 32" >/boot/home/config/settings/kernel/drivers/vesa ;; "1600x1200" ) echo "mode 1600 1200 32" >/boot/home/config/settings/kernel/drivers/vesa ;; esac #shutdown これの$Resを得たいんだが、パイプで取得できないのかと思ってのですが。
872 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 00:04:03 ] できないからファイルに入れてるってことでしょ。 ただ、 Res=`alert ...` とすりゃいいのにとは思う。
873 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 00:25:29 ] >>872 Res=`alert --info ・・・・`でいきます。 Res= `じゃダメなのか、なるほど。
874 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 06:03:17 ] bashで乱数を用いてで数値3桁(000〜999)を表示させるにはどうしたらいいでしょうか? hoge=`${RANDOM} | cut -c 2-4 ` echo $hoge としてるんですがこれだと表示が2桁や1桁のときに桁数が揃わなくて困っております。
875 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:33:30 ] pりんtf
876 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:39:08 ] ”パーセントさんエスバックスラシュn” $ほげ
877 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:46:34 ] あっ、間違った、>>875 ,876は忘れてくれ。
878 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:51:46 ] あってんじゃん。 printf "%03d\n" $hoge
879 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:32:18 ] おっ、惜しかった、0が必要なんですね。勉強になった。
880 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:39:35 ] 質問した本人はどこに消えたんだろう?
881 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:08:31 ] /dev/nullの闇に呑まれたのだった・・・
882 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:26:59 ] 歓呼工面でなかってよかったのう。
883 名前:デフォルトの名無しさん [2008/05/22(木) 20:42:02 ] 今、プロセス監視ツールについて調べてまして プロセスに常駐するシェルを作りたいと思ってます。 ps -ef | grep sh を実行して、常時起動しているシェルというのは、 どうやって書けばいいのでしょうか。 また、この際に表示されるPIDは、常時同じ値にしたいと思ってます。 アドバイスお願いいたします。
884 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:58:01 ] シェルをつくるのですか。 jubilo.cis.ibaraki.ac.jp/~isemba/PROGRAM/CPROG/611.pdf ここいら辺を参考に頑張ってください。
885 名前:デフォルトの名無しさん [2008/05/22(木) 21:24:52 ] すみません。プロセスが常駐するシェルスクリプトを 作りたいのです。
886 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:33:17 ] #!/bin/sh while :; do :; done
887 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:43:42 ] OSによってはwatchというコマンドがあるかもしれない。 watch ps -ef なければ>>886 のdoの中身の:をps -ef ; sleep 10とかにすればいいんじゃね。
888 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:05:10 ] >>886-887 ありがとうございます 今すぐ試せないんですが、Watchやってみます。 sleepはやってみたんですが、シェルスクリプトが プロセスとして残るのではなく、sleepコマンド自体の プロセスとして残ってしまいました。 >>886 は無限ループというのは分かるんですが、 負荷が上昇したりしないでしょうか。
889 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:18:08 ] sleepは当然残るけど、親プロセスであるshも残ってないか?
890 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:24:06 ] #!/bin/sh kill -19 $$
891 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:36:54 ] >>889 それが残らなかったんです。linuxなんですが・・・。 ディストリビューションは多分centosです。 SOLARISはshが出てたんですが・・
892 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:46:28 ] つか、常駐して、何させたいのよ
893 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:11:31 ] プロセス監視ツールの検証をしたいんです
894 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:36:36 ] シェルスクリプトは監視される側? 多少負荷あがっても無駄にループしてりゃいいじゃん 気になるなら、: を sleep 1 にでも変えて
895 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:37:20 ] DOSのTSRみたいなのを作りたいってことかと思ったら違うのか。 もしかしてcronで定期実行させる方が目的にかなってたりしないか?
896 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:39:00 ] sleepしている間に食うリソースってプロセステーブル1エントリと、 コードが常駐する分のメモリ?
897 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:46:18 ] あと標準入出力&エラー出力のファイルデスクリプタとPTYのマスター&スレイブ (閉じてなければだが)
898 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:54:29 ] >>895 私もそう(TSR)思ってた上で冗談のつもりで>>890 を書いたんだが実はそういうのが欲しかったとは。 だまされた気分だぜ。
899 名前:デフォルトの名無しさん [2008/05/24(土) 01:44:25 ] エロイ人教えて $1が a b $2が c d 出力結果 a c a d b c b d どうやるの?
900 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 03:42:38 ] >>899 まず出力結果に至るルールを書かんかい 求めたいものが直積とは限らんからな
901 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 07:53:29 ] A="a b" B="c d" for a in $A; do for b in $B; do echo $a $b; done; done
902 名前:899 [2008/05/24(土) 12:08:55 ] >>900 やりたいことは"シェルをテストする"ためのシェルを考えてる。 テストしたいシェルに引数を与えて出力結果を別ファイルに出力する。 シェルはkシェル。 OK? >>901 サンク あと、引数にスペース(空白)も含めたいんだけど A=a b スペース(空白) A=c d スペース(空白) 出力結果 a c a d a b c b d b c d よろしくです
903 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 12:14:32 ] A="a:b::" B="c:d::" OLDIFS=$IFS IFS=: for a in $A; do for b in $B; do echo $a $b; done; done IFS=$OLDIFS 頭に蛆でもわいてるのか
904 名前:899 [2008/05/24(土) 12:37:21 ] >>903 おぉーはぇー サンク! おめ〜口は悪いけど面倒見の良いエロイ椰子だな ありがと!
905 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 07:32:25 ] scriptの中から呼び出されたprogramの処理が終了していることを 知るにはどうしたらいいですか?
906 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 08:09:45 ] kill -0 $! && echo alive
907 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 08:55:38 ] thx!
908 名前:デフォルトの名無しさん [2008/05/25(日) 23:52:01 ] root以外で動かすスプリクト内で特定のファイルをchownで所有者を 変更したいんだけsudoもexpectも使わずにできる?
909 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:07:45 ] Linuxのようにスクリプトのsetuidを無視する環境なら、 スクリプトを呼ぶだけの実行ファイルを作ってそっちをsetuidする。
910 名前:デフォルトの名無しさん [2008/05/29(木) 23:13:02 ] tarファイル内のデレクトリとかファイルをリネームできる? あるいはリネームしながら展開できる?
911 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:05:16 ] >>910 スレ違い。アーカイバ関連のスレで訊くべし
912 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:17:12 ] この板的には、tarのフォーマットを調べて、 リネームするツールを作ろうという趣旨かも。 しかしスレ違いか。
913 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:42:54 ] 特定の名前対応付けファイルにしたがって、 一旦目的のファイル/ディレクトリを展開して mvで目的の場所にリネーム移動させるものを つくるというスクリプトならかろうじて・・・ そこまでの意図はないと思うが。
914 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:51:43 ] ヘッダー情報だけ書き換えて展開は本物のtarにやらせれば良い。 前の勤務先で作ったときは50行(perl)くらいで出来たような気がする。
915 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 20:04:48 ] 文字列中のスペースをエスケープシーケンス付けて"\ "に変換する スクリプトを作りたいのですが、どうしたら良いでしょう? sed を使うと連続スペースを 1つのスペースとして扱われてしまい上手く行きません。 "sample sample"(スペース2以上) っていう文字列を "sample\ \ sample"にしたい。
916 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:28:33 ] ~$ echo "sample sample" | sed -e 's/ /\\ /g' sample\ \ sample
917 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:44:45 ] >916 あれ、それで行きます?ってか家のCygwin上でも出来てるな これでも出来なくて、2〜3時間いろいろ試して、うんうん唸ってたんですが、 バージョンや処理系で動作がちがうとかないですよね・・・ 月曜にリトライします。なんか馬鹿やったかな?
918 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:51:54 ] >>917 gが付いてなかったんじゃないのか?
919 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 23:25:04 ] いや、そういうのではなく、記憶が確かなら echo "sample sample" | sed -e 's/ /:/g' (sampleの間は連続半角スペースね) ってやったら、 "sample:sample" スペースを一つとして扱われた みたいな結果しか帰ってこなかったんだけど。 何かを間違えたんだろうね多分。なにを間違えたやら。
920 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:59:01 ] ubuntu@ubuntu-desktop:~$ echo "sample sample" | sed -e 's/ */:/g' sample:sample
921 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 03:01:29 ] 勘違いす。>>920 は消去。
922 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 03:30:54 ] #!/usr/bin/fontforge 仲間に入れてもらえますか?
923 名前:デフォルトの名無しさん [2008/06/04(水) 22:42:10 ] 相談に乗ってちゃぶ台! 任意のディレクトリ下の全てのファイルの更新日時を フルパスで1行づつ取得したい。また更新日時をyyyymmdddHHMMSSで 取得したい。 例) /home/usr01/aaa/bbb.txt 20080101125525 /home/usr01/aaa/ccc.tar 20080123195530 /home/usr02/ddd.txt 20070811210121 /home/usr03/eee/fff/ggg/hhh/jjj.cfg 20060301042133 よろしくお願いします、みなさん
924 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:14:40 ] 簡単すぐるからパス
925 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:59:00 ] OSによっては簡単すぐるけど、一般にはそうでもないし、perlが最適だったりもする >>923 OSを明かした方が適切な回答があるかもよ
926 名前:デフォルトの名無しさん [2008/06/05(木) 00:09:17 ] > 924,925 レス、さんく とりあえず find でフルパスは取得できよ。 あと、タイムスタンプなんだよね。 OSはAIXでkshでつ
927 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:22:49 ] AIXは、statもないし、lsに-Tもないんじゃないかな。 テキストファイルだけなら diff -c で /dev/null と比較して、 先頭の行を加工すれば何とか取得できるかもしれない。 けど、perl をすすめる。
928 名前:デフォルトの名無しさん [2008/06/05(木) 01:39:28 ] >927 ありがと よく似たコマンドでistatってのがあったけど 月表示が英語なのよ・・・ $ istat bbb デバイス 10/8 上の Inode 89 ファイル 保護 : rw-r--r-- 所有者 : 8(*****) グループ : 0(system) リンク・カウント : 1 長さ 4 バイト 最後の更新: Thu Jun 5 01:35:24 JST 2008 最後の修正: Thu Jun 5 01:35:24 JST 2008 最後のアクセス: Thu Jun 5 01:35:24 JST 2008
929 名前:デフォルトの名無しさん [2008/06/05(木) 02:12:17 ] ひとつ教えてください。 ファイルからデータを収集して txtファイルに出力するようなシェルを作成しているのですが 整形がうまくいきません。 touch test.txt echo "ABCDEF 1_0_2_3" >> test.txt echo "LMN 3_2_4_5" >> test.txt 当然中身は ABCDEF 1_0_2_3 LMN 3_2_4_5 となるんですが ABCDEF 1_0_2_3 LMN 3_2_4_5 としたいんです。 何かいい方法ありませんか? tabのような整形方法を考えたんですがうまく揃わないので 文字数指定する方法あれば教えていただきたいんですが。。。 (C言語のprint文での %10s のようなのができれば理想ですが)
930 名前:デフォルトの名無しさん [2008/06/05(木) 02:12:56 ] ずれーたorz 番号のところが揃うようにしたいです。 ご教授ください。
931 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:14:20 ] なら、12種類しかないんだから、caseで分岐して、 一致した月の数字を返すっていう関数書けばいいんじゃ?
932 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:20:01 ] >>929 OSによっては、まさにprintfがあるけどな。
933 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:24:10 ] # echo "ABCDEF 1_0_2_3" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" > test.txt # echo "LMN 3_2_4_5" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" >> test.txt # cat test.txt ABCDEF 1_0_2_3 LMN 3_2_4_5
934 名前:デフォルトの名無しさん [2008/06/05(木) 02:24:20 ] ファイルの比較するシェルを作りたいのですが、 うまくいきません。 file_list.txt -- 内容 -- ABC DEF GHI このファイルとフォルダ内の内容が一致するかチェックしたいのですが 何かいい方法ありませんか? ls -Rをtxtファイルに吐き出してcmpを使う方法と read line使った後ls -Rとgrepをつかって比較する方法を思いついたのですが、 もっと綺麗な方法ってあるでしょうか?
935 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:25:25 ] busyboxにprintfあったよ・・・・・orz
936 名前:デフォルトの名無しさん [2008/06/05(木) 02:28:49 ] >>932 マジですかorz 調べたりなさ杉。ありがとうございます。 >>933 今現在確認できないので研究室についたら試してみます ありがとうございました。
937 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:35:12 ] おまえら、いいかがんシェルを作るな。シェルスクリプトを作れ。
938 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 04:38:56 ] Cに似たシェルスクリプト言語ってある?
939 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:29:08 ] cshでスクリプトは書くな
940 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:41:31 ] 外部コマンド呼ぶのにいちいちsystem()とか、それさえなくて fork()とexecve()を駆使しなきゃいけないようなスクリプト言語だとしたら、 かなりいや。
941 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:05:21 ] while read Filenm do if [ -e $Filenm ] ; then echo $Filenm" ○" else echo $Filenm" ×" fi done <file_list.txt
942 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:45:57 ] cat file_list.txt | group { Test-Path $_ }
943 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 09:47:16 ] >>940 どうして?
944 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 19:28:20 ] インタープリタ言語はスレ違いでしたね スレタイがシェルスクリプトだもんな すっかり勘違いしてた
945 名前:デフォルトの名無しさん [2008/06/07(土) 18:48:20 ] cpioのマルチボリューム保存で1本目が終わると 2本目の前にデバイス名の入力を施すメッセージが表示されます。 その際、そのメッセージ(多分、標準エラー出力)を表示させないで 自前の処理で「2本目の保存を行いますか?(y/n)」みたいに行いたいのです。 標準エラー出力をどう扱うかが肝だと思うのですが、良いアイデアが浮かびません。 何か良いヒントはありませんでしょうか?(Bシェル(OS:Solaris))
946 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:35:53 ] つ expect
947 名前:デフォルトの名無しさん [2008/06/16(月) 11:34:15 ] #!/bin/csh -f set s=$1 set t=$2 set f=$3 cat $f | tail +$s | head -$t exit 0 echo ------------------ 以上を改良しろ、と言われました。みなさんならどうしますか?教えて下さい。
948 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 11:47:55 ] #!/bin/csh -f tail +$1 $3 | head -$2
949 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:01:05 ] rm -f /bin/csh
950 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:49:14 ] >>949 Permission denied
951 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:14:52 ] 以下のスクリプトで echo をした時に AAAeo kakikukeko sasisuseso AAAituteto naninuneno hahihuheho と表示されるのですが どうすれば tatituteto naninuneno hahihuhehoAAA と表示できるのでしょう? 環境は実行シェルはbashです FUGA="'AAA'" awk '{print;}' hoge.txt | while read LINE; do MOGE=`echo "$LINE" | cut -d , -f 2-` echo "$MOGE""$FUGA" done hoge.txt a,aiueo kakikukeko sasisuseso b,tatituteto naninuneno hahihuheho
952 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:55:37 ] >>951 やりたいことが判らん。awkを使う理由が判らん。手元で再現できん。 つーか、折角awkを使うならawk -F, '{print $2 "AAA";}'じゃいかんの?
953 名前:951 mailto:sage [2008/06/16(月) 15:09:30 ] >>952 レスありがとうございます やりたい事としては ファイルから1行読み込んで1行をパースし FUGAと連結した文字列を別のコマンドを実行させたい です 1行の内容としては aaaaa,hogehoge mogemoge aiueo という風に書きましたが実際には aaaa,SQL文 という感じで半角スペースやカンマが入ります
954 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:16:15 ] >>953 他人の話をよく聞きなさいって言われたことないか? >952をよく読んで、為すべきことを為してから出直せ。 それから、自分の書いた文章を読み返す癖をつけた方がいい。 とてもじゃないが、他人に読んでもらう文章になっていないぞ。
955 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:48:40 ] >>954 >>952 に書いてある内容は理解しています MOGE=`echo "$LINE" | cut -d , -f 2-` の代わりとなる部分だと言うことは解っているのですが >>953 にも書いてある通りカンマ等が入ってしまう為記述が簡単な MOGE=`echo "$LINE" | cut -d , -f 2-` を選びました 951にカンマ等が複数入る可能性があるという事を 書かなかったのはすみませんでした
956 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:11:07 ] cut -d',' -f2-
957 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:18:10 ] ~> L="123,uio poi" ~> LB=`echo $L | cut -d',' -f2-` ~> echo $LB uio poi ~>
958 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:05:34 ] 違ったか・・・
959 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:03:53 ] tr -d '\015' < hoge.txt | awk ...
960 名前:デフォルトの名無しさん [2008/06/17(火) 11:26:10 ] #!/bin/csh -f set com=$0 if ($#argv < 1 || $#argv > 3) then echo Usage:$com start_line total_lines '[file_name]' exit 1 endif if ($#argv == 2) then set s=$1 set t=$2 tail +$s | head -$t else set s=$1 set t=$2 set f=$3 cat $f | tail +$s | head -$t endif exit 0 echo ------------------ これだとエラーがでます。どなたか改良してください。お願いします。
961 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 11:27:38 ] 酷いマルチ
962 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:28:46 ] bashで while read LINE; do echo $LINE done < ファイル とするとファイルに含まれてるタブ文字が 半角スペースに変換されて表示されるのですが そのまま取り出したい場合どうすればいいのでしょう? cat ファイル | whileやfor LINE in `cat ファイル`等はやってみました
963 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:57:10 ] echo "$LINE"
964 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 14:05:16 ] >>963 うまくいきました ありがとう そんな単純な事に気づかなかったとはorz
965 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:30:18 ] KORNシェルの質問です。よろしくお願いします。 テキストファイル id=tanaka age=25 id=takahashi age=2 id=suzuki age=44 を id age --------------------- id=tanaka age=25 id=takahashi age=2 id=suzuki age=44 にしたい(体裁を整えたい)です。$@を使ってできますか? 変数wkにabc=e があったとして、=があるかどうかわかりますか? grepやcutコマンドは変数を対象に使えませんよね・・?
966 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:42:13 ] 訂正です。体裁が整ってない。 idなら10文字以下でもスペースで10文字にして(これはtypedef使いました) =の前を見出しに出力して、=の後を----の下に書きたいんです。 id age --------------------- tanaka 25 takahashi 2 suzuki 44 よろしくお願いします
967 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:25:03 ] IFS="=$IFS" FIRST=t while read line do set -- $line if [ "$FIRST" ] then printf "%-10s %s\n" "$1" "$3" echo "---------------------" FIRST= fi printf "%-10s %2d\n" "$2" "$4" done
968 名前:デフォルトの名無しさん [2008/06/30(月) 23:38:57 ] >>967 san 有難うございます!今試せないので明日、速攻でやってみます!
969 名前:デフォルトの名無しさん [2008/07/04(金) 23:36:23 ] 質問させてください。 diffの結果を見易く整形するツール等はありますでしょうか。 環境はCENTOSです。よろしくお願いします。
970 名前:969 mailto:sage [2008/07/04(金) 23:37:57 ] すいません。追記します。 シェルスクリプト内で使いたいので、 ツールでもコマンド的なものだとありがたいです。
971 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 00:17:24 ] diff -u
972 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 00:19:45 ] >>969 > diffの結果を見易く整形 kwsk
973 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 01:23:42 ] >972 このファイルだけサイズが違いますよとか このファイルはこっちにありませんよとかが希望です。 ls -Rlaの結果をファイルにリダイレクトしてます
974 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 07:42:01 ] ファイルの差分はいらないのね find dirA -exec wc -c {}; > /tmp/A find dirB -exec wc -c {}; > /tmp/B diff /tmp/A /tmp/B あるいは単純に diff -r --brief dirA dirB 2>&1
975 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 14:20:19 ] 私はこんなスクリプト作ってる。 -- #!/bin/sh -f DIFF="/bin/diff -u" lsd() { find $1 -type f -ls | awk '{printf("%10d %s %2s %5s %s\n", $7, $8, $9, $10, $11);}' | sort +4 } lsd $1 | sed -e "s- $1- $2-" > /tmp/$$ lsd $2 | $DIFF /tmp/$$ - rm /tmp/$$ -- これで一応ファイルサイズとタイムスタンプも比較できる。
976 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:59:08 ] >>975 ・空白のあるファイル名の扱い ・日付の出力形式の仮定 に問題。