シェルスクリプト総合 その7
■ このスレッドは過去ログ倉庫に格納されています
0001ミスターシェル
2006/09/07(木) 13:00:11スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
0566名無しさん@お腹いっぱい。
2006/12/13(水) 22:06:27単にコマンドラインの右端の文字を変更しやすいという意味なら、
$ < file grep KEYWORD1
$ < file grep KEYWORD2
↑みたいにやれば良い。< fileの部分が左に来てもいいんだよ。パイプは使わない。
0568名無しさん@お腹いっぱい。
2006/12/13(水) 22:29:23とかしないの?
0569名無しさん@お腹いっぱい。
2006/12/13(水) 22:42:360570名無しさん@お腹いっぱい。
2006/12/13(水) 23:42:18bashでもzshでも、もちろんcshでも、^1^2とかできるはずだけど。
kshは知らんが。
0571名無しさん@お腹いっぱい。
2006/12/14(木) 01:39:01ヒットした最初の部分しか置き換わらんのが意外に使いにくいしくつう。
0572名無しさん@お腹いっぱい。
2006/12/14(木) 02:16:191 2 3....でなく
001 002 003...としたいのですが
d=0
mkdir 0$d
で$dに1つづ加算すると
1 2 3…となってしまいます orz
ヒントなんぞありましたら
おにぃちゃんおしえて! まぅまぅ
0573名無しさん@お腹いっぱい。
2006/12/14(木) 02:20:03d=0
mkdir 00$d
で$dに1つづ加算すると
001 002…009 になるものの 10を超えると
0010になってしまうので
010…099 100 となれば幸いです
0574名無しさん@お腹いっぱい。
2006/12/14(木) 02:31:550575名無しさん@お腹いっぱい。
2006/12/14(木) 02:37:100576名無しさん@お腹いっぱい。
2006/12/14(木) 07:34:49mkdir `seq -w 1 100`
0577名無しさん@お腹いっぱい。
2006/12/14(木) 11:29:48おにいちゃん!ありがと!まぅまぅ
perl,zshも勉強しますorz
winamp のストリームで
bpsやってるよ! まぅまぅ
0578名無しさん@お腹いっぱい。
2006/12/14(木) 14:03:120579名無しさん@お腹いっぱい。
2006/12/14(木) 15:23:17ps ax|grep XXX|wc -l
で確認すると、grep自身が入ったり入らなかったりします。
0580名無しさん@お腹いっぱい。
2006/12/14(木) 15:27:43pgrep XXX
0581名無しさん@お腹いっぱい。
2006/12/14(木) 15:45:13ありがとうございます
0582名無しさん@お腹いっぱい。
2006/12/14(木) 16:10:56grep -v grepしとけ
0583名無しさん@お腹いっぱい。
2006/12/14(木) 16:22:18プロセス名が logreport だったりするとだめ。
0584名無しさん@お腹いっぱい。
2006/12/14(木) 17:02:27やるな。
grep [X]XX
なら?
0585名無しさん@お腹いっぱい。
2006/12/14(木) 17:54:13いいのでしょうか?
シゥル関数使えないボーンシェルもありますか?
0586名無しさん@お腹いっぱい。
2006/12/14(木) 18:02:020587名無しさん@お腹いっぱい。
2006/12/14(木) 18:07:39Bourne shellなら知ってますが、
それとは違うシェルのことですよね?
0588名無しさん@お腹いっぱい。
2006/12/14(木) 18:19:270589名無しさん@お腹いっぱい。
2006/12/14(木) 19:04:190590名無しさん@お腹いっぱい。
2006/12/14(木) 23:41:000591名無しさん@お腹いっぱい。
2006/12/15(金) 00:34:460592名無しさん@お腹いっぱい。
2006/12/15(金) 00:36:26おどろーよシゥルダンス
0593名無しさん@お腹いっぱい。
2006/12/15(金) 01:07:42どう見ても米米クラブです。
本当にありがとうございました。
0594名無しさん@お腹いっぱい。
2006/12/15(金) 12:41:17LogFile名
Script名_$(date +"%Y%m%d-%H%M%S")_プロセスID
助言よろしくお願いします。
0595名無しさん@お腹いっぱい。
2006/12/15(金) 12:50:00プールン使うって理解でおk?
0596名無しさん@お腹いっぱい。
2006/12/15(金) 14:07:220597名無しさん@お腹いっぱい。
2006/12/15(金) 14:15:370598名無しさん@お腹いっぱい。
2006/12/15(金) 14:31:11素直にlogrotateでも使え
0599名無しさん@お腹いっぱい。
2006/12/15(金) 14:52:54どこかでそんなScriptを見た気がする。
0600名無しさん@お腹いっぱい。
2006/12/15(金) 16:29:30`expr \`date "+%Y%m%d"\` - 10`と比較して、これより小さければ、そのファイルを削除する。
あとはこれを、for f in `ls Script名_*` みたいな感じでループさせればいいだろう。
0601名無しさん@お腹いっぱい。
2006/12/15(金) 18:05:57多分そんなプロセス名自分は使わないだろうけど勉強になるな
0602名無しさん@お腹いっぱい。
2006/12/16(土) 00:44:15findで作成日が10日以前のログファイルを見つけて消すようにしては?
0603名無しさん@お腹いっぱい。
2006/12/16(土) 10:07:15この前その方法でやったけど何故か処理重かった・・・
なのでオレは>>600に近い方法でやったよ。
>600のそのままだとうまく動かないと思われ
0604名無しさん@お腹いっぱい。
2006/12/16(土) 10:26:00どの部分が重いのか、今後の為にも確認した方が良いと思うぞ。
0605名無しさん@お腹いっぱい。
2006/12/16(土) 10:33:12ほとんどの場合はそれでいいんだろうけどな、特に削除の場合は。
0606名無しさん@お腹いっぱい。
2006/12/16(土) 15:11:30今回は 10 だけど、7 の場合は date +%w でできてもっと単純。
0607名無しさん@お腹いっぱい。
2006/12/16(土) 18:26:39バックアップを1日3回取りたいのですが
日付毎のディレクトリを作って
mkdir /bak/`date +%d%m`
と、ここまではいいのですが2回目に、このスクリプトが動くと
もうディレクトリあるぞ( ゚Д゚)ゴルァ!!とエラーがでます(たいしたことはないのですが)
ディレクトリー作成とバックアップ用のスクリプトは別けたほうが良いでしょうか
if で あるからもう作らない 次進めとやると
速度落ちますよね?
なんかいい知恵ないでしょうか?
0608名無しさん@お腹いっぱい。
2006/12/16(土) 18:30:13これでいいじゃんw
0609名無しさん@お腹いっぱい。
2006/12/16(土) 18:38:48cronで夜中ディレクトリ作ればいいのですね
>>608 if で毎回やるのがなんかイヤな感じがしたので
識者の方々に伺おうと思ったww
今は反省している
それと%m%d だよな
逝って来ます
0610名無しさん@お腹いっぱい。
2006/12/16(土) 18:41:480611名無しさん@お腹いっぱい。
2006/12/16(土) 18:56:56別に中身は消えないんでしょうけどww
なんか気持ち悪いorz
すんませんありがとでございます
0612名無しさん@お腹いっぱい。
2006/12/16(土) 23:09:40「ディレクトリがなかったら作る」でいいんじゃないの?
こんな感じ↓でやれば、1行で済むじゃん。
[ ! -d ディレクトリ ] && mkdir ディレクトリ
0613名無しさん@お腹いっぱい。
2006/12/16(土) 23:57:530614名無しさん@お腹いっぱい。
2006/12/17(日) 01:06:26mkdir dir 2> /dev/null
でおけ。
0615名無しさん@お腹いっぱい。
2006/12/17(日) 14:11:54基本を身に付けたいorz
0616名無しさん@お腹いっぱい。
2006/12/17(日) 18:50:14set -e
で不都合が生じるから減点。
0617名無しさん@お腹いっぱい。
2006/12/17(日) 19:54:25mkdir -p dir 2>/dev/null || :
0618名無しさん@お腹いっぱい。
2006/12/17(日) 20:25:490619名無しさん@お腹いっぱい。
2006/12/19(火) 18:01:03標準入出力を意識(理解?)していない人は多いね。
たとえば、tar cf - . | ( cd /xxx && tar xpvf - ) とかすると
"-" について9割くらいは見ていた人に聞かれるし簡単には
何をやっているか理解してもらえない。
後は、3>&1 とか使えば多少は幅広がるのにね。
0620名無しさん@お腹いっぱい。
2006/12/19(火) 18:04:17またちょっと別の話かと。
0621名無しさん@お腹いっぱい。
2006/12/20(水) 06:17:18それぞれのオプションの意味を覚えていないやつってのはいるよね
結局伸びない
0622名無しさん@お腹いっぱい。
2006/12/20(水) 06:25:30そんな奴おらんやろ〜
0623名無しさん@お腹いっぱい。
2006/12/20(水) 07:40:370624名無しさん@お腹いっぱい。
2006/12/20(水) 07:45:47いるよ〜
>>623
paxもおすすめ
0625名無しさん@お腹いっぱい。
2006/12/20(水) 09:08:53zはgzだろ
xは解凍
cは圧縮
vは状況表示
fはファイル指定
じゃ無かったかな。
man tar してません。
0626名無しさん@お腹いっぱい。
2006/12/20(水) 09:22:560627名無しさん@お腹いっぱい。
2006/12/20(水) 09:26:12普段はファイラから解凍や圧縮してたんでじぇんじぇん覚えてにゃ
0628名無しさん@お腹いっぱい。
2006/12/20(水) 09:32:170629名無しさん@お腹いっぱい。
2006/12/20(水) 09:48:150630名無しさん@お腹いっぱい。
2006/12/20(水) 10:18:46その知識自体の価値ではなく、その人の性質というかそういうものについてだよね
0631名無しさん@お腹いっぱい。
2006/12/20(水) 11:27:320632名無しさん@お腹いっぱい。
2006/12/20(水) 13:42:15あと正規表現モナーですか?
0633名無しさん@お腹いっぱい。
2006/12/20(水) 19:39:44月が替わったりすると無理じゃね?w
20061125
20061201
20061231
20070101
よく月の1日にはリセットだなw
0634名無しさん@お腹いっぱい。
2006/12/20(水) 21:25:320635名無しさん@お腹いっぱい。
2006/12/20(水) 23:33:000636名無しさん@お腹いっぱい。
2006/12/21(木) 00:16:42BSD系なら
T=$(($(date +"%s") - 86400*10))
DATE=$(date -r $T +"%Y%m%d")
Linux (というかGNU coreutils) なら
DATE=$(date -d '10 days ago' +"%Y%m%d")
0637名無しさん@お腹いっぱい。
2006/12/21(木) 00:27:270638名無しさん@お腹いっぱい。
2006/12/21(木) 00:37:34-vはFreeBSD限定のような気がする
0639名無しさん@お腹いっぱい。
2006/12/21(木) 02:39:21rm `ls -t /directory/*.log | tail -n +11`
なんて方法もあるかなと。
0640名無しさん@お腹いっぱい。
2006/12/21(木) 08:04:44それいけるのか?
1日に複数個ログはいても
0641名無しさん@お腹いっぱい。
2006/12/21(木) 16:23:03ago だかなんかの引数で
0642名無しさん@お腹いっぱい。
2006/12/21(木) 16:29:37FreeBSDのdateは無理です
0643名無しさん@お腹いっぱい。
2006/12/21(木) 16:36:300644名無しさん@お腹いっぱい。
2006/12/21(木) 18:41:380645名無しさん@お腹いっぱい。
2006/12/23(土) 04:10:11foo *
というようなことをやりたいのですが、arg list too longというような
メッセージが出ます。
で、有名な
echo * | xargs foo
で解決と思いきや、xargsってARG_MAXを超えた引数については、fooを呼びなおすみたいですね。
fooは全てのファイルに対して1回だけ実行されないと困るんですが、何かいい方法はあるでしょうか?
0646名無しさん@お腹いっぱい。
2006/12/23(土) 09:36:470647名無しさん@お腹いっぱい。
2006/12/23(土) 09:45:32xargs でいいじゃん
0648名無しさん@お腹いっぱい。
2006/12/23(土) 10:11:400649名無しさん@お腹いっぱい。
2006/12/23(土) 10:27:411 fooをshell functionで書き直す。
2 arglist広げてシステム再構築。
3 fooを複数回実行されても困らないよう作り直す。
0650名無しさん@お腹いっぱい。
2006/12/23(土) 10:31:370651名無しさん@お腹いっぱい。
2006/12/23(土) 11:34:05find ... | xargs tar cvf hoge.tar
で ARG_MAX にあふれたファイルだけ入ったアーカイブ作ったことある。
たぶん受け側のプログラムを標準入力からファイル一覧読むように
改造するしかない。
0652名無しさん@お腹いっぱい。
2006/12/23(土) 12:20:28欲嫁。
>xargsってARG_MAXを超えた引数については、fooを呼びなおす
0653名無しさん@お腹いっぱい。
2006/12/23(土) 12:25:480654名無しさん@お腹いっぱい。
2006/12/23(土) 12:37:58xargsでいいじゃん
0655名無しさん@お腹いっぱい。
2006/12/23(土) 12:54:36欲嫁。
>xargsってARG_MAXを超えた引数については、fooを呼びなおす
0656名無しさん@お腹いっぱい。
2006/12/23(土) 13:05:47fooで同じファイルを二度処理するのはまずいってだけの話なら
xargsでいいんでないの?
一度のfooの実行で全ファイルを処理したいっつーんなら、
引数渡しでやるのは無理だわなそりゃ
0657645
2006/12/23(土) 13:58:06書き方が悪かったですが、fooは複数回実行されると困るというよりも、
全ファイルのデータを読み込んだ上でまあ数値計算みたいなものなんですが、
計算を行いたいわけです。
一度に処理されないと意味がない、ということです。
>>653
これ試してみましたけど、-n 100000とかやってもARG_MAXの壁は越えられないんで駄目でした。
どうもfoo内でフャ@イル一覧を読b゙ように書き換bヲるか、再構築bチてことみたいbナすね。
0658名無しさん@お腹いっぱい。
2006/12/23(土) 14:02:43ガベージアウト
0659名無しさん@お腹いっぱい。
2006/12/23(土) 15:50:070660名無しさん@お腹いっぱい。
2006/12/23(土) 15:58:380661名無しさん@お腹いっぱい。
2006/12/23(土) 16:19:21受け側のプログラムが引数使わないように修正する以外に方法はないって。
0662名無しさん@お腹いっぱい。
2006/12/23(土) 22:29:440663名無しさん@お腹いっぱい。
2006/12/23(土) 22:44:110664名無しさん@お腹いっぱい。
2006/12/23(土) 22:50:02kwsk
0665名無しさん@お腹いっぱい。
2006/12/25(月) 11:59:270666名無しさん@お腹いっぱい。
2006/12/25(月) 12:02:430点
■ このスレッドは過去ログ倉庫に格納されています