シェルスクリプト総合 その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/
0328名無しさん@お腹いっぱい。
2005/06/18(土) 20:07:42後学のために美しいやりかたを教えてくれたまえないか
0329名無しさん@お腹いっぱい。
2005/06/18(土) 20:51:30rmdir ですむときはそうしろってことじゃないの。
美しい美しくないというより、
rm -fr は危ない。
0330名無しさん@お腹いっぱい。
2005/06/18(土) 23:57:020331名無しさん@お腹いっぱい。
2005/06/19(日) 18:15:14ワイルドカードや再帰削除の場合はいちいち聞かれるとウザいので
-fつける。でもこういう危険な場合に限って-fつけるんでは、実は
あまり意味が無い気がする
二回ぐらい
rm -f *.jpg
のつもりで
rm -f *>jpg
とtypoして、カレントディレクトリの中身全削除したことある。
シフトキーの入力が甘かったりするとこうなる。
0332名無しさん@お腹いっぱい。
2005/06/19(日) 18:22:380333名無しさん@お腹いっぱい。
2005/06/19(日) 21:21:530334名無しさん@お腹いっぱい。
2005/06/20(月) 00:43:47touch ./-i
やってみたが、目からウロコ
0335名無しさん@お腹いっぱい。
2005/06/20(月) 08:16:330336名無しさん@お腹いっぱい。
2005/06/20(月) 18:23:18もしよろしければ、何か手がかりをください。
0337名無しさん@お腹いっぱい。
2005/06/20(月) 19:12:390338名無しさん@お腹いっぱい。
2005/06/20(月) 19:13:00まず、「日付の入ったフォルダ名」の名称自体を得るには、
dateコマンドに適当なスイッチをつければよい。厳密には
環境依存だからmanせよ。
つぎに、あるコマンド(例えばdate)の結果(標準出力)を
変数に入れたり、もしくは他のコマンドで利用するには、
backquoteを使う。
value=`...`
とか、
mkdir `....`
ね。これで、目的の名前のフォルダできるだろ。
あとは、適当に移動(mv)せよ。
0339名無しさん@お腹いっぱい。
2005/06/20(月) 19:32:17ありがとうございます。
0340名無しさん@お腹いっぱい。
2005/06/20(月) 19:32:38> m9(^Д^)プギャーーーッ
笑わないでください。
0341名無しさん@お腹いっぱい。
2005/06/20(月) 20:17:47チェックするにはどのようなすればよいでしょうか?
rshとかtestでがんばってたんですが、挫折しました・・・
0342名無しさん@お腹いっぱい。
2005/06/20(月) 20:32:04ssh HOST test -d DIR
0343名無しさん@お腹いっぱい。
2005/06/20(月) 20:32:36ssh 使え。
ssh foo test /foo
echo $?
0344名無しさん@お腹いっぱい。
2005/06/21(火) 01:51:02編集したいんですが、どうすればいいでしょうか?
Cでやるのは避けたいんだけど。。。
0345名無しさん@お腹いっぱい。
2005/06/21(火) 01:59:08cut
0346名無しさん@お腹いっぱい。
2005/06/21(火) 02:05:36詳しく
0347名無しさん@お腹いっぱい。
2005/06/21(火) 02:07:02man cut
0348名無しさん@お腹いっぱい。
2005/06/21(火) 02:14:08任意のファイルを先頭n行、後ろからm行を取り除いたファイルに
編集したいんですが・・
0349名無しさん@お腹いっぱい。
2005/06/21(火) 02:16:080350名無しさん@お腹いっぱい。
2005/06/21(火) 02:18:320351名無しさん@お腹いっぱい。
2005/06/21(火) 02:20:02> 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単独ではな。
0353名無しさん@お腹いっぱい。
2005/06/21(火) 02:28:30ファイルをcatしてパイプで繋げてheadとかですか?
0354348
2005/06/21(火) 02:43:05head 後ろm行-ライン行数ってのは思いついたが、
ファイル行数が数万とかだと処理遅いよね・・・
0355名無しさん@お腹いっぱい。
2005/06/21(火) 02:44:37tail +$((n+1)) |head -$((w-m-n))
0356名無しさん@お腹いっぱい。
2005/06/21(火) 19:22:400357名無しさん@お腹いっぱい。
2005/06/21(火) 20:51:21awk 'NR>m{a[NR+n]=$0;if(NR in a) print a[NR]}'
0358名無しさん@お腹いっぱい。
2005/06/21(火) 21:35:22できました。
ありがとうございました。
結局どれがベストかわかんないけど、、、
0359名無しさん@お腹いっぱい。
2005/06/21(火) 21:59:30ruby -e 'ARGF.to_a[n..-m].display'
0360名無しさん@お腹いっぱい。
2005/06/22(水) 00:31:220361名無しさん@お腹いっぱい。
2005/06/22(水) 00:50:170362名無しさん@お腹いっぱい。
2005/06/22(水) 06:17:16で複数サイトを取得し、それをindex.html.1 index.html.2・・のように連番をつけて保存したいのですが、
wget -i url_list.txt -O index.html
だとindex.htmlに次々に上書きしてしまいます。
どのように直すべきか教えてください。よろしくお願いいたします。
0363名無しさん@お腹いっぱい。
2005/06/22(水) 07:20:50-O index.html なしで。
wget の質問ならくだ質行け。
0364名無しさん@お腹いっぱい。
2005/06/22(水) 08:16:50いや、これは連番のH画像の守備範囲だろ。
0365紹介しとくよ
2005/06/22(水) 10:10:46http://pc8.2ch.net/test/read.cgi/unix/979106537/
0366名無しさん@お腹いっぱい。
2005/06/22(水) 20:56:56どこを見れば良いんだろ。
0367名無しさん@お腹いっぱい。
2005/06/22(水) 21:14:37fj.unix.shells の2003年1月の記事。
0368名無しさん@お腹いっぱい。
2005/06/22(水) 21:36:02そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
0369名無しさん@お腹いっぱい。
2005/06/22(水) 21:40:11そんなドメイン、実在するんですか?
アクセスすると
DNSエントリが見つかりません
のエラーになったんですけど。
0370名無しさん@お腹いっぱい。
2005/06/22(水) 21:43:250371名無しさん@お腹いっぱい。
2005/06/22(水) 21:47:11fj.unix.shells 2003 1
でググってみるとすぐわかると思うんだけど。。。
ttp://groups.google.com/groups?hl=ja&selm=avgti0$7h6$1@nriinetnews.nri.co.jp
0373名無しさん@お腹いっぱい。
2005/06/22(水) 22:36:190374名無しさん@お腹いっぱい。
2005/06/22(水) 23:32:43お前、古典の成績よくなかっただろw
0375名無しさん@お腹いっぱい。
2005/06/23(木) 00:36:400376名無しさん@お腹いっぱい。
2005/06/23(木) 00:51:40お前、現国の成績よくなかっただろw
0377名無しさん@お腹いっぱい。
2005/06/23(木) 01:53:220378名無しさん@お腹いっぱい。
2005/06/23(木) 01:59:200379名無しさん@お腹いっぱい。
2005/06/23(木) 09:52:150380名無しさん@お腹いっぱい。
2005/06/23(木) 19:04:30ファイルシステム内の音楽ファイルの容量を得るスクリプトキボン。
0381名無しさん@お腹いっぱい。
2005/06/23(木) 19:19:14TrackBack といい、これといい、なんで blog 界の奴らはこんな糞なことしか思い付かないのか。
0382名無しさん@お腹いっぱい。
2005/06/23(木) 23:52:08vmstatの出力結果を5秒毎にファイルに記録してます
vmstat 5 > vmstat_log
記録状況を確かめようとtail -fして監視してみたんですが
どうも途中でバッファリングされているのか20行程まとめて出力が一気に記録されます
vmstatのソースをみたんですが、コマンド自体は出力を毎回フラッシュしているようです
バッファリングされずに5秒毎にリアルタイムに記録したいのですが、
方法はあるんでしょうか
0383名無しさん@お腹いっぱい。
2005/06/24(金) 00:05:15俺のところではそれでちゃんと5秒くらいごとに一行ずつ表示される。
少なくともbashとは何の関係もないな。
システム依存のスレにいったほうがいい。
0384名無しさん@お腹いっぱい。
2005/06/24(金) 00:05:410385名無しさん@お腹いっぱい。
2005/06/24(金) 00:05:52フラッシュしてるのにフラッシュされないってどんな環境?
0386名無しさん@お腹いっぱい。
2005/06/24(金) 00:41:36tailの-fオプションって、入力が標準入力(パイプ)の時は無視されるんちゃう?
FreeBSDやGnu(やLinux)のtailだとmanにそうかいてあるけど。
0388名無しさん@お腹いっぱい。
2005/06/24(金) 10:37:16> 書き込んだファイルを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)がないん
じゃない?
0389382
2005/06/25(土) 01:16:44>>388
OSはRedHatEL3.0です
ちょっとどこのソースをみていたかを確認してみます
ちなみに今手元に環境がないのでcygwinで試したところ同様の現象が起きました
こちらのソースもみてみます・・・
0390名無しさん@お腹いっぱい。
2005/06/26(日) 10:09:570391名無しさん@お腹いっぱい。
2005/06/26(日) 12:11:34man stdio
0392名無しさん@お腹いっぱい。
2005/06/26(日) 13:12:510393名無しさん@お腹いっぱい。
2005/06/26(日) 16:49:120394名無しさん@お腹いっぱい。
2005/06/27(月) 10:50:08つ[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区別なんかしてない。標準入力を見ているだけだ。パイプによって
標準入力は 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:37sedの行では特に入力は明示されていない。だからcatの出力をそのまま処理する。
0399名無しさん@お腹いっぱい。
2005/06/27(月) 16:00:12パイプについてもっと勉強します
ありがとうございました
0400名無しさん@お腹いっぱい。
2005/06/27(月) 16:26:210401名無しさん@お腹いっぱい。
2005/06/27(月) 18:09:560402名無しさん@お腹いっぱい。
2005/06/27(月) 20:08:500403名無しさん@お腹いっぱい。
2005/06/28(火) 17:07:24ls の結果を解析すれば取れるだろうけどもそっとスマートなやり方はないかな?
0404名無しさん@お腹いっぱい。
2005/06/28(火) 17:16:53Linuxだけど stat -c %y <file> で last modified を取得してまつよ
でも、表示が冗長なので他にも方法があれば知りたいところ
0405名無しさん@お腹いっぱい。
2005/06/28(火) 17:44:570406名無しさん@お腹いっぱい。
2005/06/29(水) 14:28:09またお前か。
0407名無しさん@お腹いっぱい。
2005/06/29(水) 16:06:58まるち?
0408名無しさん@お腹いっぱい。
2005/07/06(水) 00:00:30dirA/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でfindしたら上になった。
0410名無しさん@お腹いっぱい。
2005/07/06(水) 00:12:49_と.で区切れ。
0411名無しさん@お腹いっぱい。
2005/07/06(水) 00:20:48同じマシンであってさえ、ファイルの作成した時期とかによって
出力の順番が異なることがありうるぞ。
0412408
2005/07/06(水) 00:34:58どうもです。
とりあえず sort -n -t "_" に通したら、うまくいきますた。
>>411
ということは、>>408の上のように表示されてもそれはたまたま
なので、sort に通した方が良さそうですね。
0413名無しさん@お腹いっぱい。
2005/07/06(水) 00:45:35sort でセパレータを2つ指定できるの?
>>412
「-k」を指定しないなら「-t」は不要だと思う。
その例なら「-n」だけでうまくいくんだろう。
ただ、「-n」は数値以外のフィールドでソートする場合(今回の場合)、
動作は保証されないと思う。
0414名無しさん@お腹いっぱい。
2005/07/06(水) 10:37:350415名無しさん@お腹いっぱい。
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:550417名無しさん@お腹いっぱい。
2005/07/06(水) 13:15:53訂正。
for in `ls *txt`
do
ここで、$FILE にファイルのピリオドより前の部分を突っ込みたい。
cat $i | 適当な処理 > $FILE.doc
done
0418名無しさん@お腹いっぱい。
2005/07/06(水) 13:17:19> for i in `ls *txt`
for i in *txt じゃだめなん?
0419名無しさん@お腹いっぱい。
2005/07/06(水) 14:24:30http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbAZ
sedなら sed 's/¥.[^¥.][^¥.][^¥.]$//'
0420名無しさん@お腹いっぱい。
2005/07/06(水) 14:53:56ふつー、basenameだろ。
FILE=`basename "$i" .txt`
cat "$i" | 適当な処理 > "$FILE".doc
さらにいうとcatも要らんな。
FILE=`basename "$i" .txt`
適当な処理 < "$i" > "$FILE".doc
で桶。
ファイルネームが含まれる場合、いつも" "で囲う癖を付けた方がいいよ。
0421417
2005/07/06(水) 15:54:41basename って初めてしったよ。。。
>>420
ファイルネームが含まれるときは、"" で囲った方がいいのは、
なんでかしらん? ようわからん。。。
0422名無しさん@お腹いっぱい。
2005/07/06(水) 16:19:180423名無しさん@お腹いっぱい。
2005/07/06(水) 21:49:30シェルスクリプトなら、/etc とか /bin の下にあるのを
参考にすると勉強になると思うよ。
0424名無しさん@お腹いっぱい。
2005/07/07(木) 23:45:15何か意味があってそうしてるんでしょうか?
0425名無しさん@お腹いっぱい。
2005/07/07(木) 23:53:100426名無しさん@お腹いっぱい。
2005/07/07(木) 23:54:09ちがうな。。。。
0427名無しさん@お腹いっぱい。
2005/07/07(木) 23:57:080428名無しさん@お腹いっぱい。
2005/07/08(金) 00:09:38ls -lだと分までしかでないんだけど。
■ このスレッドは過去ログ倉庫に格納されています