08/06/03 13:36:22
>>194
3重ネストは \\\`command\\\`
4重ネストは \\\\\\\`command\\\\\\\`
何か問題ある?w
201:名無しさん@お腹いっぱい。
08/06/03 13:41:28
Solarisならば、普通kshかxpg4シェル。
202:名無しさん@お腹いっぱい。
08/06/03 20:09:41
質問させてください。
テキストファイルの内容が以下のようになっています。
日付 文字列
上記文字列に改行コードが存在する場合、以下のようになります
20080602 aaabbbccc
20080602 dddee
ef
ff
20080602 ggghhhiii
これをこのように正しく変換するにはどうしたらいいでしょうか?
20080602 aaabbbccc
20080602 dddeeefff
20080602 ggghhhiii
203:名無しさん@お腹いっぱい。
08/06/03 20:18:28
202の続き
とりあえずない頭を絞って先頭文字が「2008」でない行に|を入れて以下のような
レイアウトにし
例)
20080602 aaabbbccc
20080602 dddee
|ef
|ff
20080602 g
|gg
|hhhi
|ii
過去ログにあったコマンドを参考に以下のコマンドを実行しましたが
「(rm a.txt; sed 'N; s/\n|//; P; D' > a.txt) < a.txt 」
例)
20080602 aaabbbccc
20080602 dddeeef
|ff
20080602 ggg
|hhhiii
と、いった感じですべて変換することができません。
よろしくお願いします。
204:名無しさん@お腹いっぱい。
08/06/03 20:41:47
>>202
これでどうだ。
頭に余分な空行が出るのは無視してね
↓
while read line
do
set $line
if [ $# = 1 ]; then
echo -n $1
else
echo
echo -n $1 $2
fi
done < file.txt
echo
205:名無しさん@お腹いっぱい。
08/06/03 21:33:33
>>204
ありがとうございます。
すみません。わたしの記載漏れになりますが文字列の中にはスペースも存在します。
詳しく言いますとこの文字列とはSQLなのです。
なので「select * from table」のようになります。
せっかく考えて頂いたのにすみませんでした。
206:名無しさん@お腹いっぱい。
08/06/03 21:38:11
後出し乙。これで回答を得られることはないであろう。
207:名無しさん@お腹いっぱい。
08/06/03 21:46:02
わしが代わりに答えてあげよう。
正解のmd5じゃ。
9c42265ebade7ace4e45b75b8d41f7ab
208:名無しさん@お腹いっぱい。
08/06/03 22:45:18
初心者な質問ですいません。
自分で書いたシェルをコマンドとして発光するにはどうするんですか?
209:名無しさん@お腹いっぱい。
08/06/03 22:47:26
発酵させるには、ながーい時間がかかるよ
210:名無しさん@お腹いっぱい。
08/06/03 23:22:26
>>207
お題を自分で解いた(かもしれない)だけで、答えたことになってないよな
211:名無しさん@お腹いっぱい。
08/06/04 06:27:08
>>207
そのmd5逆算したところ、確かに動きました。感謝です。
212:名無しさん@お腹いっぱい。
08/06/04 07:33:03
すげぇなおい
213:名無しさん@お腹いっぱい。
08/06/04 11:28:09
>>202
どっちも書き方として邪道かつ汚いけど結果オーライなら。
cat $SQL_FILE | awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }'
cat $SQL_FILE | perl -ne 'chop; print "\n" if(/^\d{8}\s/); print; END{ print "\n" }'
214:名無しさん@お腹いっぱい。
08/06/04 15:08:22
全然シェルスクリプトじゃない件
215:名無しさん@お腹いっぱい。
08/06/04 15:17:43
#!/bin/sh
awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }'
216:名無しさん@お腹いっぱい。
08/06/04 15:22:33
awkスレと聞いて
217:215
08/06/04 15:27:14
まぁ >>6 にも入ってるし、sed awk はテキスト処理では欠かせないな。
>>213 は、改行コードの扱い方が珍妙で、よく出来てると思った。
218:名無しさん@お腹いっぱい。
08/06/04 23:33:14
192168000001 を 192.168.0.1 に変換するスマートな方法を教えてください。
一オクテットが、3 ケタずつに区切られています。
219:名無しさん@お腹いっぱい。
08/06/04 23:43:18
echo 192168000001 |
sed 's/.../& /g' |
awk '{print $1+0 "." $2+0 "." $3+0 "." $4+0}'
220:202
08/06/04 23:45:50
>>213
ありがとうございます。
出来ました。
なるほど改行コードを削除することに躍起になっていましたが、
マッチした時だけ前に改行コードを付けるというやり方もあるんですね。
なかなか思いつかない発想だったので勉強になりました
221:名無しさん@お腹いっぱい。
08/06/04 23:54:42
echo 192168000001 | sed 's/.../&./g;s/¥.0*/./g;s/¥.¥./.0./g;s/¥.$//'
s/¥.00?/./ とか書きたいにゃー。
222:名無しさん@お腹いっぱい。
08/06/05 00:02:30
echo 192168000001 | sed 's/.../& /g;s/ $//;s/ /./g'
223:名無しさん@お腹いっぱい。
08/06/05 05:47:11
sh -c 'echo fugafuga'
と
eval 'echo fugafuga'
が異なるのは、どのような時なのでしょうか。
fugafugaの部分は任意です。
224:名無しさん@お腹いっぱい。
08/06/05 06:33:34
>>220
おいおい、>>213 の改行付加の発想は >>204 と同じだぞ。
>>204 の時点でその方法に気づけ。
>>204 を改良して、スペースが入った場合の問題は対処できる。
awk/perlなどのシェル以外のものを使わずにね。
225:名無しさん@お腹いっぱい。
08/06/05 06:37:46
>>223
たとえば、
set hoge
sh -c 'echo "$@"'
と、
set hoge
eval 'echo "$@"'
は異なる。
226:名無しさん@お腹いっぱい。
08/06/05 14:30:52
すいません
スペース区切りの文字列をカンマ区切りに変えたいんですが、
スペースが一つとは限りません
a hoge
b ge
c h
これを
a,hoge
b,ge
b,h
こんな感じです
bashでできないですか?
awkも使えます
227:名無しさん@お腹いっぱい。
08/06/05 14:33:22
すいません
条件がもう一つ
カラム数は固定じゃないです
228:名無しさん@お腹いっぱい。
08/06/05 14:33:44
sedは禁止?
sed 's/ */,/g'
229:名無しさん@お腹いっぱい。
08/06/05 14:35:50
while read line
do
set -- $line
echo -n $1
shift
for i in "$@"
do
echo -n ,$i
done
echo
done
230:名無しさん@お腹いっぱい。
08/06/05 14:40:56
>>228
ダウト。試してから書き込めよ。
231:名無しさん@お腹いっぱい。
08/06/05 14:42:08
>>230
試したよ。
何で2ch読んでる?
232:名無しさん@お腹いっぱい。
08/06/05 14:45:44
何をどう試したんだ
233:名無しさん@お腹いっぱい。
08/06/05 14:47:20
>>228
echo 'aaa bbb ccc' | sed 's/ */,/g'
,a,a,a,b,b,b,c,c,c,
234:名無しさん@お腹いっぱい。
08/06/05 14:48:54
$ echo 'aaa bbb ccc' | sed 's/ */,/g'
aaa,bbb,ccc
235:名無しさん@お腹いっぱい。
08/06/05 14:49:14
sedなら正解は、
sed 's/[ ][ ]*/,/g'
だな。
236:名無しさん@お腹いっぱい。
08/06/05 14:50:50
>>234 をコピペして実行してみろw
$ echo 'aaa bbb ccc' | sed 's/ */,/g'
,a,a,a,b,b,b,c,c,c,
この問題を避けるには、>>235 が正解。
237:名無しさん@お腹いっぱい。
08/06/05 15:05:50
「この問題」って、専ブラを使わずに煽る○○がいる問題って意味だな
238:名無しさん@お腹いっぱい。
08/06/05 15:27:44
で、>>226は納得したのか?
239:名無しさん@お腹いっぱい。
08/06/06 00:58:06
>>235
これの意味がよくわからんのだが・・・
なんでこれでいいの?
240:名無しさん@お腹いっぱい。
08/06/06 01:19:14
[ ] の意味と>>230がキレた理由はわかるかね?
241:名無しさん@お腹いっぱい。
08/06/06 01:23:10
>>239
解説するのも野暮だが…
>>230,>>232はスペースが2個あることに気付かず醜態を晒してしまったわけだが、
>>235のように書いておけば見落とし確率が下がって嬉しいという記法。
242:239
08/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
08/06/06 01:39:25
自己解決
[]じゃなくえ[ ]だったわ
あほだおれ
244:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/06 06:19:56
OFSのあるawkなら、
awk 'BEGIN { OFS=","} { $1 = $1; print $0 }'
246:名無しさん@お腹いっぱい。
08/06/06 06:32:12
>>241
見落としたのじゃなくて、本当に(HTML解釈上で)複数のスペースが
1個のスペースで表示されてしまうから、「>>228 >>234 をコピペしても動かない」が正解。
>>235 のように書き込めば、コピペしてもちゃんと動く。
醜態を晒したのは >>228 >>234 の方。
ちなみに、宣ブラ使ってもやっぱり >>228 >>234 のスペースはひとつだよ。
247:名無しさん@お腹いっぱい。
08/06/06 08:07:53
ダサい専ブラ
248:名無しさん@お腹いっぱい。
08/06/06 08:20:28
たしかにダサい専ブラだな。
249:名無しさん@お腹いっぱい。
08/06/06 08:31:46
ブラウザ依存も、Bash依存同罪。
ポータビリティ考えて書き込めよ。
250:名無しさん@お腹いっぱい。
08/06/06 08:41:33
いつのまにか落ちてたので、立てました。
zsh その5
スレリンク(unix板)
251:名無しさん@お腹いっぱい。
08/06/06 08:45:33
sed -r 's/ +/,/g'
の方が良くね?
252:名無しさん@お腹いっぱい。
08/06/06 08:49:28
どこのsedだよ
253:名無しさん@お腹いっぱい。
08/06/06 08:50:10
/bin/sed
254:名無しさん@お腹いっぱい。
08/06/06 08:51:37
$ type sed
sed is a shell builtin
255:名無しさん@お腹いっぱい。
08/06/06 09:02:22
大半のシステムで使用できる sed -r を避けて可読性を劣化させる必要は無い。
このスレに巣食っている原理主義者以外は >>251 使うのが正解。
256:名無しさん@お腹いっぱい。
08/06/06 09:20:12
自分が読めない = 可読性が低い
257:名無しさん@お腹いっぱい。
08/06/06 10:01:25
sed 's/ */,/g'
これなら文句はねえよな?
258:名無しさん@お腹いっぱい。
08/06/06 10:09:26
>>257
>>228と同じじゃん。
文句あるみたいよ。
259:名無しさん@お腹いっぱい。
08/06/06 10:11:21
>>258
>>228とは違う。こっちはちゃんと を使ってるんだが
まだ空白がつながって見えるかな?
ナマの空白をつなげたら、HTML仕様的にはくっつくのが当たり前だよ
260:名無しさん@お腹いっぱい。
08/06/06 11:49:01
>>226
tr -s ' ' ,
でいけないか。
261:名無しさん@お腹いっぱい。
08/06/06 20:02:12
sed 's/ * /,/g'
262:名無しさん@お腹いっぱい。
08/06/07 10:18:23
>>254
いいな
263:名無しさん@お腹いっぱい。
08/06/08 02:28:12
結婚を考えていた彼女が処女じゃなかったんです7
1 :最強の負け組み:2008/03/01(土) 05:37:53 ID:YrfLoASe
ショックでした。
もしやもしやと思っていたのですが
面と向かって告白された時は目の前が真っ暗になりました。
「処女とかそんなの関係ない!」
そう自分に言い聞かせてきましたが、やはり限界がきてしまい
彼女に別れを告げました。
知り合いに言うと
「は?そんなくっだらない事であんないい子と別れたの?
ばっかじゃね?もうあんな子絶対知り合えないぞ?」
とボロかすに言われました。
頭では判っているのに心で理解できないんです。
私自身、もう頭の中がぐちゃぐちゃで訳がわかりません。
彼女を傷つけてしまったのでしょうか?
別れの時、彼女は黙って頷き
「じゃあね」
と笑って去っていきました。
もう私には彼女の気持ちがどうなのか
あの微笑がなんだったのか理解できないのです。
やはり私は馬鹿な事をしたのでしょうか?
264:名無しさん@お腹いっぱい。
08/06/08 05:17:54
>>263
echo じゃあね
: -P
exit
265:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/09 01:23:06
ふともも画像について詳しく
267:名無しさん@お腹いっぱい。
08/06/09 01:51:05
うん、画像のふとももが実際どうなのかによって対処法も違うよね。
268:名無しさん@お腹いっぱい。
08/06/09 05:26:55
おまいら少しは協力してやれよw
で、画像の件なんだがね。。。
269:名無しさん@お腹いっぱい。
08/06/09 10:51:46
画像のサンプルがないことにはどうにもならん。
270:名無しさん@お腹いっぱい。
08/06/09 11:56:21
>>265
いわゆるナップサック問題なので、最適解を求めるのはシェルスクリプトには荷が重い。
271:名無しさん@お腹いっぱい。
08/06/09 12:23:52
>>270
最適解じゃなくていいから、指定サイズ以下に並べられる
シェルを書いてうpしてください。
272:名無しさん@お腹いっぱい。
08/06/09 13:08:20
最適じゃなくていいなら
頭から順にならべて1440を越えたら次に行けばいいだけじゃん。
273:265
08/06/09 13:08:54
サンプル画像です。
素材に対する文句はいっさい受け付けません。
URLリンク(home2.dip.jp) mai
最近大量に脚画像つくったのがこれしかなかったので。
>>270
そうですか。
でも、しばらく回答を待ちます。
>>271
脚画像をならべるスクリプトは需要があるようですね。
274:名無しさん@お腹いっぱい。
08/06/09 14:02:24
>>272
2次元だから、最適じゃなくても単純にはいかないだろ。
275:名無しさん@お腹いっぱい。
08/06/09 22:31:54
ここは楽しい
モーレツインターネッツ教室でつね
ワッフルワッフル
276:名無しさん@お腹いっぱい。
08/06/09 22:41:50
X軸方向に複数画像並べるだけで、Y軸方向には画像は並べない(1枚だけ)という仕様なの?
277:265
08/06/09 22:49:54
>>276
そうです。
278:名無しさん@お腹いっぱい。
08/06/09 22:56:48
条件後出し乙。
だったら質問するまでもない簡単な問題じゃん。
アフォらしいから回答するの辞めた。
279:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/10 00:02:57
いつからここは
エロ画像処理スレッドになったんでしょうか。
281:名無しさん@お腹いっぱい。
08/06/10 00:04:47
しかも画像も貼らずに質問とは。
282:名無しさん@お腹いっぱい。
08/06/10 01:46:24
ImageMagick で一発?
283:名無しさん@お腹いっぱい。
08/06/10 14:18:30
シェルスクリプトでやる意味があるのか分からない。
ってのは禁句でしたかな。
284:名無しさん@お腹いっぱい。
08/06/10 19:31:40
>>283
ぶっちゃけシェルスクリプトの最大の利点は手軽さなので、
わざわざ人に1から10まで聞くという手間をかけてまでシェルスクリプトでやる理由はないな。
285:名無しさん@お腹いっぱい。
08/06/10 19:42:03
普段からシェルを使い慣れてないならあえて選ぶ意味はないような.
286:名無しさん@お腹いっぱい。
08/06/10 21:32:49
じゃなくて、人に聞いてるんじゃなくて、オマエラに「お題」を出してるんだよ。
シェルで発光する方法を考えて、おおいに盛り上がってくれ。
287:名無しさん@お腹いっぱい。
08/06/10 21:36:09
はい次の質問どぞ
288:名無しさん@お腹いっぱい。
08/06/10 21:37:08
シェルで発光する方法まだーーーー???
289:名無しさん@お腹いっぱい。
08/06/10 21:46:34
>>288
はいよLinuxオンリーだが
setleds +num +caps +scroll
で発光できる
290:名無しさん@お腹いっぱい。
08/06/12 09:37:20
お疲れさまでした。
では、次の課題です。
シェルで発酵する方法について考えましょう。
291:名無しさん@お腹いっぱい。
08/06/12 10:01:50
ところで「シェルを発行する」っていうのはなにか決まった言いまわしなのか?
普通はこんな言いかたしないと思うんだけどこのスレではよく見る気がする
292:名無しさん@お腹いっぱい。
08/06/12 10:12:17
スレリンク(unix板:860番)のネタからでしょ
293:名無しさん@お腹いっぱい。
08/06/12 10:29:40
>>292
それのさらなる元ネタはあるんだろうか
294:名無しさん@お腹いっぱい。
08/06/12 11:15:26
>>293
URLリンク(ja.wikipedia.org)
295:名無しさん@お腹いっぱい。
08/06/12 12:11:11
issue とか perse とか英語でも色んな言い方するよねえ
296:名無しさん@お腹いっぱい。
08/06/12 12:17:40
>>293
スレリンク(unix板:312番)
297:名無しさん@お腹いっぱい。
08/06/14 08:48:18
引数指定のディレクトリを頂点として、それ以下のサブディレクトリを含む
ディレクトリツリー中のシンボリックリンクを探し、
そのシンボリックリンクそれぞれについて、
冒頭のディレクトリツリー内を指しているか、
それとも、ディレクトリツリーの外を指しているのかを
判断するシェルを発行してください。
なお、シンボリックリンクの先に実際にファイルがない場合もありますが、
実際にファイルがあるかどうかに関係なく、あくまでシンボリックリンクの
内容のPATHだけで判断してください。
(ブロークンリンクだからといって外部と判断してはいけないということ)
以上、お願いします。
298:名無しさん@お腹いっぱい。
08/06/14 09:03:06
作ったシェルスクリプトを僕のPC上で発行しました どうぞ
299:名無しさん@お腹いっぱい。
08/06/14 16:32:04
ここってさ、人にシェルスクリプト書いてもらうスレだったっけ?
300:名無しさん@お腹いっぱい。
08/06/14 16:35:34
>>299
>>1
>スクリプトのお勉強・自慢・腕試しなどにどうぞ。
だそうなので、腕試しのお題を出しているんじゃない?
301:名無しさん@お腹いっぱい。
08/06/14 18:40:09
できないなら黙ってろの人最近来ないね。
302:名無しさん@お腹いっぱい。
08/06/14 18:50:22
>>298-299
わからないなら黙ってろ。
303:名無しさん@お腹いっぱい。
08/06/14 19:00:44
>>301
召喚士現る。
304:名無しさん@お腹いっぱい。
08/06/14 19:02:21
>>301
君、腕良いね
305:名無しさん@お腹いっぱい。
08/06/14 19:05:04
お題としてはなかなかいいんじゃない?
symlink読んでリンク先のフルパスに変換する関数を書くあたりがキモかな。
306:名無しさん@お腹いっぱい。
08/06/14 19:09:49
>>305
わからないなら黙ってろ
307:名無しさん@お腹いっぱい。
08/06/14 19:48:53
$RANDOM って癖があるのは仕様なんすか?
俺の環境でecho $((RANDOM*10/32768))を
出力させ続けると0と8がやたら多いw
なんかハードウェアのノイズを拾って数値化してるとか
いうのは読んだことあるけど。。。(実装によるとは思うけど)
これってもうしょうがないんすかね?
立派なアルゴリズムをもった乱数生成器とまでは
いかないものの、そこそこ精度が高い(?)乱数を
シェルコマンドで作るってできないすかね??
308:名無しさん@お腹いっぱい。
08/06/14 20:06:23
>>307
>>90
309:名無しさん@お腹いっぱい。
08/06/14 20:11:25
/dev/*はOS依存なので、
メルセンヌツイスターあたりをシェルスクリプトで実装する方向で。
310:名無しさん@お腹いっぱい。
08/06/14 20:26:02
/dev/urandomはOS依存じゃないだろ。
311:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/15 00:44:25
シェルを発行だとか純正シェルだとか、
このスレは読んでて正直気恥かしくなる
313:名無しさん@お腹いっぱい。
08/06/15 00:46:06
>>312
わからないなら黙ってろ
314:名無しさん@お腹いっぱい。
08/06/15 00:57:49
>>312
もしかしてここがネタスレだと分かってなかったのか?
315:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/17 01:43:42
なんかシェルでゲーム作りたいんだけど
画面のクリアとかってどうやればいいの?
317:名無しさん@お腹いっぱい。
08/06/17 02:26:15
clear
318:名無しさん@お腹いっぱい。
08/06/17 10:07:08
realpathは使わないの?
319:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/17 10:35:51
>>319
以降はこちらへ
↓
csh初心者質問コーナー
スレリンク(unix板)
321:名無しさん@お腹いっぱい。
08/06/17 16:55:34
>>310
Solaris8 は標準では /dev/u?random はなかったはず。
Sun がパッチを配ってたので事実上あるような扱いだったけど。
Sol7 だとそれもなくて、フリーのデバドラをインストールしてた。
322:名無しさん@お腹いっぱい。
08/06/17 16:58:56
すでにEOLですからw
323:名無しさん@お腹いっぱい。
08/06/23 21:24:15
カンマ区切りcsvからhogeというカラムとその右4カラムを切り出したい
ただしhogeが何カラム目にあるかは不定
というのはちょちょいとできないですか?
324:名無しさん@お腹いっぱい。
08/06/23 21:33:07
フルスペックのcsvをシェルスクリプトで扱うのは荷が重い
ちょちょいでは無理
325:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/23 22:09:52
「,」を含む文字列で発狂するから駄目。
327:名無しさん@お腹いっぱい。
08/06/23 22:53:43
""ん中に改行まで入ることあるしな
328:323
08/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:名無しさん@お腹いっぱい。
08/06/23 23:00:57
質問者が「おお完璧です」と言った後の >>326-327 が不憫。
330:323
08/06/23 23:02:39
>>326
>>327
さすがにそんなに意地悪な仕様ではないんで問題なしです。
欲を言うならシェルを作らず手で打てるレベルのものがいいなぁ・・というくらいです。
331:名無しさん@お腹いっぱい。
08/06/24 11:26:40
シェルってゆうな。クズ。
332:名無しさん@お腹いっぱい。
08/06/24 11:46:49
>>331
よう、久しぶりw
相変わらず怒ってんなあwww
333:名無しさん@お腹いっぱい。
08/06/24 15:07:43
ゆうって言うな。クズ。
334:名無しさん@お腹いっぱい。
08/06/24 15:11:50
シェルで発酵する方法まだーーーーーーーーーーー??????
335:名無しさん@お腹いっぱい。
08/06/24 15:28:14
CPUヒートシンクの上に、藁に包んだ大豆を載せ
while :;do :;done
336:名無しさん@お腹いっぱい。
08/06/25 07:27:59
FAN止めないと乾燥するな
337:名無しさん@お腹いっぱい。
08/06/25 07:35:42
水冷にすればいいんじゃね?
338:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/25 11:50:21
ここでGNU date でやり方書くやつがでて、
Linux厨乙!的な流れですね、わかります。
340:名無しさん@お腹いっぱい。
08/06/25 11:51:01
GNU dateがあるとして、
while read x; do
date --date="$x" '+%Y.%-m.%-d'
done < hoge1.txt
341:名無しさん@お腹いっぱい。
08/06/25 11:51:34
Linux厨乙!
342:名無しさん@お腹いっぱい。
08/06/25 12:20:32
× …hoge2.txt に書き出すシェルスクリプトを作りたいのです。
○ …hoge2.txt に書き出すシェルを発行したいのです。
343:名無しさん@お腹いっぱい。
08/06/25 12:21:46
BEGIN{
m["Jan"] = 1
m["Feb"] = 2
...
m["Dec"] = 12
OFS = "."
}
{ print $4, m[$3], $2+0 }
344:名無しさん@お腹いっぱい。
08/06/25 12:27:11
>>343
それ間違ってるよ。動作確認してから書くこと。
345:名無しさん@お腹いっぱい。
08/06/25 12:47:44
はて、うちの手元では動いてるけど、環境依存な部分あるかな?
346:名無しさん@お腹いっぱい。
08/06/25 12:48:19
Mon,
347:名無しさん@お腹いっぱい。
08/06/25 12:51:31
>>344 うちでも動いてる。
>>346 Mon, は関係ないだろ
348:名無しさん@お腹いっぱい。
08/06/25 12:52:40
月の名前と曜日の名前の区別がつかないんですね、わかります
349:名無しさん@お腹いっぱい。
08/06/25 13:02:27
で、そろそろ純正シェルでの解法を誰かが投稿する時間だな
350:名無しさん@お腹いっぱい。
08/06/25 13:08:17
>>338
本当に日付は >>338 のフォーマットしかないと限定していいの?
だったら >>343 でも動くだろうけど、
中には、
Mon Jun 2 08:15:45 JST 2008
みたいな行もあるという仕様じゃないの?
だったら、
(今のところ) >>340 が正解。
351:名無しさん@お腹いっぱい。
08/06/25 13:09:45
ずいぶん勝手な解釈だな。
352:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/25 13:13:38
ああ echo $4.`month $3`.`expr $2 + 0` かな。
354:名無しさん@お腹いっぱい。
08/06/25 13:15:05
いや、>>344 は、>>343 をシェルで実行しようとしたんじゃないだろうか?
どこにも○○○だとは書かれてないから。
355:名無しさん@お腹いっぱい。
08/06/25 13:31:19
>>350
だったら、4桁数字だったら西暦、
2桁数字だったら日付、
Jan Feb等に一致したら月、
それ以外のフィールドは無視、というように
全フィールドをチェックすればできるな。
356:名無しさん@お腹いっぱい。
08/06/25 14:22:51
338です。
あっという間にたくさんのレスが。ありがとうございます。
>>340
>>343
>>352
ありがとうございます。
#!/bin/sh
の後に書いてやってみていますが、まだうまくいきません。
基本的な書き方がわかっていなさすぎなんでしょうね。
>>350
日付のフォーマットはこれだけ限定です。
過去スレ等、さらに読みに行ってきます。
本当に皆さんありがとう。
357:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/25 14:43:10
宗教的に問題ないなら GNU date 入れちゃいなよ。
便利だよ。
359:名無しさん@お腹いっぱい。
08/06/25 14:44:15
宗教上の理由でそれは出来ません
360:名無しさん@お腹いっぱい。
08/06/25 14:46:23
ならしょうがない。
361:名無しさん@お腹いっぱい。
08/06/25 19:29:20
輸血と献血とGNU date は家訓で禁じられてます
362:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/25 20:27:13
use Date::Parse;
($s,$m,$h,$d,$M,$y) = strptime($_);
print $y+1900 . "." . $M+0 . "." . $d+0 . "\n";
364:名無しさん@お腹いっぱい。
08/06/25 21:12:11
>>362
純正シェルでの >>357 の回答の後にperl出しても意味ないなぁ。
365:名無しさん@お腹いっぱい。
08/06/25 22:43:18
perlやGNU dateの方が書式に寛容
366:名無しさん@お腹いっぱい。
08/06/25 22:47:29
perlが入っててもDate::Parseが入ってない環境が多いから動かない環境が多い。
367:名無しさん@お腹いっぱい。
08/06/26 01:57:12
純正シェル(笑)
368:名無しさん@お腹いっぱい。
08/06/26 02:04:04
シェルってゆうな。クズ。
369:名無しさん@お腹いっぱい。
08/06/26 02:05:33
貝殻
370:名無しさん@お腹いっぱい。
08/06/26 02:12:50
ゆうなって言うなこのクズ
371:名無しさん@お腹いっぱい。
08/06/26 03:07:08
稲村
372:265
08/06/26 17:31:41
bashのshはシェルの略なので
これからはbaと呼ぶことにします。
373:名無しさん@お腹いっぱい。
08/06/27 10:24:30
338、356です。
勉強始めたばかりで適切なスレを見つけるのもままならない。
質問した後に、スレ違いだったようだと反省している。
実はbashでやっているんだが・・・ってこれを最初に言うべきだったんだね。
皆さんにいただいたヒントでなんとかしようとさらに勉強するつもりだ。
ほんとに親切な人が多いスレで感激しているよ。
頑張ってみる。ありがとう。
374:名無しさん@お腹いっぱい。
08/06/27 10:27:48
まだ出来てないのかよ。
375:名無しさん@お腹いっぱい。
08/06/27 10:32:36
>>373
>>357 をコピペして、適当なファイルに保存(ファイル名hoge)する。
$ chmod +x hoge
$ ./hoge < hoge1.txt
2008.5.16
2008.5.18
2008.6.2
ここまで書かないとわからなかったのかな?
パーミッションとか、リダイレクトとか、./ を付けることとか、、
376:名無しさん@お腹いっぱい。
08/06/27 10:36:14
パーミッションとかわからければ、テキストファイルとして保存して
$ sh hoge < hoge1.txt
でいいし。
377:名無しさん@お腹いっぱい。
08/06/27 10:47:21
>>375
できましたっ!
みんな、ありがとう!
378:名無しさん@お腹いっぱい。
08/06/28 16:35:09
ホストをIPに変換するシェルを発行する時、
getentを使いたいのですが、getentって純正シェルでも使えましたっけ?
あと、他にgetentが使えないシェルはありますか?
379:名無しさん@お腹いっぱい。
08/06/28 16:58:49
ホストの人かコンピューターをプロトコルに変換するシェルを開発されるスーパーハカーの方ですねわかります
380:名無しさん@お腹いっぱい。
08/06/28 17:48:26
>>378
外部コマンドならシェルの種類は関係ないでしょ。
381:名無しさん@お腹いっぱい。
08/06/28 18:18:22
zshではシェル関数になっていた > getent
382:名無しさん@お腹いっぱい。
08/06/28 18:21:22
それは俺の知らないzshだ
383:名無しさん@お腹いっぱい。
08/06/28 18:25:32
>>381
それは漏れの知らないzshだ
384:名無しさん@お腹いっぱい。
08/06/28 18:27:34
ashでは not foundって言われた > getent
385:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/28 21:36:48
>>385
その定義だと、コロンで区切られてる前提になってるから、
passwdとgroupにしか使えないね。 (hostsには使えない)
387:名無しさん@お腹いっぱい。
08/06/28 21:47:04
getent hostsって微妙だからな。
libresolv直接叩いているアプリも結構あるし。
388:名無しさん@お腹いっぱい。
08/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
08/06/29 03:13:28
全然ダメだったorz 教えてください。
390:名無しさん@お腹いっぱい。
08/06/29 03:30:41
echo $text | grep -E -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'
-oなんてオプション他のgrepにあるか知らないけど
391:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/29 09:40:50
だからぁ~、sedはスレ違い。
>>393 は何を言いたいんだ? (392のあとで)
396:名無しさん@お腹いっぱい。
08/06/29 09:43:09
と言うか、>>393 の頭の 's/ の部分ですでにsed文法エラーじゃん。
初心者はちゃんと動作確認してから書きなさい。
>>394 が正解。
397:名無しさん@お腹いっぱい。
08/06/29 09:50:09
>>394 でも、
hoge123 192.168.123.45
みたいな入力があると失敗する。続きは sedスレでやってくれ。
398:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/29 09:54:07
模範解答の発行まだー??
400:名無しさん@お腹いっぱい。
08/06/29 10:04:16
398 で桶
401:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/06/29 21:44:44
>>401
>>397 の指摘で失格
403:名無しさん@お腹いっぱい。
08/06/30 01:27:41
よほどパフォーマンスに差がありでもしないかぎり、
書き易く読み易いようにすればいい。
404:388
08/06/30 01:39:46
みなさま色々とありがとうございました。
>>398
ちゃんと処理できるみたいですし、このスレでも良い評価なので
これを使ってあげようかと思います。感謝してください。
この処理は、あるとても重要な国家プロジェクトで使用されます。
コメントで Powered by 398 と入れておきますね。
405:名無しさん@お腹いっぱい。
08/06/30 01:59:48
なわけねーだろ
406:名無しさん@お腹いっぱい。
08/07/02 17:31:55
誰かお願いします。
wk=f
配列にa b c d とそれぞれ入ってるとして
ループでぐるぐるっと、wkと一致するものを探したいんですが、
もし一致するものが無かった場合の終了条件って、どうしたらいいですか。
407:名無しさん@お腹いっぱい。
08/07/02 17:41:16
日本語でおk
408:名無しさん@お腹いっぱい。
08/07/02 17:42:11
純正シェルに配列はない。配列に相当する別の処理をしているなら、
その処理方法を明示して質問し直した方がいい。
409:名無しさん@お腹いっぱい。
08/07/02 17:43:56
>>406
多少エスパーして回答。
ループにwhileを使うんじゃなくて、
forで配列の要素分ループすれば、たとえ一致するものが無かった場合でも
ループはちゃんと終了するから問題なし。
410:名無しさん@お腹いっぱい。
08/07/02 17:48:51
ループの返り値ってことなら、breakとかを使わん限り最後のコマンドの実行結果になるから、
ループの最後にfalseを置いとけばいいんじゃないかね。
成功した場合はbreakで抜ける、ということならば、だけど。
411:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/07/02 17:57:26
皆様あざーっす!
とりあえず今、KSHって何だって事から教わりました。怒鳴り含み。
ちょっと参考にして、考えます。皆暖かいアドバイスども!
413:名無しさん@お腹いっぱい。
08/07/02 17:59:21
突然何を言い出すんだ?
414:名無しさん@お腹いっぱい。
08/07/02 18:08:51
キチガイ警報
415:名無しさん@お腹いっぱい。
08/07/02 22:22:49
作成したいファイル名が書かれたtxtのリストから、
ファイルを作成するにはどうすればよいでしょうか?
たとえばテキストの中身に、
hoge
foo
bar
とあったとして、
hogeとfooとbarというファイルを作成したいのです。
416:名無しさん@お腹いっぱい。
08/07/02 22:34:11
>>415
touch $(cat txt)
417:名無しさん@お腹いっぱい。
08/07/02 22:46:52
>>416
なんでこれでできるのかわからないですができました
ありがとうございます
418:名無しさん@お腹いっぱい。
08/07/03 02:22:28
>>416 それだと大量だった場合に引数溢れのエラーにならないかな?
419:名無しさん@お腹いっぱい。
08/07/03 02:25:14
>>418
じゃあ
cat txt | xargs touch
420:名無しさん@お腹いっぱい。
08/07/03 03:05:13
cat txt|while read FNAME
do
touch $FNAME
done
べたですがw
421:名無しさん@お腹いっぱい。
08/07/03 07:17:23
>>419
xargsは使っちゃいけないコマンド。
>>420
それだと catが無駄。touchがむだ。
while read FNAME
do
> "$FNAME"
done < txt
422:名無しさん@お腹いっぱい。
08/07/03 07:19:13
>>416
bash依存、失格。
> `cat txt`
423:名無しさん@お腹いっぱい。
08/07/03 07:23:31
>>421
415とは関係ないんだけど
パイプでxargsに渡すときに空白をエスケープするにはどうすればいいの
例えばfindで見つけたパスに空白が含まれてた場合とか
424:名無しさん@お腹いっぱい。
08/07/03 07:49:19
>>423 テンプレ>>6
425:名無しさん@お腹いっぱい。
08/07/03 07:55:01
>>424
テンプレにあったとは
すいませんでした
426:名無しさん@お腹いっぱい。
08/07/03 08:02:10
テンプレにはないが、find -print0 | xargs -0 するんじゃなくて、
find -exec +
するのが今後のお勧めだな。-exec の後ろ、\; じゃなくて + ね。
これでxargsは完全に不要!
427:名無しさん@お腹いっぱい。
08/07/03 11:31:21
質問です。
case文でwhile文を使用する時
case "$a" in
"a.c")
while[ $flag = false || $i -ne 10 ] ; do
処理1
done
の時、doneの跡に;;でおkですか?
428:名無しさん@お腹いっぱい。
08/07/03 11:56:24
>>421がFAだけど、敢えてxargs -0で。
cat list.txt | perl -ane '{ chop; printf("%s%c", $_, '\0'); }' | xargs -0 touch
429:名無しさん@お腹いっぱい。
08/07/03 11:57:44
>>426
この+でappendって、最近のfindはどれにもあるの?
430:名無しさん@お腹いっぱい。
08/07/03 11:58:53
純正findにないから使っちゃだめ
431:名無しさん@お腹いっぱい。
08/07/03 12:18:04
>>430
純正findにもあるんだなぁ、+ が。よって find -exec + で FA。
432:名無しさん@お腹いっぱい。
08/07/03 12:31:00
xargs を使っちゃいけない理由キボンヌ
便利だし早いからコマンドラインで結構使うんですが・・・
433:名無しさん@お腹いっぱい。
08/07/03 12:31:12
純正find にないのは -print0 の方ですね。
434:名無しさん@お腹いっぱい。
08/07/03 12:40:55
純正なんとかっていう意味の曖昧な言い方は止めろ
今はPOSIX準拠かどうかの話をしてるようだが、
純正シェルは古い/bin/shの話だったりでわからん
435:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/07/03 12:46:31
& >>6 (>>424は読んだ?)
437:名無しさん@お腹いっぱい。
08/07/03 13:03:20
>>435
なるほど、理解しますた。分かってれば使えないことはないですな。
438:名無しさん@お腹いっぱい。
08/07/03 16:40:13
まぁ実験して動いたらそれでまずOK。
でその後にリファイン(リファクタリング?)
これが大事。
439:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/07/03 18:16:12
>>439
いや、だから、Solarisでも find dir -exec hoge + が使えるんだよ。
よってprint0云々は一切不要。
441:名無しさん@お腹いっぱい。
08/07/03 18:21:41
>>439
ファイル名に \ が含まれていた場合、readが誤動作する(違うファイル名とみなされる)
Solarisの xargsには -0 オプションがない。
で、>>440 の方法で解決。
442:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/07/03 19:55:30
やっぱ速さってみんな気になるん?
しっかりきっちり動けば、速度は問題ないって思ってる俺は未熟?
いかにもベターってのはやらないけどー。
444:名無しさん@お腹いっぱい。
08/07/03 20:03:16
テクいことして読み難くなるなら多少遅くても分かりやすく書く
445:名無しさん@お腹いっぱい。
08/07/03 20:08:46
>>442
straceって、、Linuxかよw
446:名無しさん@お腹いっぱい。
08/07/03 23:57:40
>>443
必要な時に必要なことをやる。当たり前のこと。
後の話はマ板でやって。
447:名無しさん@お腹いっぱい。
08/07/04 01:32:47
cronで毎日回しているプログラムの処理時間が
16時間越えたらちょっと悩む
448:名無しさん@お腹いっぱい。
08/07/04 08:05:24
kshでユーザIDのリストを計表にして印刷したいんだけど
こんなの作った人いますか?
どこかにサンプルありませんかね。OSは、AIX5.3です。
449:名無しさん@お腹いっぱい。
08/07/04 08:27:34
>>448
計表の正確なところがわからんが、
while read user pass uid rest; do echo $uid $user ; done < /etc/passwd
ってことか?
あと、必要なら sort -n をかましてね。
kshじゃなくて純正シェルでできるよ。
450:名無しさん@お腹いっぱい。
08/07/04 08:29:48
>>448
あ、IFS設定抜けてた。
IFS=:; while read user pass uid rest; do echo $uid $user ; done < /etc/passwd
451:名無しさん@お腹いっぱい。
08/07/04 08:42:50
ksh -c lpr < /etc/passwd
452:名無しさん@お腹いっぱい。
08/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:名無しさん@お腹いっぱい。
08/07/04 11:15:19
>>452
echo `wc -l < $file`
454:名無しさん@お腹いっぱい。
08/07/04 11:28:33
>>452
長文で cutを力説してるのに、
>>453 で cutすら必要ないというオチにワロタ
wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので
cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。
455:名無しさん@お腹いっぱい。
08/07/04 11:33:53
> それともいったん sh の変数に代入する?
質問者が用意した選択肢を誇らしげに答える>>453-454が憐れ。
456:名無しさん@お腹いっぱい。
08/07/04 11:38:03
空白文字のパディング方式に、
暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。
仕様の特殊化しても嬉しくない。
457:452
08/07/04 11:38:04
いやいや
> wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので
役に立ちました! 確かに笑った。
458:名無しさん@お腹いっぱい。
08/07/04 11:38:44
>>455
おまえ、シェルスクリプト書いたことないだろ?
>>453 では一切「sh の変数に代入」は行なっていないがww
459:452
08/07/04 11:50:48
>>456
いやいや、そうなんですよ。 cut ってつまり結局
他のコマンドと組み合わせるには中途半端なツールなんですよ。
単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが…
awk や bash は区切り文字を変えるだけでも結構タイプする印象が。
いや、変にこだわってごめんなさい。
460:名無しさん@お腹いっぱい。
08/07/04 12:06:44
つ awk -F:
461:名無しさん@お腹いっぱい。
08/07/04 15:50:34
cut はデリミタの連続を指定できれば使える君に化けるんだがな。
462:名無しさん@お腹いっぱい。
08/07/08 07:58:27
シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが
463:名無しさん@お腹いっぱい。
08/07/08 08:00:46
>>462
インタプリタ型言語だから。
(fork/execが遅いと言うだけが理由ではない。
内部コマンドだけを使ってもCよりも遅いから)
464:名無しさん@お腹いっぱい。
08/07/08 10:52:14
でも一番のボトルネックは fork, exec だと思うぞ
465:名無しさん@お腹いっぱい。
08/07/08 11:29:48
プロファイルしてみると分かるが、文字列処理も結構コストが高い。
stat(2)せずにls -lしてからパターンマッチなど。
shは文字列がグルーになっているから。
466:名無しさん@お腹いっぱい。
08/07/08 14:57:58
パイプとかバッククォートとかガンガン使うから、
それだけでシステムコール連発になっちゃうもんね。
文字列処理なのに write(2) とか使うわけだw
467:名無しさん@お腹いっぱい。
08/07/08 21:54:18
レスありがとう
ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?
468:名無しさん@お腹いっぱい。
08/07/08 21:56:21
>>467
全然合ってない。それは MS-DOSのニセパイプの動作。
469:名無しさん@お腹いっぱい。
08/07/08 22:14:44
>>468
詳しくおしえてください・・・
470:名無しさん@お腹いっぱい。
08/07/08 22:21:27
>>469 シェル pipe dup2 とかで検索してみ。
471:名無しさん@お腹いっぱい。
08/07/08 22:50:12
そんな検索語じゃわかるわけないだろ。
pipe(2)だって無限にバッファがあって、
入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。
472:名無しさん@お腹いっぱい。
08/07/08 23:22:32
無限の記憶装置は存在しないのでそんな可能性はゼロだな。
473:名無しさん@お腹いっぱい。
08/07/08 23:25:31
MS-DOSのパイプ仕様を実装することも不可能だな。
474:名無しさん@お腹いっぱい。
08/07/08 23:36:10
コマンド1 | コマンド2
本来のパイプだと、
コマンド1 の標準出力 = コマンド2の標準入力
になるような操作(dupとか)が裏で行われる。
コマンド1と2は同時に実行される。一時ファイルを介さない。
嘘パイプの場合は、
コマンド1 > 一時ファイル
コマンド2 < 一時ファイル
削除 一時ファイル
なだけ。
475:名無しさん@お腹いっぱい。
08/07/08 23:57:58
例えば
cat ばかでかいファイル | head -1
だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します
そのときcatの処理が途中だったらどうなるんですか?
476:名無しさん@お腹いっぱい。
08/07/09 00:11:11
やってみろよ
477:名無しさん@お腹いっぱい。
08/07/09 00:50:57
>>475
バッファってしってるか?
478:名無しさん@お腹いっぱい。
08/07/09 01:22:00
>>475
catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。
479:名無しさん@お腹いっぱい。
08/07/09 02:16:51
そのshigpipeを発行するのはパイプさん?