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

シェルスクリプト総合 その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 でトレースしましょう。
0545名無しさん@お腹いっぱい。2006/12/07(木) 02:08:55
一応

 find * ... -print | xargs -n 1 sh -c 'grep hoge $0 | nkf -e' > out

とかでもできるけど、

 find * ... -print | xargs nkf -e | grep hoge > out

の方がエレガントなような。でも、 file: line 形式で grep 結果を
出したいなら、ついでに * 展開で溢れるケースも考慮して

 find . ... -print | while read i; do grep hoge $i | nkf -e; done > out

しかし ARG_MAX の心配をするほどファイルがあるなら

 find . ... -print | xargs perl -MJcode -lne 'print jcode("$ARGV: $_")->euc if /hoge/' > out

がちょっと長いけど速そう。
0546名無しさん@お腹いっぱい。2006/12/07(木) 09:27:20
とりあえずお約束として
find -print0
xargs -0
にしる、と突っ込んでおくべきなのだろうか
0547名無しさん@お腹いっぱい。2006/12/07(木) 13:53:37
お約束だけど GNU のは入れられなかったりとか
仕様バグがどうこうとか。
0548名無しさん@お腹いっぱい。2006/12/12(火) 15:03:35
PPPoA で接続してるんですが、モデムのログがほとんど残してもらえず(容量少い)
不安定な回線なのにどの程度不安定なのか把握できず困ってます
切断されてもすぐ再接続されるわけですが、これを記録しておきたいと思います
ping 撃ちまくるのはわかりますが、切断された時と再接続された時を記録するには
どんなスクリプト書けばいいですか?
0549名無しさん@お腹いっぱい。2006/12/12(火) 19:53:11
1.txt
↓内容
1
11
111

cat 1.txt | grep 11
とやると
11と111の2つがヒットしてしまいます(^_^;)
11の行だけを抜き出す方法はないですかね?
0550名無しさん@お腹いっぱい。2006/12/12(火) 20:14:17
>>549
grep -w 11
0551名無しさん@お腹いっぱい。2006/12/12(火) 20:47:34
>>549
catが無駄です、のお約束。
0552名無しさん@お腹いっぱい。2006/12/12(火) 21:11:23
>>551
あんたマイナーになってるよ。
0553名無しさん@お腹いっぱい。2006/12/12(火) 22:06:51
>>549
grep -x 11 1.txt
0554名無しさん@お腹いっぱい。2006/12/13(水) 10:08:05
>>551 かっこいいから俺も会社で真似して渋く言ってみます
0555名無しさん@お腹いっぱい。2006/12/13(水) 10:26:21
zcatとかgzcatとかbzcatとかに置き換えるときに、
修正する文字数が少なくなるという、多大なメリットがある。
0556名無しさん@お腹いっぱい。2006/12/13(水) 10:30:43
フィルタだってことがわかりやすいしな。
別に咎めるほどのことではないと思う。
0557名無しさん@お腹いっぱい。2006/12/13(水) 11:39:14
>>555
本気で言ってんのか?
>>549のような使い捨てのワンライナーなら「修正の手間」も糞もねぇだろ。

元スクリプトが
script
なら、
zcat foo.gz | script
とすりゃいいだけだ。一行の修正も要らないし、zcat決めうちにするより
scriptの汎用性が維持される。
こっちのがツールボックスアプローチとして正しいわな。

必要も無いcatを使ってるスクリプトを見ると、俺は不安になるね。
書き手に変な癖がついてるのか、リダイレクションすら理解して無いのか、
品質上に問題があるんじゃないのかとか。
0558名無しさん@お腹いっぱい。2006/12/13(水) 11:53:26
>>557
使い捨てならわざわざリダイレクトなり引き数なりに
直す必要もないじゃん。
script の汎用性の話は意味がわからん。
0559名無しさん@お腹いっぱい。2006/12/13(水) 12:05:56
使い捨てなら cat のムダくらい気にせんでもいいやんけ。
0560名無しさん@お腹いっぱい。2006/12/13(水) 12:11:06
>>558, 559
使い捨てと言いつつ、
grep -w 11 1.txt
ですむものを、
cat 1.txt | grep -w 11
と書きたがる意図が分からんのだが。

そんなにcatとタイプして無駄にプロセスを一個増やすのが好きか?
変な癖を正当化してるだけじゃないか?
0561名無しさん@お腹いっぱい。2006/12/13(水) 12:18:25
>>560
おれが書いたわけじゃないから
おれも意図はわからんな。

プロセスの減らし方あれこれ考えるより
さっさとスクリプト書きあげて
仕事終わらせちゃった方がいいじゃん。
0562名無しさん@お腹いっぱい。2006/12/13(水) 12:22:26
>>561
こんなことで「あれこれ考え」なきゃいけない時点でバカ。
判って無い証拠。
cat file cmd
が動作するなら
cmd <file
が確実に動作するんだから。
後者は無駄なプロセスが不要でタイプ量も少ない。

大体、タイプ量増えるのに、「さっさと仕事終わらせる」も糞もないだろ。
05635622006/12/13(水) 12:23:13
すまん
cat file | cmd
な。
0564名無しさん@お腹いっぱい。2006/12/13(水) 21:39:54
cat 1.txt | grep -w 11 は中身確かめて加工に合っている。
0565チラシの裏すまそ2006/12/13(水) 22:01:56
漏れは同じファイルに対して何回かgrepしたいときに

cat file | grep KEYWORD1
 ↓
カーソルキーの↑を押して前回のコマンドを表示し、
Deleteキー連打して、新しいキーワードを打ち込んで
 ↓
cat file | grep KEYWORD2
 ↓
以下、繰り返し

こんな感じだけどね。
シェルスクリプトの中では使わんけど。
0566名無しさん@お腹いっぱい。2006/12/13(水) 22:06:27
>>565
単にコマンドラインの右端の文字を変更しやすいという意味なら、

$ < file grep KEYWORD1
$ < file grep KEYWORD2

↑みたいにやれば良い。< fileの部分が左に来てもいいんだよ。パイプは使わない。
05675652006/12/13(水) 22:19:02
>>566
うぉ、そんな方法があるとは知らなかった。(@_@)
ありがとん。
0568名無しさん@お腹いっぱい。2006/12/13(水) 22:29:23
^1^2

とかしないの?
0569名無しさん@お腹いっぱい。2006/12/13(水) 22:42:36
cshつかわんから。
0570名無しさん@お腹いっぱい。2006/12/13(水) 23:42:18
>>569
bashでもzshでも、もちろんcshでも、^1^2とかできるはずだけど。
kshは知らんが。
0571名無しさん@お腹いっぱい。2006/12/14(木) 01:39:01
使える環境でも、^stop^start 位しか使わんな。
ヒットした最初の部分しか置き換わらんのが意外に使いにくいしくつう。
0572名無しさん@お腹いっぱい。2006/12/14(木) 02:16:19
ディレクトリーを1〜100まで一気に作りたいのですが
1 2 3....でなく
001 002 003...としたいのですが

d=0
mkdir 0$d
で$dに1つづ加算すると

1 2 3…となってしまいます orz
ヒントなんぞありましたら
おにぃちゃんおしえて! まぅまぅ
0573名無しさん@お腹いっぱい。2006/12/14(木) 02:20:03
>>572 まちがえたぁ

d=0
mkdir 00$d
で$dに1つづ加算すると

001 002…009 になるものの 10を超えると
0010になってしまうので

010…099 100 となれば幸いです
0574名無しさん@お腹いっぱい。2006/12/14(木) 02:31:55
perl -e 'for ("001".."100") { mkdir $_; }'
0575名無しさん@お腹いっぱい。2006/12/14(木) 02:37:10
zsh -c 'mkdir {001..100}'
0576名無しさん@お腹いっぱい。2006/12/14(木) 07:34:49
>>572
mkdir `seq -w 1 100`
0577名無しさん@お腹いっぱい。2006/12/14(木) 11:29:48
>>574-576

おにいちゃん!ありがと!まぅまぅ
perl,zshも勉強しますorz

winamp のストリームで
bpsやってるよ! まぅまぅ

0578名無しさん@お腹いっぱい。2006/12/14(木) 14:03:12
バトルプログラマーシラセ・・・・・bpsね
0579名無しさん@お腹いっぱい。2006/12/14(木) 15:23:17
あるプロセスが起動しているかどうかps|grepで確認するにはどうしたらいいですか?
ps ax|grep XXX|wc -l
で確認すると、grep自身が入ったり入らなかったりします。
0580名無しさん@お腹いっぱい。2006/12/14(木) 15:27:43
>>579
pgrep XXX
0581名無しさん@お腹いっぱい。2006/12/14(木) 15:45:13
>>580
ありがとうございます
0582名無しさん@お腹いっぱい。2006/12/14(木) 16:10:56
>>579
grep -v grepしとけ
0583名無しさん@お腹いっぱい。2006/12/14(木) 16:22:18
>>582
プロセス名が logreport だったりするとだめ。
0584名無しさん@お腹いっぱい。2006/12/14(木) 17:02:27
>>583
やるな。
grep [X]XX
なら?
0585名無しさん@お腹いっぱい。2006/12/14(木) 17:54:13
ボーンシェルってシェル関数使えるって思っても
いいのでしょうか?
シゥル関数使えないボーンシェルもありますか?
0586名無しさん@お腹いっぱい。2006/12/14(木) 18:02:02
まゆ毛ボーンシェル
0587名無しさん@お腹いっぱい。2006/12/14(木) 18:07:39
「ボーン shell」って何ですか?
Bourne shellなら知ってますが、
それとは違うシェルのことですよね?
0588名無しさん@お腹いっぱい。2006/12/14(木) 18:19:27
マット・デイモンのやつだろ
0589名無しさん@お腹いっぱい。2006/12/14(木) 19:04:19
シゥル関数ktkr
0590名無しさん@お腹いっぱい。2006/12/14(木) 23:41:00
シゥル関数、微妙に発音しにくい。
0591名無しさん@お腹いっぱい。2006/12/15(金) 00:34:46
シゥルスクリプト
0592名無しさん@お腹いっぱい。2006/12/15(金) 00:36:26
はだかーのまっまっでベイベ
おどろーよシゥルダンス
0593名無しさん@お腹いっぱい。2006/12/15(金) 01:07:42
>>592

どう見ても米米クラブです。
本当にありがとうございました。
0594名無しさん@お腹いっぱい。2006/12/15(金) 12:41:17
スクリプトのログを過去10日間保存して、それよい古いのは削除していくという感じにしたいのですが
LogFile名
Script名_$(date +"%Y%m%d-%H%M%S")_プロセスID

助言よろしくお願いします。
0595名無しさん@お腹いっぱい。2006/12/15(金) 12:50:00
>>594
プールン使うって理解でおk?
0596名無しさん@お腹いっぱい。2006/12/15(金) 14:07:22
プールン?
0597名無しさん@お腹いっぱい。2006/12/15(金) 14:15:37
ミキプルーン
0598名無しさん@お腹いっぱい。2006/12/15(金) 14:31:11
>>594
素直にlogrotateでも使え
0599名無しさん@お腹いっぱい。2006/12/15(金) 14:52:54
日付で判断出来なかったっけ?
どこかでそんなScriptを見た気がする。
0600名無しさん@お腹いっぱい。2006/12/15(金) 16:29:30
ファイル名から、%Y%m%dの文字列を抜き出して、
`expr \`date "+%Y%m%d"\` - 10`と比較して、これより小さければ、そのファイルを削除する。
あとはこれを、for f in `ls Script名_*` みたいな感じでループさせればいいだろう。
0601名無しさん@お腹いっぱい。2006/12/15(金) 18:05:57
今まで>>582の方法でやってたけど、>>583は盲点だった
多分そんなプロセス名自分は使わないだろうけど勉強になるな
0602名無しさん@お腹いっぱい。2006/12/16(土) 00:44:15
>>594
findで作成日が10日以前のログファイルを見つけて消すようにしては?
0603名無しさん@お腹いっぱい。2006/12/16(土) 10:07:15
>>602
この前その方法でやったけど何故か処理重かった・・・
なのでオレは>>600に近い方法でやったよ。
>600のそのままだとうまく動かないと思われ
0604名無しさん@お腹いっぱい。2006/12/16(土) 10:26:00
>>603
どの部分が重いのか、今後の為にも確認した方が良いと思うぞ。
0605名無しさん@お腹いっぱい。2006/12/16(土) 10:33:12
>>602
ほとんどの場合はそれでいいんだろうけどな、特に削除の場合は。
0606名無しさん@お腹いっぱい。2006/12/16(土) 15:11:30
作成する時に date % 10 でファイル名決めれば?
今回は 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
>if で あるからもう作らない 次進めとやると
これでいいじゃんw
0609名無しさん@お腹いっぱい。2006/12/16(土) 18:38:48
ごめんなさい ひらめきました
cronで夜中ディレクトリ作ればいいのですね

>>608 if で毎回やるのがなんかイヤな感じがしたので
識者の方々に伺おうと思ったww
今は反省している

それと%m%d だよな 
逝って来ます
0610名無しさん@お腹いっぱい。2006/12/16(土) 18:41:48
つ mkdir -p
0611名無しさん@お腹いっぱい。2006/12/16(土) 18:56:56
>>610 それも考えたのですが。。。なんか毎回それを入れるのも・・・・・・
別に中身は消えないんでしょうけどww
なんか気持ち悪いorz

すんませんありがとでございます
0612名無しさん@お腹いっぱい。2006/12/16(土) 23:09:40
>>607
「ディレクトリがなかったら作る」でいいんじゃないの?
こんな感じ↓でやれば、1行で済むじゃん。

[ ! -d ディレクトリ ] && mkdir ディレクトリ
0613名無しさん@お腹いっぱい。2006/12/16(土) 23:57:53
たまには || の事も思い出してあげてください
0614名無しさん@お腹いっぱい。2006/12/17(日) 01:06:26
test のオーバーヘッド(w が気になるのなら、

 mkdir dir 2> /dev/null

でおけ。
0615名無しさん@お腹いっぱい。2006/12/17(日) 14:11:54
藻前らなかなかできるな!!
基本を身に付けたいorz
0616名無しさん@お腹いっぱい。2006/12/17(日) 18:50:14
>>614
set -e
で不都合が生じるから減点。
0617名無しさん@お腹いっぱい。2006/12/17(日) 19:54:25
たまには || の事も思い出してあげてください

mkdir -p dir 2>/dev/null || :
0618名無しさん@お腹いっぱい。2006/12/17(日) 20:25:49
-p || || では?
0619名無しさん@お腹いっぱい。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
でも解凍するときは zxvf 圧縮するときは zcvf みたいに覚えてて
それぞれのオプションの意味を覚えていないやつってのはいるよね

結局伸びない
0622名無しさん@お腹いっぱい。2006/12/20(水) 06:25:30
>>621
そんな奴おらんやろ〜
0623名無しさん@お腹いっぱい。2006/12/20(水) 07:40:37
FreeBSDのtarなら圧縮形式自動判定してxvfだけで展開できるしな。
0624名無しさん@お腹いっぱい。2006/12/20(水) 07:45:47
>>622
いるよ〜

>>623
paxもおすすめ
0625名無しさん@お腹いっぱい。2006/12/20(水) 09:08:53
jはbzipだろ
zはgzだろ
xは解凍
cは圧縮
vは状況表示
fはファイル指定

じゃ無かったかな。
man tar してません。
0626名無しさん@お腹いっぱい。2006/12/20(水) 09:22:56
きっと、おぼえていることにポイントがあるわけじゃなくてぇ
0627名無しさん@お腹いっぱい。2006/12/20(水) 09:26:12
lhaのオプション覚えてる人いてる?
普段はファイラから解凍や圧縮してたんでじぇんじぇん覚えてにゃ
0628名無しさん@お腹いっぱい。2006/12/20(水) 09:32:17
マニュアルを引ければいいんじゃね?
0629名無しさん@お腹いっぱい。2006/12/20(水) 09:48:15
マニュアルを脳にインストールする話じゃないのか?
0630名無しさん@お腹いっぱい。2006/12/20(水) 10:18:46
いや
その知識自体の価値ではなく、その人の性質というかそういうものについてだよね
0631名無しさん@お腹いっぱい。2006/12/20(水) 11:27:32
なんにせよスレ違いだ。
0632名無しさん@お腹いっぱい。2006/12/20(水) 13:42:15
結局は基本を覚えて延髄の反射で書けるようにしておけってことでしょうか?
あと正規表現モナーですか?
0633名無しさん@お腹いっぱい。2006/12/20(水) 19:39:44
>>600
月が替わったりすると無理じゃね?w
20061125
20061201
20061231
20070101

よく月の1日にはリセットだなw
0634名無しさん@お腹いっぱい。2006/12/20(水) 21:25:32
文末にw付けるとwwなんかwwwいいことでもあるのか?wwwwwwwwwww
0635名無しさん@お腹いっぱい。2006/12/20(水) 23:33:00
grep の -w オプションみたいなもんだな
0636名無しさん@お腹いっぱい。2006/12/21(木) 00:16:42
>>633
BSD系なら
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:27
date -v -10d +%Y%m%d
0638名無しさん@お腹いっぱい。2006/12/21(木) 00:37:34
>>637
-vはFreeBSD限定のような気がする
0639名無しさん@お腹いっぱい。2006/12/21(木) 02:39:21
>>594
rm `ls -t /directory/*.log | tail -n +11`
なんて方法もあるかなと。
0640名無しさん@お腹いっぱい。2006/12/21(木) 08:04:44
>>639
それいけるのか?
1日に複数個ログはいても
0641名無しさん@お腹いっぱい。2006/12/21(木) 16:23:03
date は1日引くのができるんじゃないっけ?
ago だかなんかの引数で
0642名無しさん@お腹いっぱい。2006/12/21(木) 16:29:37
>>641
FreeBSDのdateは無理です
0643名無しさん@お腹いっぱい。2006/12/21(木) 16:36:30
FedoraBSDって無いんですか?
0644名無しさん@お腹いっぱい。2006/12/21(木) 18:41:38
kFreeBSDならあってもおかしくない気がするよな
■ このスレッドは過去ログ倉庫に格納されています