1 名前:名無しさん@お腹いっぱい。 [2008/05/20(火) 20:58:04 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6 くらい)をご覧ください。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 シェルスクリプト総合 その10 pc11.2ch.net/test/read.cgi/unix/1202725267/
241 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 01:23:10 ] >>239 解説するのも野暮だが… >>230 ,>>232 はスペースが2個あることに気付かず醜態を晒してしまったわけだが、 >>235 のように書いておけば見落とし確率が下がって嬉しいという記法。
242 名前:239 mailto:sage [2008/06/06(金) 01:37:14 ] >>240 >>241 すまん shなんだけどlinux(fedora8) じゃだめなんかな? sh-3.2$ echo 'aaaaaa bbbbbbb ccc' | sed 's/[][]*/,/g' ,a,a,a,a,a,a, , , , , , , , , , , , , , ,b,b,b,b,b,b,b, , , , , , ,c,c,c, sh-3.2$
243 名前:239 mailto:sage [2008/06/06(金) 01:39:25 ] 自己解決 []じゃなくえ[ ]だったわ あほだおれ
244 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 04:51:10 ] あの夜、俺は初めて彼女とMMXした。 「もうそろそろiiyama? 君のI/ODATAを確かめたいんだ。XT」 MITSUMIあうと、彼女のMECはALBATRONとしていた。 緊張した俺は焦り彼女のソケット478をAOpenしようとした。 「ちょ、ちょっとRADEON!何をSis」もう俺は既にエレコム。 Sound Blasterのホックを外すとはちきれそうなPioneerがBarracuda でもBIOSTARは意外と玄人志向だった。 「恥ずかしいわ。あまりミネベア・・・」 SCSIをTORICAるとKEIANをSOLTEKした痕がアルファデータ。 あそこはSUPERMICROだった。OMEGAドライバも少し鼻についた。 しかし、彼女のCREATIVEを刺激しつつ俺のセレロンを 彼女のSerial-ATAからASUSに這わせると、「FireWire〜ン」 「もう、ATI」「COREGA欲しいんだろ?」「早くリテール」 俺は激しくTSUKUMO。「インテルはいってるっ!IEEE!1394!」 「あぁ・・・もうDell!」
245 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 06:19:56 ] OFSのあるawkなら、 awk 'BEGIN { OFS=","} { $1 = $1; print $0 }'
246 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 06:32:12 ] >>241 見落としたのじゃなくて、本当に(HTML解釈上で)複数のスペースが 1個のスペースで表示されてしまうから、「>>228 >>234 をコピペしても動かない」が正解。 >>235 のように書き込めば、コピペしてもちゃんと動く。 醜態を晒したのは >>228 >>234 の方。 ちなみに、宣ブラ使ってもやっぱり >>228 >>234 のスペースはひとつだよ。
247 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:07:53 ] ダサい専ブラ
248 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:20:28 ] たしかにダサい専ブラだな。
249 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:31:46 ] ブラウザ依存も、Bash依存同罪。 ポータビリティ考えて書き込めよ。
250 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:41:33 ] いつのまにか落ちてたので、立てました。 zsh その5 pc11.2ch.net/test/read.cgi/unix/1212677877/
251 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:45:33 ] sed -r 's/ +/,/g' の方が良くね?
252 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:49:28 ] どこのsedだよ
253 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:50:10 ] /bin/sed
254 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 08:51:37 ] $ type sed sed is a shell builtin
255 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 09:02:22 ] 大半のシステムで使用できる sed -r を避けて可読性を劣化させる必要は無い。 このスレに巣食っている原理主義者以外は >>251 使うのが正解。
256 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 09:20:12 ] 自分が読めない = 可読性が低い
257 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 10:01:25 ] sed 's/ */,/g' これなら文句はねえよな?
258 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 10:09:26 ] >>257 >>228 と同じじゃん。 文句あるみたいよ。
259 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 10:11:21 ] >>258 >>228 とは違う。こっちはちゃんと を使ってるんだが まだ空白がつながって見えるかな? ナマの空白をつなげたら、HTML仕様的にはくっつくのが当たり前だよ
260 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 11:49:01 ] >>226 tr -s ' ' , でいけないか。
261 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/06(金) 20:02:12 ] sed 's/ * /,/g'
262 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/07(土) 10:18:23 ] >>254 いいな
263 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/08(日) 02:28:12 ] 結婚を考えていた彼女が処女じゃなかったんです7 1 :最強の負け組み:2008/03/01(土) 05:37:53 ID:YrfLoASe ショックでした。 もしやもしやと思っていたのですが 面と向かって告白された時は目の前が真っ暗になりました。 「処女とかそんなの関係ない!」 そう自分に言い聞かせてきましたが、やはり限界がきてしまい 彼女に別れを告げました。 知り合いに言うと 「は?そんなくっだらない事であんないい子と別れたの? ばっかじゃね?もうあんな子絶対知り合えないぞ?」 とボロかすに言われました。 頭では判っているのに心で理解できないんです。 私自身、もう頭の中がぐちゃぐちゃで訳がわかりません。 彼女を傷つけてしまったのでしょうか? 別れの時、彼女は黙って頷き 「じゃあね」 と笑って去っていきました。 もう私には彼女の気持ちがどうなのか あの微笑がなんだったのか理解できないのです。 やはり私は馬鹿な事をしたのでしょうか?
264 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/08(日) 05:17:54 ] >>263 echo じゃあね : -P exit
265 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 01:04:38 ] ふともも画像が100〜400x810pxくらいのサイズであったとします。 横幅が1440pxを超えないように画像を結合するスクリプトを書きたいのです。 結合する画像の組み合わせは特別に指定しません。 横幅が1440以下でかつなるべく大きければ何でもいいです。 たとえば、画像は40枚とします。 1.jpg 300x810 2.jpg 300x810 3.jpg 300x810 4.jpg 300x810 5.jpg 300x810 6.jpg 300x810 ************** 40.jpg 200x810 だとしたら、1,2,3,4 を結合させて image1.jpg (1200x810px)を作ります。 それ以降も同様なことを繰り返します。 お願いします。
266 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 01:23:06 ] ふともも画像について詳しく
267 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 01:51:05 ] うん、画像のふとももが実際どうなのかによって対処法も違うよね。
268 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 05:26:55 ] おまいら少しは協力してやれよw で、画像の件なんだがね。。。
269 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 10:51:46 ] 画像のサンプルがないことにはどうにもならん。
270 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 11:56:21 ] >>265 いわゆるナップサック問題なので、最適解を求めるのはシェルスクリプトには荷が重い。
271 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 12:23:52 ] >>270 最適解じゃなくていいから、指定サイズ以下に並べられる シェルを書いてうpしてください。
272 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 13:08:20 ] 最適じゃなくていいなら 頭から順にならべて1440を越えたら次に行けばいいだけじゃん。
273 名前:265 mailto:sage [2008/06/09(月) 13:08:54 ] サンプル画像です。 素材に対する文句はいっさい受け付けません。 home2.dip.jp/upload100_download.php?no=28514 mai 最近大量に脚画像つくったのがこれしかなかったので。 >>270 そうですか。 でも、しばらく回答を待ちます。 >>271 脚画像をならべるスクリプトは需要があるようですね。
274 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 14:02:24 ] >>272 2次元だから、最適じゃなくても単純にはいかないだろ。
275 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 22:31:54 ] ここは楽しい モーレツインターネッツ教室でつね ワッフルワッフル
276 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 22:41:50 ] X軸方向に複数画像並べるだけで、Y軸方向には画像は並べない(1枚だけ)という仕様なの?
277 名前:265 mailto:sage [2008/06/09(月) 22:49:54 ] >>276 そうです。
278 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 22:56:48 ] 条件後出し乙。 だったら質問するまでもない簡単な問題じゃん。 アフォらしいから回答するの辞めた。
279 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/09(月) 23:14:13 ] 便乗質問します。 X座標のドット数も、Y座標のドット数も可変の画像ファイルが複数あります。 これを、引数指定のX/Y座標の画面サイズに収まるように、 なるべく多く、なるべくすき間なく画像を並べるようなシェルを発光してください。 なお、実際の画像結合処理は別コマンドにやらせるので、 入力としては、各画像ファイルのファイル名とX/Yサイズが書かれたテキストファイルの $ cat input.txt 1.jpg 300 200 2.jpg 530 250 3.jpg 410 180 4.jpg 640 480 を入力として、 $ hoge input.txt 1200 1280 とやると、 出力として、 1.jpg 0 0 2.jpg 300 0 3.jpg 0 300 : みたいに、画像を配置するべき座標を画像の左上のオフセットで指定して 出力できればいいです。 最適配置にする必要はありませんが、当たり判定はちゃんとやって、 画像が重ならないようにしてください。
280 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 00:02:57 ] いつからここは エロ画像処理スレッドになったんでしょうか。
281 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 00:04:47 ] しかも画像も貼らずに質問とは。
282 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 01:46:24 ] ImageMagick で一発?
283 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 14:18:30 ] シェルスクリプトでやる意味があるのか分からない。 ってのは禁句でしたかな。
284 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 19:31:40 ] >>283 ぶっちゃけシェルスクリプトの最大の利点は手軽さなので、 わざわざ人に1から10まで聞くという手間をかけてまでシェルスクリプトでやる理由はないな。
285 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 19:42:03 ] 普段からシェルを使い慣れてないならあえて選ぶ意味はないような.
286 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:32:49 ] じゃなくて、人に聞いてるんじゃなくて、オマエラに「お題」を出してるんだよ。 シェルで発光する方法を考えて、おおいに盛り上がってくれ。
287 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:36:09 ] はい次の質問どぞ
288 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:37:08 ] シェルで発光する方法まだーーーー???
289 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/10(火) 21:46:34 ] >>288 はいよLinuxオンリーだが setleds +num +caps +scroll で発光できる
290 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 09:37:20 ] お疲れさまでした。 では、次の課題です。 シェルで発酵する方法について考えましょう。
291 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 10:01:50 ] ところで「シェルを発行する」っていうのはなにか決まった言いまわしなのか? 普通はこんな言いかたしないと思うんだけどこのスレではよく見る気がする
292 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 10:12:17 ] pc11.2ch.net/test/read.cgi/unix/1202725267/860 のネタからでしょ
293 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 10:29:40 ] >>292 それのさらなる元ネタはあるんだろうか
294 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 11:15:26 ] >>293 ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86
295 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 12:11:11 ] issue とか perse とか英語でも色んな言い方するよねえ
296 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/12(木) 12:17:40 ] >>293 pc11.2ch.net/test/read.cgi/unix/1187130302/312
297 名前:名無しさん@お腹いっぱい。 [2008/06/14(土) 08:48:18 ] 引数指定のディレクトリを頂点として、それ以下のサブディレクトリを含む ディレクトリツリー中のシンボリックリンクを探し、 そのシンボリックリンクそれぞれについて、 冒頭のディレクトリツリー内を指しているか、 それとも、ディレクトリツリーの外を指しているのかを 判断するシェルを発行してください。 なお、シンボリックリンクの先に実際にファイルがない場合もありますが、 実際にファイルがあるかどうかに関係なく、あくまでシンボリックリンクの 内容のPATHだけで判断してください。 (ブロークンリンクだからといって外部と判断してはいけないということ) 以上、お願いします。
298 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 09:03:06 ] 作ったシェルスクリプトを僕のPC上で発行しました どうぞ
299 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 16:32:04 ] ここってさ、人にシェルスクリプト書いてもらうスレだったっけ?
300 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 16:35:34 ] >>299 >>1 >スクリプトのお勉強・自慢・腕試しなどにどうぞ。 だそうなので、腕試しのお題を出しているんじゃない?
301 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 18:40:09 ] できないなら黙ってろの人最近来ないね。
302 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 18:50:22 ] >>298-299 わからないなら黙ってろ。
303 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:00:44 ] >>301 召喚士現る。
304 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:02:21 ] >>301 君、腕良いね
305 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:05:04 ] お題としてはなかなかいいんじゃない? symlink読んでリンク先のフルパスに変換する関数を書くあたりがキモかな。
306 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:09:49 ] >>305 わからないなら黙ってろ
307 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 19:48:53 ] $RANDOM って癖があるのは仕様なんすか? 俺の環境でecho $((RANDOM*10/32768))を 出力させ続けると0と8がやたら多いw なんかハードウェアのノイズを拾って数値化してるとか いうのは読んだことあるけど。。。(実装によるとは思うけど) これってもうしょうがないんすかね? 立派なアルゴリズムをもった乱数生成器とまでは いかないものの、そこそこ精度が高い(?)乱数を シェルコマンドで作るってできないすかね??
308 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 20:06:23 ] >>307 >>90
309 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 20:11:25 ] /dev/*はOS依存なので、 メルセンヌツイスターあたりをシェルスクリプトで実装する方向で。
310 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 20:26:02 ] /dev/urandomはOS依存じゃないだろ。
311 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/14(土) 23:12:06 ] >>297 ちょっと考えると簡単なようで、実はすごく難しいんじゃないかと思う。 find(1) + readlink(1) を使って基本的な判定はできる。 んが、ディレクトリへのリンクがあったり、意図的に難解なリンクが 作成されてたりすると非常に厄介じゃね? 具体的には、 ../../../usr/local/../local/etc みたいなのとか。このぐらいなら、 dirname(1) + cd + pwd(1) でまだ何とかなりそう。 じゃあ今度は、 /usr/local -> /var/local という(変な)環境で、 /usr/local/etc/a.conf -> ../etc/b.conf とかなっちゃってると、 /usr/local/etc 内にあるようで実は /var/local/etc にあるということになる。 漏れのオツムじゃ解はよくわかんね。パス正規化ツールみたいなのあると 面白いかもね。
312 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/15(日) 00:44:25 ] シェルを発行だとか純正シェルだとか、 このスレは読んでて正直気恥かしくなる
313 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/15(日) 00:46:06 ] >>312 わからないなら黙ってろ
314 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/15(日) 00:57:49 ] >>312 もしかしてここがネタスレだと分かってなかったのか?
315 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/16(月) 22:34:33 ] まあ叩き台ってことで、こんな感じ? #!/bin/sh base="`readlink -f $1`" find $base -type l -print | while read i do echo "`readlink -f $i` $i" done | grep ^$base
316 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 01:43:42 ] なんかシェルでゲーム作りたいんだけど 画面のクリアとかってどうやればいいの?
317 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 02:26:15 ] clear
318 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 10:07:08 ] realpathは使わないの?
319 名前:名無しさん@お腹いっぱい。 [2008/06/17(火) 10:25:04 ] #!/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 ------------------ これだとエラーがでます。どなたか改良してください。お願いします。
320 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 10:35:51 ] >>319 以降はこちらへ ↓ csh初心者質問コーナー pc11.2ch.net/test/read.cgi/unix/1094041299/
321 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 16:55:34 ] >>310 Solaris8 は標準では /dev/u?random はなかったはず。 Sun がパッチを配ってたので事実上あるような扱いだったけど。 Sol7 だとそれもなくて、フリーのデバドラをインストールしてた。
322 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/17(火) 16:58:56 ] すでにEOLですからw
323 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 21:24:15 ] カンマ区切りcsvからhogeというカラムとその右4カラムを切り出したい ただしhogeが何カラム目にあるかは不定 というのはちょちょいとできないですか?
324 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 21:33:07 ] フルスペックのcsvをシェルスクリプトで扱うのは荷が重い ちょちょいでは無理
325 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 21:36:17 ] >>323 こういうことか? ↓ #!/bin/sh IFS=, while read line; do set $line while [ $# -gt 0 ]; do if [ "$1" = hoge ]; then echo "$1","$2","$3","$4","$5" break fi shift done done
326 名前:名無しさん@お腹いっぱい。 [2008/06/23(月) 22:09:52 ] 「,」を含む文字列で発狂するから駄目。
327 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 22:53:43 ] ""ん中に改行まで入ることあるしな
328 名前:323 mailto:sage [2008/06/23(月) 22:57:51 ] >>325 おお完璧です どうもありがとうございます。 IFSってawkの変数かと思ってましたけど、shでも同じなんですね sh-3.2$ cat a.csv ,,,,,hoge,,1,11,3,3nd ,,,,,,,,,,,,,,,,,,,,,,,,,,,,hoge,,1,11,3,3nd ,,,,,1,fds,3,hnd ,g b,,,,,,hoge,,1,11,3 a ,,,,,,,,,,hoge,,1,13,d sh-3.2$ cat a.csv | ./kkkk hoge,,1,11,3 hoge,,1,11,3 hoge,,1,11,3 hoge,,1,13,d sh-3.2$
329 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/23(月) 23:00:57 ] 質問者が「おお完璧です」と言った後の >>326-327 が不憫。
330 名前:323 mailto:sage [2008/06/23(月) 23:02:39 ] >>326 >>327 さすがにそんなに意地悪な仕様ではないんで問題なしです。 欲を言うならシェルを作らず手で打てるレベルのものがいいなぁ・・というくらいです。
331 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 11:26:40 ] シェルってゆうな。クズ。
332 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 11:46:49 ] >>331 よう、久しぶりw 相変わらず怒ってんなあwww
333 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 15:07:43 ] ゆうって言うな。クズ。
334 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 15:11:50 ] シェルで発酵する方法まだーーーーーーーーーーー??????
335 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/24(火) 15:28:14 ] CPUヒートシンクの上に、藁に包んだ大豆を載せ while :;do :;done
336 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 07:27:59 ] FAN止めないと乾燥するな
337 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 07:35:42 ] 水冷にすればいいんじゃね?
338 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:45:53 ] hoge1.txt に日付のテキストが数百行あります。 ---------------------- $ cat hoge1.txt Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 ---------------------- フォーマットを下記のように年月日のみに変えて hoge2.txt に書き出すシェルスクリプトを作りたいのです。 ---------------------- 2008.5.16 2008.5.18 2008.6.2 ---------------------- sed や awk を使うのか?ということまではわかってきたのですが、初心者なもので詰まってしまっています。どなたか ご教示お願いいたします。
339 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:50:21 ] ここでGNU date でやり方書くやつがでて、 Linux厨乙!的な流れですね、わかります。
340 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:51:01 ] GNU dateがあるとして、 while read x; do date --date="$x" '+%Y.%-m.%-d' done < hoge1.txt
341 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 11:51:34 ] Linux厨乙!
342 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:20:32 ] × …hoge2.txt に書き出すシェルスクリプトを作りたいのです。 ○ …hoge2.txt に書き出すシェルを発行したいのです。
343 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:21:46 ] BEGIN{ m["Jan"] = 1 m["Feb"] = 2 ... m["Dec"] = 12 OFS = "." } { print $4, m[$3], $2+0 }
344 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:27:11 ] >>343 それ間違ってるよ。動作確認してから書くこと。
345 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:47:44 ] はて、うちの手元では動いてるけど、環境依存な部分あるかな?
346 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:48:19 ] Mon,
347 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:51:31 ] >>344 うちでも動いてる。 >>346 Mon, は関係ないだろ
348 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 12:52:40 ] 月の名前と曜日の名前の区別がつかないんですね、わかります
349 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:02:27 ] で、そろそろ純正シェルでの解法を誰かが投稿する時間だな
350 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:08:17 ] >>338 本当に日付は >>338 のフォーマットしかないと限定していいの? だったら >>343 でも動くだろうけど、 中には、 Mon Jun 2 08:15:45 JST 2008 みたいな行もあるという仕様じゃないの? だったら、 (今のところ) >>340 が正解。
351 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:09:45 ] ずいぶん勝手な解釈だな。
352 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:11:05 ] #!/bin/sh month() { case "$1" in May) echo 5;; Jun) echo 6;; esac } cat <<END | Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 END while read line do set -- $line echo $4.`month $3`.$2 done
353 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:13:38 ] ああ echo $4.`month $3`.`expr $2 + 0` かな。
354 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:15:05 ] いや、>>344 は、>>343 をシェルで実行しようとしたんじゃないだろうか? どこにも○○○だとは書かれてないから。
355 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 13:31:19 ] >>350 だったら、4桁数字だったら西暦、 2桁数字だったら日付、 Jan Feb等に一致したら月、 それ以外のフィールドは無視、というように 全フィールドをチェックすればできるな。
356 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:22:51 ] 338です。 あっという間にたくさんのレスが。ありがとうございます。 >>340 >>343 >>352 ありがとうございます。 #!/bin/sh の後に書いてやってみていますが、まだうまくいきません。 基本的な書き方がわかっていなさすぎなんでしょうね。 >>350 日付のフォーマットはこれだけ限定です。 過去スレ等、さらに読みに行ってきます。 本当に皆さんありがとう。
357 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:31:41 ] >>355 だったら ↓だな。 #!/bin/sh while read line; do for f in $line; do case $f in [0-3][0-9]) d=$f;; [1-2][0-9][0-9][0-9]) y=$f;; Jan) m=1;; Feb) m=2;; Mar) m=3;; Apr) m=4;; May) m=5;; Jun) m=6;; Jul) m=7;; Aug) m=8;; Sep) m=9;; Oct) m=10;; Nov) m=11;; Dec) m=12;; esac done printf '%d.%d.%d\n' $y $m $d done
358 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:43:10 ] 宗教的に問題ないなら GNU date 入れちゃいなよ。 便利だよ。
359 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:44:15 ] 宗教上の理由でそれは出来ません
360 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 14:46:23 ] ならしょうがない。
361 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 19:29:20 ] 輸血と献血とGNU date は家訓で禁じられてます
362 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 20:25:21 ] perlで我慢しる $ cat <<END | perl -ane 'use Date::Parse; $t = str2time($_); ($s,$m,$h,$d,$M,$y) = localtime($t); print $y+1900 . "." . $M . "." . $d . "\n"' Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 END 2008.4.16 2008.4.18 2008.5.2
363 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 20:27:13 ] use Date::Parse; ($s,$m,$h,$d,$M,$y) = strptime($_); print $y+1900 . "." . $M+0 . "." . $d+0 . "\n";
364 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 21:12:11 ] >>362 純正シェルでの >>357 の回答の後にperl出しても意味ないなぁ。
365 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 22:43:18 ] perlやGNU dateの方が書式に寛容
366 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/25(水) 22:47:29 ] perlが入っててもDate::Parseが入ってない環境が多いから動かない環境が多い。
367 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 01:57:12 ] 純正シェル(笑)
368 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 02:04:04 ] シェルってゆうな。クズ。
369 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 02:05:33 ] 貝殻
370 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 02:12:50 ] ゆうなって言うなこのクズ
371 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/26(木) 03:07:08 ] 稲村
372 名前:265 mailto:sage [2008/06/26(木) 17:31:41 ] bashのshはシェルの略なので これからはbaと呼ぶことにします。
373 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:24:30 ] 338、356です。 勉強始めたばかりで適切なスレを見つけるのもままならない。 質問した後に、スレ違いだったようだと反省している。 実はbashでやっているんだが・・・ってこれを最初に言うべきだったんだね。 皆さんにいただいたヒントでなんとかしようとさらに勉強するつもりだ。 ほんとに親切な人が多いスレで感激しているよ。 頑張ってみる。ありがとう。
374 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:27:48 ] まだ出来てないのかよ。
375 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:32:36 ] >>373 >>357 をコピペして、適当なファイルに保存(ファイル名hoge)する。 $ chmod +x hoge $ ./hoge < hoge1.txt 2008.5.16 2008.5.18 2008.6.2 ここまで書かないとわからなかったのかな? パーミッションとか、リダイレクトとか、./ を付けることとか、、
376 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:36:14 ] パーミッションとかわからければ、テキストファイルとして保存して $ sh hoge < hoge1.txt でいいし。
377 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/27(金) 10:47:21 ] >>375 できましたっ! みんな、ありがとう!
378 名前:名無しさん@お腹いっぱい。 [2008/06/28(土) 16:35:09 ] ホストをIPに変換するシェルを発行する時、 getentを使いたいのですが、getentって純正シェルでも使えましたっけ? あと、他にgetentが使えないシェルはありますか?
379 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 16:58:49 ] ホストの人かコンピューターをプロトコルに変換するシェルを開発されるスーパーハカーの方ですねわかります
380 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 17:48:26 ] >>378 外部コマンドならシェルの種類は関係ないでしょ。
381 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:18:22 ] zshではシェル関数になっていた > getent
382 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:21:22 ] それは俺の知らないzshだ
383 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:25:32 ] >>381 それは漏れの知らないzshだ
384 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:27:34 ] ashでは not foundって言われた > getent
385 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 18:31:13 ] /usr/share/zsh/4.2.6/functions/compaudit の中に [[ -x /usr/bin/getent ]] || getent() { if [[ $2 = <-> ]]; then grep ":$2:[^:]*$" /etc/$1 else grep "^$2:" /etc/$1 fi } と書いてあった。コマンド実体がない場合にちょー簡略版を定義してるのね。
386 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 21:36:48 ] >>385 その定義だと、コロンで区切られてる前提になってるから、 passwdとgroupにしか使えないね。 (hostsには使えない)
387 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/28(土) 21:47:04 ] getent hostsって微妙だからな。 libresolv直接叩いているアプリも結構あるし。
388 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 03:08:38 ] 行中にIPアドレスらしき文字列が含まれていたら、それを出力するって こんな感じで問題ないですかね? もっと綺麗に書ける気もするが・・・ # 1行に1つしか含まれてないと仮定して問題なしです。 text='0.0 192.168.0.1 0.0' regex='[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*' echo "$text" | grep "$regex" | sed -e "s/.*[^0-9]\($regex\).*[^0-9]*/\1/"
389 名前:388 mailto:sage [2008/06/29(日) 03:13:28 ] 全然ダメだったorz 教えてください。
390 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 03:30:41 ] echo $text | grep -E -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' -oなんてオプション他のgrepにあるか知らないけど
391 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:32:03 ] >>388 grepとsedを一緒に使うのは無駄。sedだけでできる。 sed '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/'
392 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:34:43 ] すまん、-n p 忘れた。訂正。 sed -n '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'
393 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:35:43 ] sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p' の間違いだろ。初心者はもっと謙虚なレスを書きなさい。
394 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:38:27 ] >>392 それだと頭の数字が食われることがある。 ↓ sed -n '/[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p' とした方がいい。
395 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:40:50 ] だからぁ〜、sedはスレ違い。 >>393 は何を言いたいんだ? (392のあとで)
396 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:43:09 ] と言うか、>>393 の頭の 's/ の部分ですでにsed文法エラーじゃん。 初心者はちゃんと動作確認してから書きなさい。 >>394 が正解。
397 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:50:09 ] >>394 でも、 hoge123 192.168.123.45 みたいな入力があると失敗する。続きは sedスレでやってくれ。
398 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:52:24 ] sed -n '/.*\(\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>\).*/s//\1/p' で改善されるか?
399 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 09:54:07 ] 模範解答の発行まだー??
400 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 10:04:16 ] 398 で桶
401 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 21:24:06 ] sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'
402 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/29(日) 21:44:44 ] >>401 >>397 の指摘で失格
403 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/30(月) 01:27:41 ] よほどパフォーマンスに差がありでもしないかぎり、 書き易く読み易いようにすればいい。
404 名前:388 mailto:sage [2008/06/30(月) 01:39:46 ] みなさま色々とありがとうございました。 >>398 ちゃんと処理できるみたいですし、このスレでも良い評価なので これを使ってあげようかと思います。感謝してください。 この処理は、あるとても重要な国家プロジェクトで使用されます。 コメントで Powered by 398 と入れておきますね。
405 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/06/30(月) 01:59:48 ] なわけねーだろ
406 名前:名無しさん@お腹いっぱい。 [2008/07/02(水) 17:31:55 ] 誰かお願いします。 wk=f 配列にa b c d とそれぞれ入ってるとして ループでぐるぐるっと、wkと一致するものを探したいんですが、 もし一致するものが無かった場合の終了条件って、どうしたらいいですか。
407 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:41:16 ] 日本語でおk
408 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:42:11 ] 純正シェルに配列はない。配列に相当する別の処理をしているなら、 その処理方法を明示して質問し直した方がいい。
409 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:43:56 ] >>406 多少エスパーして回答。 ループにwhileを使うんじゃなくて、 forで配列の要素分ループすれば、たとえ一致するものが無かった場合でも ループはちゃんと終了するから問題なし。
410 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:48:51 ] ループの返り値ってことなら、breakとかを使わん限り最後のコマンドの実行結果になるから、 ループの最後にfalseを置いとけばいいんじゃないかね。 成功した場合はbreakで抜ける、ということならば、だけど。
411 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:51:11 ] >>406 の日本誤訳: 以下のようなシェルを発行しようとしたのですが、 もし一致するものが無かった場合、うまくいきません。 どうすればいいですか? #!/bin/bash wk=f array=(a b c d e) i=0 while [ ${array[i]} != $wk ]; do ((i++)) done
412 名前:名無しさん@お腹いっぱい。 [2008/07/02(水) 17:57:26 ] 皆様あざーっす! とりあえず今、KSHって何だって事から教わりました。怒鳴り含み。 ちょっと参考にして、考えます。皆暖かいアドバイスども!
413 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 17:59:21 ] 突然何を言い出すんだ?
414 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 18:08:51 ] キチガイ警報
415 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 22:22:49 ] 作成したいファイル名が書かれたtxtのリストから、 ファイルを作成するにはどうすればよいでしょうか? たとえばテキストの中身に、 hoge foo bar とあったとして、 hogeとfooとbarというファイルを作成したいのです。
416 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 22:34:11 ] >>415 touch $(cat txt)
417 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/02(水) 22:46:52 ] >>416 なんでこれでできるのかわからないですができました ありがとうございます
418 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 02:22:28 ] >>416 それだと大量だった場合に引数溢れのエラーにならないかな?
419 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 02:25:14 ] >>418 じゃあ cat txt | xargs touch
420 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 03:05:13 ] cat txt|while read FNAME do touch $FNAME done べたですがw
421 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:17:23 ] >>419 xargsは使っちゃいけないコマンド。 >>420 それだと catが無駄。touchがむだ。 while read FNAME do > "$FNAME" done < txt
422 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:19:13 ] >>416 bash依存、失格。 > `cat txt`
423 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:23:31 ] >>421 415とは関係ないんだけど パイプでxargsに渡すときに空白をエスケープするにはどうすればいいの 例えばfindで見つけたパスに空白が含まれてた場合とか
424 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:49:19 ] >>423 テンプレ>>6
425 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 07:55:01 ] >>424 テンプレにあったとは すいませんでした
426 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 08:02:10 ] テンプレにはないが、find -print0 | xargs -0 するんじゃなくて、 find -exec + するのが今後のお勧めだな。-exec の後ろ、\; じゃなくて + ね。 これでxargsは完全に不要!
427 名前:名無しさん@お腹いっぱい。 [2008/07/03(木) 11:31:21 ] 質問です。 case文でwhile文を使用する時 case "$a" in "a.c") while[ $flag = false || $i -ne 10 ] ; do 処理1 done の時、doneの跡に;;でおkですか?
428 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 11:56:24 ] >>421 がFAだけど、敢えてxargs -0で。 cat list.txt | perl -ane '{ chop; printf("%s%c", $_, '\0'); }' | xargs -0 touch
429 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 11:57:44 ] >>426 この+でappendって、最近のfindはどれにもあるの?
430 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 11:58:53 ] 純正findにないから使っちゃだめ
431 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:18:04 ] >>430 純正findにもあるんだなぁ、+ が。よって find -exec + で FA。
432 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:31:00 ] xargs を使っちゃいけない理由キボンヌ 便利だし早いからコマンドラインで結構使うんですが・・・
433 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:31:12 ] 純正find にないのは -print0 の方ですね。
434 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:40:55 ] 純正なんとかっていう意味の曖昧な言い方は止めろ 今はPOSIX準拠かどうかの話をしてるようだが、 純正シェルは古い/bin/shの話だったりでわからん
435 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:45:23 ] >>432 $ printf "This is\na test.\n" This is a test. $ printf "This is\na test.\n" | xargs -n 1 echo This is a test. $ printf "This is\na test.\n" | perl -ane 'chop; printf("%s%c", $_, '\0');' | xargs -0 -n 1 echo This is a test. $
436 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 12:46:31 ] & >>6 (>>424 は読んだ?)
437 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 13:03:20 ] >>435 なるほど、理解しますた。分かってれば使えないことはないですな。
438 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 16:40:13 ] まぁ実験して動いたらそれでまずOK。 でその後にリファイン(リファクタリング?) これが大事。
439 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 17:28:35 ] >>6 > (スペースなどを含むファイル名を正しく処理するため、 > findは -print0、xargsは -0オプションを常に付けることを推奨 > ただし、Solarisでは未対応。どうするんだろ?) $ cat print0 #! /bin/sh while read x; do printf "%s\0" "$x" done $ find 〜 | print0 | xargs -0 〜 でいいんじゃね? # printfは許してね。
440 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 18:16:12 ] >>439 いや、だから、Solarisでも find dir -exec hoge + が使えるんだよ。 よってprint0云々は一切不要。
441 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 18:21:41 ] >>439 ファイル名に \ が含まれていた場合、readが誤動作する(違うファイル名とみなされる) Solarisの xargsには -0 オプションがない。 で、>>440 の方法で解決。
442 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 18:58:56 ] トレースしてみた。 strace -f find /tmp -exec file {} + 2>&1 execve("/usr/bin/file", ["file"..., "/tmp"..., "/tmp/.ICE-unix"..., "/tmp/mysql.sock" ..., おお、すげぇ。ちゃんと引数まとめて実行してるね。 strace -f find /tmp -exec file {} \; 2>&1 execve("/usr/bin/file", ["file"..., "/tmp"...], [/* 21 vars */]) = 0 execve("/usr/bin/file", ["file"..., "/tmp/.ICE-unix"...], [/* 21 vars */]) = 0 execve("/usr/bin/file", ["file"..., "/tmp/mysql.sock"...], [/* 21 vars */]) = 0 こっちは1個ずつ実行するから大量だとクソ遅い。 勉強になりまつた。
443 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 19:55:30 ] やっぱ速さってみんな気になるん? しっかりきっちり動けば、速度は問題ないって思ってる俺は未熟? いかにもベターってのはやらないけどー。
444 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 20:03:16 ] テクいことして読み難くなるなら多少遅くても分かりやすく書く
445 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 20:08:46 ] >>442 straceって、、Linuxかよw
446 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/03(木) 23:57:40 ] >>443 必要な時に必要なことをやる。当たり前のこと。 後の話はマ板でやって。
447 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 01:32:47 ] cronで毎日回しているプログラムの処理時間が 16時間越えたらちょっと悩む
448 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:05:24 ] kshでユーザIDのリストを計表にして印刷したいんだけど こんなの作った人いますか? どこかにサンプルありませんかね。OSは、AIX5.3です。
449 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:27:34 ] >>448 計表の正確なところがわからんが、 while read user pass uid rest; do echo $uid $user ; done < /etc/passwd ってことか? あと、必要なら sort -n をかましてね。 kshじゃなくて純正シェルでできるよ。
450 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:29:48 ] >>448 あ、IFS設定抜けてた。 IFS=:; while read user pass uid rest; do echo $uid $user ; done < /etc/passwd
451 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 08:42:50 ] ksh -c lpr < /etc/passwd
452 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:13:09 ] FreeBSD 付属の wc は空白文字でパディングして結果を返すようです。 wc -l $file | sed "s/ /_/g" _____340_/usr/bin/g++ Linux では次のようにして 340 という値を得ていたのですが、 FreeBSD では空白文字が出力されてしまいます。 wc -l $file | cut -f1 -d" " FreeBSD 版 wc ではどうすればいいでしょう。 ltrim() みたいなものがありますかね。 それともいったん sh の変数に代入する? それとも wc や cut には未知のオプションがある? cut なんていう頑ななコマンドは使わないで、 sed 's/^ *\([0-9]*\) .*$/\1/' しろ? お前 awk '{ print $1 }' も書けないのか? bash をよく使うので、依存しているところがあったらごめんなさい。 awk はほとんど馴染みがありません。というか、 何かにつけて不遇の cut を使ってあげたい気持ちがあります…。
453 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:15:19 ] >>452 echo `wc -l < $file`
454 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:28:33 ] >>452 長文で cutを力説してるのに、 >>453 で cutすら必要ないというオチにワロタ wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。
455 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:33:53 ] > それともいったん sh の変数に代入する? 質問者が用意した選択肢を誇らしげに答える>>453-454 が憐れ。
456 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:38:03 ] 空白文字のパディング方式に、 暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。 仕様の特殊化しても嬉しくない。
457 名前:452 mailto:sage [2008/07/04(金) 11:38:04 ] いやいや > wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので 役に立ちました! 確かに笑った。
458 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 11:38:44 ] >>455 おまえ、シェルスクリプト書いたことないだろ? >>453 では一切「sh の変数に代入」は行なっていないがww
459 名前:452 mailto:sage [2008/07/04(金) 11:50:48 ] >>456 いやいや、そうなんですよ。 cut ってつまり結局 他のコマンドと組み合わせるには中途半端なツールなんですよ。 単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが… awk や bash は区切り文字を変えるだけでも結構タイプする印象が。 いや、変にこだわってごめんなさい。
460 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 12:06:44 ] つ awk -F:
461 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/04(金) 15:50:34 ] cut はデリミタの連続を指定できれば使える君に化けるんだがな。
462 名前:名無しさん@お腹いっぱい。 [2008/07/08(火) 07:58:27 ] シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが
463 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 08:00:46 ] >>462 インタプリタ型言語だから。 (fork/execが遅いと言うだけが理由ではない。 内部コマンドだけを使ってもCよりも遅いから)
464 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 10:52:14 ] でも一番のボトルネックは fork, exec だと思うぞ
465 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 11:29:48 ] プロファイルしてみると分かるが、文字列処理も結構コストが高い。 stat(2)せずにls -lしてからパターンマッチなど。 shは文字列がグルーになっているから。
466 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 14:57:58 ] パイプとかバッククォートとかガンガン使うから、 それだけでシステムコール連発になっちゃうもんね。 文字列処理なのに write(2) とか使うわけだw
467 名前:名無しさん@お腹いっぱい。 [2008/07/08(火) 21:54:18 ] レスありがとう ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?
468 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 21:56:21 ] >>467 全然合ってない。それは MS-DOSのニセパイプの動作。
469 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:14:44 ] >>468 詳しくおしえてください・・・
470 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:21:27 ] >>469 シェル pipe dup2 とかで検索してみ。
471 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 22:50:12 ] そんな検索語じゃわかるわけないだろ。 pipe(2)だって無限にバッファがあって、 入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。
472 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:22:32 ] 無限の記憶装置は存在しないのでそんな可能性はゼロだな。
473 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:25:31 ] MS-DOSのパイプ仕様を実装することも不可能だな。
474 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:36:10 ] コマンド1 | コマンド2 本来のパイプだと、 コマンド1 の標準出力 = コマンド2の標準入力 になるような操作(dupとか)が裏で行われる。 コマンド1と2は同時に実行される。一時ファイルを介さない。 嘘パイプの場合は、 コマンド1 > 一時ファイル コマンド2 < 一時ファイル 削除 一時ファイル なだけ。
475 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/08(火) 23:57:58 ] 例えば cat ばかでかいファイル | head -1 だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します そのときcatの処理が途中だったらどうなるんですか?
476 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 00:11:11 ] やってみろよ
477 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 00:50:57 ] >>475 バッファってしってるか?
478 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 01:22:00 ] >>475 catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。
479 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/07/09(水) 02:16:51 ] そのshigpipeを発行するのはパイプさん?