トップページunix
1001コメント285KB

シェルスクリプト総合 その2

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2005/04/17(日) 00:17:17
シェルスクリプトの総合スレです。スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。

□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/

□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/

□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0301名無しさん@お腹いっぱい。2005/06/14(火) 23:24:24
xargs
0302名無しさん@お腹いっぱい。2005/06/14(火) 23:31:43
>>300
idって何よ。priorityあるいはniceか?どっちにしてもエスパーな質問だな……
0303名無しさん@お腹いっぱい。2005/06/14(火) 23:47:02
>>302
vmstatコマンドを打つとcpuのしたにus,sy,idと表示されますよね?
idleだとおもいます。
0304名無しさん@お腹いっぱい。2005/06/15(水) 00:16:38
思いますじゃなくてmanを嫁。
0305名無しさん@お腹いっぱい。2005/06/15(水) 00:24:48
idle timeだよね
0306名無しさん@お腹いっぱい。2005/06/15(水) 05:12:02
>>300
ファイルを削除ディレクトリに移動してディレクトリごと削除
0307名無しさん@お腹いっぱい。2005/06/15(水) 09:32:12
>>306
移動の時に同じ質問が
時間かけず、idを高く保って、大量のファイルを移動する方法ありますきあ?
0308名無しさん@お腹いっぱい。2005/06/15(水) 10:09:42
そもそも何でそんな馬鹿げた要求が出てきてるのかわからんなぁ。
idle を増やしたいなら、ファイル消すたびに sleep 10 とかしたら?

>forのなかで5個ずつ消すと

rm file1; rm file2; ... と rm file1 file2 ... で
だいぶ違うわけだがどっちよ?
0309名無しさん@お腹いっぱい。2005/06/15(水) 20:21:21
借鯖とかでキャップされてるんじゃないの
0310名無しさん@お腹いっぱい。2005/06/16(木) 00:09:18
>>308

rm file1 file2
でしょ

rm file1; rm file2;
は時間かかるぽい
0311名無しさん@お腹いっぱい。2005/06/16(木) 06:27:49
fork に時間がかかるんでしょ
じぶんで thread で unlink するコマンドを書けば
0312名無しさん@お腹いっぱい。2005/06/16(木) 07:42:19
じぶんで thread で unlink するコマンドを書けるシェルなんてあるのか?

まぁ正解はシェルスクリプトで書くのをあきらめろってとこか。
0313名無しさん@お腹いっぱい。2005/06/16(木) 08:04:16
つ[Java]
0314名無しさん@お腹いっぱい。2005/06/16(木) 20:58:46
基本的なことで悩んでいます。
コマンドラインから
ls -ld /hoge/???/????? | awk "{print $9}"
と実行しますと<結果1>のように動作するのですが、
このコマンドをsh(bash)で実行すると<結果2>のように
エラーが吐かれてしまいます。
どのようにすればshで動作させることが出来るのか教えていただけないでしょうか?

<結果1>
/hoge/aaa/bbbbb
/hoge/aaa/ccccc
/hoge/ddd/eeeee




<結果2>
sh -xf hoge.sh
#ls -ld /hoge/???/?????
/hoge/???/?????は見つかりません。
0315名無しさん@お腹いっぱい。2005/06/16(木) 21:15:14
>>314
ルートにhogeはあるのか?
03163142005/06/16(木) 21:31:28
>>315さん
ルートにhogeがあります。
補足説明しますと、
今回求めたいディレクトリは
ルート直下のhogeの中に/日付/時間と作られています。
パスの長さは一定なのでワイルドカードの[?]を用いて取得したのですが、
shに組み込むとうまくいかなかったのです。
0317名無しさん@お腹いっぱい。2005/06/16(木) 21:49:28
sh -c 'ls -ld /hoge/???/????? ' してみたらどうなる?
0318名無しさん@お腹いっぱい。2005/06/16(木) 22:26:41
awk '{print $9}'
0319名無しさん@お腹いっぱい。2005/06/16(木) 22:30:34
>>315
sh -xf しちゃ駄目だよ。
f はワイルドカード禁止オプション。
sh -x hoge.sh
でやってみろ。

あと、回答してる香具師、みんなハズシ。
0320名無しさん@お腹いっぱい。2005/06/16(木) 22:46:14
ここってC言語スレより殺伐としてないですね・・・。
03213142005/06/16(木) 22:56:16
>>317さん、318さん、319さん
回答有難うございます。
只今実行できる環境ではないので報告は明日になると思います。

>-f はワイルドカード禁止オプション。
知りませんでした。。。
0322名無しさん@お腹いっぱい。2005/06/16(木) 23:02:51
知らないオプションむやみにつける癖やめたほうがいいよ。
ディレクトリ消すとき 必ず rm -fr するタイプ?
0323名無しさん@お腹いっぱい。2005/06/16(木) 23:08:08
それがなんかいかんのか?
0324名無しさん@お腹いっぱい。2005/06/16(木) 23:20:13
>>323
美しくない。
0325名無しさん@お腹いっぱい。2005/06/16(木) 23:31:12
わけもわからずperl -wと付けていた時期が俺にもありました
0326名無しさん@お腹いっぱい。2005/06/16(木) 23:34:36
-f 付けるのはCシェルスクリプターだね
03273142005/06/18(土) 03:08:00
結果報告。
「-f」を外した所無事に出来ました。
有難うございました。
何故「-f」を付けたかというと、手元にあった書籍に書いてあったと認識してたんですけど
再度読み直してみるとそんな事は一言も書かれてませんでした。
凹みました。

>>322さん
するタイプであります・・・
0328名無しさん@お腹いっぱい。2005/06/18(土) 20:07:42
>>324
後学のために美しいやりかたを教えてくれたまえないか
0329名無しさん@お腹いっぱい。2005/06/18(土) 20:51:30
rm -r ですむときは -f は除いたほうがいいし、
rmdir ですむときはそうしろってことじゃないの。
美しい美しくないというより、
rm -fr は危ない。
0330名無しさん@お腹いっぱい。2005/06/18(土) 23:57:02
f なんかなくてもサクっと消えてくれます
0331名無しさん@お腹いっぱい。2005/06/19(日) 18:15:14
おれはmvもrmも-iつきでエイリアスしてるけど、

ワイルドカードや再帰削除の場合はいちいち聞かれるとウザいので
-fつける。でもこういう危険な場合に限って-fつけるんでは、実は
あまり意味が無い気がする

二回ぐらい
rm -f *.jpg
のつもりで
rm -f *>jpg
とtypoして、カレントディレクトリの中身全削除したことある。
シフトキーの入力が甘かったりするとこうなる。
0332名無しさん@お腹いっぱい。2005/06/19(日) 18:22:38
rmはゴミ箱スクリプトにすればよい。
0333名無しさん@お腹いっぱい。2005/06/19(日) 21:21:53
touch ' -i'
0334名無しさん@お腹いっぱい。2005/06/20(月) 00:43:47
>>333
touch ./-i
やってみたが、目からウロコ
0335名無しさん@お腹いっぱい。2005/06/20(月) 08:16:33
http://www.nurs.or.jp/~asada/FAQ/UNIX/section3.6.html
0336名無しさん@お腹いっぱい。2005/06/20(月) 18:23:18
ダウンロードしたファイルを、ファイルの作成日ごとに、日付の入ったフォルダを作成して、移動するうまい方法ってありませんか?
もしよろしければ、何か手がかりをください。
0337名無しさん@お腹いっぱい。2005/06/20(月) 19:12:39
m9(^Д^)プギャーーーッ
0338名無しさん@お腹いっぱい。2005/06/20(月) 19:13:00
>>336
まず、「日付の入ったフォルダ名」の名称自体を得るには、
dateコマンドに適当なスイッチをつければよい。厳密には
環境依存だからmanせよ。

つぎに、あるコマンド(例えばdate)の結果(標準出力)を
変数に入れたり、もしくは他のコマンドで利用するには、
backquoteを使う。
value=`...`
とか、
mkdir `....`
ね。これで、目的の名前のフォルダできるだろ。

あとは、適当に移動(mv)せよ。

0339名無しさん@お腹いっぱい。2005/06/20(月) 19:32:17
>>338
ありがとうございます。
0340名無しさん@お腹いっぱい。2005/06/20(月) 19:32:38
>>337
> m9(^Д^)プギャーーーッ

笑わないでください。
0341名無しさん@お腹いっぱい。2005/06/20(月) 20:17:47
任意のリモート・ホストの、任意のディレクトリが存在するか
チェックするにはどのようなすればよいでしょうか?
rshとかtestでがんばってたんですが、挫折しました・・・
0342名無しさん@お腹いっぱい。2005/06/20(月) 20:32:04
>>341
ssh HOST test -d DIR
0343名無しさん@お腹いっぱい。2005/06/20(月) 20:32:36
>>341
ssh 使え。
ssh foo test /foo
echo $?
0344名無しさん@お腹いっぱい。2005/06/21(火) 01:51:02
任意のファイルを先頭n列、後ろからm列を取り除いたファイルに
編集したいんですが、どうすればいいでしょうか?
Cでやるのは避けたいんだけど。。。
0345名無しさん@お腹いっぱい。2005/06/21(火) 01:59:08
>>344
cut
0346名無しさん@お腹いっぱい。2005/06/21(火) 02:05:36
>>345
詳しく
0347名無しさん@お腹いっぱい。2005/06/21(火) 02:07:02
>>346
man cut
0348名無しさん@お腹いっぱい。2005/06/21(火) 02:14:08
質問を間違えてた。
任意のファイルを先頭n行、後ろからm行を取り除いたファイルに
編集したいんですが・・

0349名無しさん@お腹いっぱい。2005/06/21(火) 02:16:08
head, tail
0350名無しさん@お腹いっぱい。2005/06/21(火) 02:18:32
head,tailじゃ指定行の表示しかできないでしょ。
0351名無しさん@お腹いっぱい。2005/06/21(火) 02:20:02
>>350
> WORD
Open file WORD for writing as standard output. If the file does
not exist then it is created. If the file exists, and the CLOBBER
option is unset, this causes an error; otherwise, it is truncated
to zero length.
0352名無しさん@お腹いっぱい。2005/06/21(火) 02:20:56
>>350
単独ではな。
0353名無しさん@お腹いっぱい。2005/06/21(火) 02:28:30
うーんわからんです。
ファイルをcatしてパイプで繋げてheadとかですか?
03543482005/06/21(火) 02:43:05
tail 先頭n行-ライン行数
head 後ろm行-ライン行数ってのは思いついたが、
ファイル行数が数万とかだと処理遅いよね・・・
0355名無しさん@お腹いっぱい。2005/06/21(火) 02:44:37
全部でw行あるとして
tail +$((n+1)) |head -$((w-m-n))
0356名無しさん@お腹いっぱい。2005/06/21(火) 19:22:40
tail +$((n+1)) file | tail -r | tail +$((m+1)) | tail -r
0357名無しさん@お腹いっぱい。2005/06/21(火) 20:51:21
結局スクリプトを書くのが早くて速い。

awk 'NR>m{a[NR+n]=$0;if(NR in a) print a[NR]}'
0358名無しさん@お腹いっぱい。2005/06/21(火) 21:35:22
>>355
できました。
ありがとうございました。

結局どれがベストかわかんないけど、、、

0359名無しさん@お腹いっぱい。2005/06/21(火) 21:59:30
スクリプト書いちゃうんだったらrubyで書くぞ。

ruby -e 'ARGF.to_a[n..-m].display'
0360名無しさん@お腹いっぱい。2005/06/22(水) 00:31:22
sedとawkはセーフ
0361名無しさん@お腹いっぱい。2005/06/22(水) 00:50:17
awkは高機能過ぎなので禁止。
0362名無しさん@お腹いっぱい。2005/06/22(水) 06:17:16
wget -i URLリストファイル
で複数サイトを取得し、それをindex.html.1 index.html.2・・のように連番をつけて保存したいのですが、
wget -i url_list.txt -O index.html
だとindex.htmlに次々に上書きしてしまいます。
どのように直すべきか教えてください。よろしくお願いいたします。
0363名無しさん@お腹いっぱい。2005/06/22(水) 07:20:50
>>362
-O index.html なしで。
wget の質問ならくだ質行け。
0364名無しさん@お腹いっぱい。2005/06/22(水) 08:16:50
>>363
いや、これは連番のH画像の守備範囲だろ。
0365紹介しとくよ2005/06/22(水) 10:10:46
連番のH画像を一気にダウンロードする
http://pc8.2ch.net/test/read.cgi/unix/979106537/
0366名無しさん@お腹いっぱい。2005/06/22(水) 20:56:56
/bin/sh で環境変数に設定できる文字列長の上限ってあるんでしょうか?
どこを見れば良いんだろ。
0367名無しさん@お腹いっぱい。2005/06/22(水) 21:14:37
>>366
fj.unix.shells の2003年1月の記事。
0368名無しさん@お腹いっぱい。2005/06/22(水) 21:36:02
>>367
そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
0369名無しさん@お腹いっぱい。2005/06/22(水) 21:40:11
>>367
そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
0370名無しさん@お腹いっぱい。2005/06/22(水) 21:43:25
fj ...。
0371名無しさん@お腹いっぱい。2005/06/22(水) 21:47:11
fj を知らなくても
fj.unix.shells 2003 1
でググってみるとすぐわかると思うんだけど。。。
ttp://groups.google.com/groups?hl=ja&selm=avgti0$7h6$1@nriinetnews.nri.co.jp
03723662005/06/22(水) 22:02:10
ちなみに、>>368 は質問者ではごじゃいません。
0373名無しさん@お腹いっぱい。2005/06/22(水) 22:36:19
さもありなん
0374名無しさん@お腹いっぱい。2005/06/22(水) 23:32:43
>>373
お前、古典の成績よくなかっただろw
0375名無しさん@お腹いっぱい。2005/06/23(木) 00:36:40
何で古典が関係あんの?
0376名無しさん@お腹いっぱい。2005/06/23(木) 00:51:40
>>374
お前、現国の成績よくなかっただろw
0377名無しさん@お腹いっぱい。2005/06/23(木) 01:53:22
fj. が通じない世代なのね。。。はぁ・・・。
0378名無しさん@お腹いっぱい。2005/06/23(木) 01:59:20
fj世代はいい年こいてゆがんだ性格がまだ直らないようだな
0379名無しさん@お腹いっぱい。2005/06/23(木) 09:52:15
いい年こいてるから直んないんだよ
0380名無しさん@お腹いっぱい。2005/06/23(木) 19:04:30
Musical Baton というチェーンメールの blog 版をもらった。
ファイルシステム内の音楽ファイルの容量を得るスクリプトキボン。
0381名無しさん@お腹いっぱい。2005/06/23(木) 19:19:14
> Musical Baton というチェーンメールの blog 版をもらった。
TrackBack といい、これといい、なんで blog 界の奴らはこんな糞なことしか思い付かないのか。
0382名無しさん@お腹いっぱい。2005/06/23(木) 23:52:08
bashでの質問です

vmstatの出力結果を5秒毎にファイルに記録してます
vmstat 5 > vmstat_log

記録状況を確かめようとtail -fして監視してみたんですが

どうも途中でバッファリングされているのか20行程まとめて出力が一気に記録されます
vmstatのソースをみたんですが、コマンド自体は出力を毎回フラッシュしているようです

バッファリングされずに5秒毎にリアルタイムに記録したいのですが、
方法はあるんでしょうか
0383名無しさん@お腹いっぱい。2005/06/24(金) 00:05:15
>>382
俺のところではそれでちゃんと5秒くらいごとに一行ずつ表示される。
少なくともbashとは何の関係もないな。
システム依存のスレにいったほうがいい。
0384名無しさん@お腹いっぱい。2005/06/24(金) 00:05:41
スレ違い
0385名無しさん@お腹いっぱい。2005/06/24(金) 00:05:52
>>382
フラッシュしてるのにフラッシュされないってどんな環境?
0386名無しさん@お腹いっぱい。2005/06/24(金) 00:41:36
>>382
tailの-fオプションって、入力が標準入力(パイプ)の時は無視されるんちゃう?
FreeBSDやGnu(やLinux)のtailだとmanにそうかいてあるけど。
03873862005/06/24(金) 00:43:18
>>386
超スマン、これ勘違い。
書き込んだファイルをtail -fしたってことか。
0388名無しさん@お腹いっぱい。2005/06/24(金) 10:37:16
>>386
> 書き込んだファイルをtail -fしたってことか。

それだけじゃなくて、

> tailの-fオプションって、入力が標準入力(パイプ)の時は無視されるんちゃう?

これ、書き方が変だよ。
「入力が標準入力(パイプ)の場合に無視される」んじゃなくて、
「入力(標準入力)がパイプの場合に無視される」でしょ。
例えば「tail -f <vmstat_log」の場合、入力は標準入力だけど、
パイプじゃないから無視されないでしょ。

>>382
OSはなに?
NetBSD で
vmstat 5 >vmstat_log &
tail -f vmstat_log
を実行すると、ちゃんと1行ずつ表示されるよ。
vmstatのソースを読んだOSと、vmstatを実行しているOSが違っていて、
実行している方のOSのvmstatでは、毎行のfflush(stdout)がないん
じゃない?
03893822005/06/25(土) 01:16:44
みなさん御意見ありがとうございます

>>388
OSはRedHatEL3.0です

ちょっとどこのソースをみていたかを確認してみます

ちなみに今手元に環境がないのでcygwinで試したところ同様の現象が起きました
こちらのソースもみてみます・・・


0390名無しさん@お腹いっぱい。2005/06/26(日) 10:09:57
\n で flush されるから、普通いちいち fflush(stdout) なんてしないでしょ?
0391名無しさん@お腹いっぱい。2005/06/26(日) 12:11:34
>>390
man stdio
0392名無しさん@お腹いっぱい。2005/06/26(日) 13:12:51
出力先がファイルのときは\nでflushされない罠
0393名無しさん@お腹いっぱい。2005/06/26(日) 16:49:12
>>333,334 OSは何?
0394名無しさん@お腹いっぱい。2005/06/27(月) 10:50:08
>>390
つ[APUE 2nd Edition]
0395名無しさん@お腹いっぱい。2005/06/27(月) 11:47:03
下記のスクリプトで、
なぜcutはsortの出力のみを処理するのですか?
どうやってcatの出力とsortの出力を区別しているのですか?

#!/bin/sh
cat a.txt |
if [ "$MAILCHECK" = 10 ]
then
sort b.txt | cut -d, -f1
sed 's/hoge/fuga/'
else
sed 's/foo/bar/'
fi
0396名無しさん@お腹いっぱい。2005/06/27(月) 12:55:31
>>395
区別なんかしてない。標準入力を見ているだけだ。パイプによって
標準入力は sort の出力と結び付けられている
0397名無しさん@お腹いっぱい。2005/06/27(月) 13:40:53
よく分かりません。
パイプによって標準入力はsortの出力と結びつけられている。
さらに、catの出力とも結びつけられている。
というように思えます。
catとsortの出力が混じり合ったものをcutが処理すると
予想していましたが、catの出力がsedに渡っているよう
なので混乱しています。

もしかして
1. cutの標準入力にsortの出力を結びつける
2. その結び付きを解除する
3. sedの標準入力にcatの出力を結び付ける
4. その結び付きを解除する
という手順なのでしょうか?

0398名無しさん@お腹いっぱい。2005/06/27(月) 14:13:37
cutの入力にはsortの出力が設定されている。だからsortの出力を処理する。
sedの行では特に入力は明示されていない。だからcatの出力をそのまま処理する。
0399名無しさん@お腹いっぱい。2005/06/27(月) 16:00:12
なんとなく分かりました
パイプについてもっと勉強します
ありがとうございました
0400名無しさん@お腹いっぱい。2005/06/27(月) 16:26:21
man sh あたりにパイプラインについて書いてない?
■ このスレッドは過去ログ倉庫に格納されています