トップページ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/
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 あたりにパイプラインについて書いてない?
0401名無しさん@お腹いっぱい。2005/06/27(月) 18:09:56
デケデケデケデケ
0402名無しさん@お腹いっぱい。2005/06/27(月) 20:08:50
キュッキュッ
0403名無しさん@お腹いっぱい。2005/06/28(火) 17:07:24
AIX の sh だけど特定のファイルのタイムスタンプを取得する良い方法はありますか?
ls の結果を解析すれば取れるだろうけどもそっとスマートなやり方はないかな?
0404名無しさん@お腹いっぱい。2005/06/28(火) 17:16:53
>>403
Linuxだけど stat -c %y <file> で last modified を取得してまつよ
でも、表示が冗長なので他にも方法があれば知りたいところ
0405名無しさん@お腹いっぱい。2005/06/28(火) 17:44:57
perl -e '@stat=stat("/"); print localtime($stat[9]) . "\n";'
0406名無しさん@お腹いっぱい。2005/06/29(水) 14:28:09
>>403
またお前か。
0407名無しさん@お腹いっぱい。2005/06/29(水) 16:06:58
>>406
まるち?
0408名無しさん@お腹いっぱい。2005/07/06(水) 00:00:30
dirA/hoge01_1.txt
dirA/hoge01_2.txt
dirA/hoge01_10.txt
dirA/hoge01_11.txt
があった時に、find . -name "*.txt" して、この順番で表示させたいのですが、
やってみると、FreeBSDのfindだと期待通り表示されますが、cygwin の find
だと

dirA/hoge01_1.txt
dirA/hoge01_10.txt
dirA/hoge01_11.txt
dirA/hoge01_2.txt

と表示されてしまいます。これを上のように表示させる良い方法はないでしょうか?
find の出力を sort -t "_" -k2 とかやってもうまくいきませんでした。
0409名無しさん@お腹いっぱい。2005/07/06(水) 00:12:29
文字列でソートしたら下のようになるよね。lsもそうなる。linux
でfindしたら上になった。
0410名無しさん@お腹いっぱい。2005/07/06(水) 00:12:49
>>408
_と.で区切れ。
0411名無しさん@お腹いっぱい。2005/07/06(水) 00:20:48
find は見つかった順に出力されるから、
同じマシンであってさえ、ファイルの作成した時期とかによって
出力の順番が異なることがありうるぞ。
04124082005/07/06(水) 00:34:58
>>409-410
どうもです。

とりあえず sort -n -t "_" に通したら、うまくいきますた。

>>411
ということは、>>408の上のように表示されてもそれはたまたま
なので、sort に通した方が良さそうですね。
0413名無しさん@お腹いっぱい。2005/07/06(水) 00:45:35
>>410
sort でセパレータを2つ指定できるの?

>>412
「-k」を指定しないなら「-t」は不要だと思う。
その例なら「-n」だけでうまくいくんだろう。
ただ、「-n」は数値以外のフィールドでソートする場合(今回の場合)、
動作は保証されないと思う。
0414名無しさん@お腹いっぱい。2005/07/06(水) 10:37:35
man見る限りsortのセパレータは正規表現じゃないな
0415名無しさん@お腹いっぱい。2005/07/06(水) 13:10:33
シェルでファイルの拡張子以外の部分(正確にはピリオドより前の部分)
を取得する方法をおしえてくださいませ。

for i in `ls *txt`
do
cat $FILE.txt | 適当な処理 > $FILE.doc
done

みたいなことをしたい。
前もって、foo だけを取得して、$FILE=foo としたい。。。
0416名無しさん@お腹いっぱい。2005/07/06(水) 13:13:55
FOO=`basename $i .txt`
0417名無しさん@お腹いっぱい。2005/07/06(水) 13:15:53
ああ、なんかめちゃくちゃや。。。
訂正。

for in `ls *txt`
do
ここで、$FILE にファイルのピリオドより前の部分を突っ込みたい。
cat $i | 適当な処理 > $FILE.doc
done
■ このスレッドは過去ログ倉庫に格納されています