シェルスクリプト総合 その5
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2006/01/21(土) 09:00:29スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はbourne shがデフォルトです。
bash/csh/tcsh/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
0144名無しさん@お腹いっぱい。
2006/02/01(水) 08:24:37× 〜というシェルが動かない
0145名無しさん@お腹いっぱい。
2006/02/01(水) 11:37:12> × シェルを書く
だからぁ...
% vi lex.l
% vi parse.y
% vi main.c
...
% vi Makefile
% make
てな作業の事なので無問題
>>144
> × 〜というシェルが動かない
"〜" が sh とか bash とか csh とか tcsh とか zsh とか scsh とか...
だったら無問題
0146名無しさん@お腹いっぱい。
2006/02/01(水) 11:44:17そんなんできるやつには○とか×とか言わんよ。
0147名無しさん@お腹いっぱい。
2006/02/01(水) 12:07:190148名無しさん@お腹いっぱい。
2006/02/01(水) 12:43:26まあ、プロンプト % で書く香具師は、何言っても説得力が無いわな。
0149名無しさん@お腹いっぱい。
2006/02/01(水) 22:48:40プロンプトが常に # の奴もちょっと嫌だな。w
0150名無しさん@お腹いっぱい。
2006/02/01(水) 23:15:190151名無しさん@お腹いっぱい。
2006/02/01(水) 23:30:140152名無しさん@お腹いっぱい。
2006/02/01(水) 23:36:250153名無しさん@お腹いっぱい。
2006/02/02(木) 00:27:250154名無しさん@お腹いっぱい。
2006/02/02(木) 01:09:25# はコメントみたいだし、$ は変数と紛らわしい
0155名無しさん@お腹いっぱい。
2006/02/02(木) 04:09:380156名無しさん@お腹いっぱい。
2006/02/02(木) 04:43:510157名無しさん@お腹いっぱい。
2006/02/02(木) 06:00:560158名無しさん@お腹いっぱい。
2006/02/02(木) 09:01:45スーパーハッカーが集うスレッドはここですか?
0159名無しさん@お腹いっぱい。
2006/02/02(木) 09:59:110160名無しさん@お腹いっぱい。
2006/02/02(木) 10:05:140161名無しさん@お腹いっぱい。
2006/02/02(木) 11:29:17シェルを書くには結構な腕が必要なんじゃないか?
おれは、シェルスクリプトは書けてもシェルは書けん。
0162名無しさん@お腹いっぱい。
2006/02/02(木) 11:56:11システムプログラムの初歩なんで、
やればできるレベルだと思われ。
動かすだけなら結構簡単なので、
大学での演習レベル。
0163名無しさん@お腹いっぱい。
2006/02/02(木) 12:00:110164名無しさん@お腹いっぱい。
2006/02/02(木) 12:14:17パイプとか、サブシェルとか、ジョブコンとか、環境変数とか、
基本的とはいえかなりのシステムコールの利用経験と、パーザの知識がいるかと。
0165名無しさん@お腹いっぱい。
2006/02/02(木) 12:19:32これは簡単だろ。
> ジョブコンとか、
とCtrl-Cでシグナル喰った時のシェルの挙動辺りは
ちゃんとPOSIX規格その他を読んでないと難しいものがある。
少なくともマルチプラットーフォームは無理。
0166名無しさん@お腹いっぱい。
2006/02/02(木) 12:28:52Posix 互換でなきゃいけないのか?
scsh とか, ぜんぜん Posix 互換じゃないし interactive shell として使おうと
言う気すら起きないが, それでも shell だ.
0167名無しさん@お腹いっぱい。
2006/02/02(木) 18:26:02165はジョブコンを(ポータブルに)きちんと実装するのに知識が必要だって
ことなんでは。
0168名無しさん@お腹いっぱい。
2006/02/02(木) 18:32:17元祖B-shにはないし、今時のシェルであっても
非対話モード(シェルスクリプト)で起動されれば
ジョブコンはdisableされるのが普通。
0169名無しさん@お腹いっぱい。
2006/02/02(木) 18:46:35ジョブコンゆうなぁ...
いまだに ジョブコン -> JCL とリダクションされる.
0170名無しさん@お腹いっぱい。
2006/02/02(木) 19:03:41csh, tcshって今でも非対話モードでもジョブコンenblaeされたままなのかな?
大昔、子プロセスにSIGSTOP送ったら、(もちろんkill(1)→killpg(2))
プロセスグループが別で、シェルに制御が戻って、
子プロセス異常終了で、スクリプトが止まったのはビビッた。
>>167
setsid()周辺は古いUNIXも含めると大変だよね。
Emacsにはその辺のレガシーなコードがまだ残っているが。
0171名無しさん@お腹いっぱい。
2006/02/02(木) 19:52:26ん?null?
0172名無しさん@お腹いっぱい。
2006/02/02(木) 20:18:48「リダクション」reduction:半減。例:ノイズリダクション
??はて??
0173名無しさん@お腹いっぱい。
2006/02/02(木) 20:33:370174名無しさん@お腹いっぱい。
2006/02/02(木) 21:56:420175名無しさん@お腹いっぱい。
2006/02/02(木) 22:01:460176名無しさん@お腹いっぱい。
2006/02/02(木) 22:20:08というか、「リダクション」じゃなく、
「リフレクション」と言いたかったのでは、とマジレス。
0177名無しさん@お腹いっぱい。
2006/02/02(木) 22:36:05ラムダ計算あたりでは、リダクションってのは、おおざっぱに言って
1/3 + 2/3 -> 1
のように, 複雑な表現から簡約された表現に置き換えることをさします。
おそらく >>169 の頭の中では、ジョブコンよりも JCL の方が簡約された
表現だったんだと思うんですけど…
ちゃうんかい >>169
0178名無しさん@お腹いっぱい。
2006/02/02(木) 22:44:280179名無しさん@お腹いっぱい。
2006/02/02(木) 22:47:01それは >>169 に聞いてくれ。おいらの知ったこっちゃない。
ってか、文字数から見ると十分リダクションしてると思う。
0180名無しさん@お腹いっぱい。
2006/02/02(木) 22:52:210181名無しさん@お腹いっぱい。
2006/02/02(木) 23:06:50あは…
そう言われるとそうだ。
0182名無しさん@お腹いっぱい。
2006/02/04(土) 11:35:02#!/usr/bin/ruby
require 'kconv'
puts 'あいうえお'.toutf8
以下の出力が異なるのはそーゆーもん? echo 使ったほうが化けちゃうみたい。
#!/bin/sh
./utfout.rb
echo `./utfout.rb`
sh は dash ってやつ(Debian版 の ash みたい、Debian でごめん)。
こんなときは bash 使うべきなんかね(bash なら化けなかった)。
0183名無しさん@お腹いっぱい。
2006/02/04(土) 11:58:50と勘で回答してみる。
0184名無しさん@お腹いっぱい。
2006/02/04(土) 12:11:140185名無しさん@お腹いっぱい。
2006/02/04(土) 12:24:22あーごめんなさい。どっちも試してたんだけど相変わらず化けたまんまっす。
ちなみに dash は echo は内部に持ってないみたいなのでどっちにしろ
/bin/sh を使ってるみたい。
0186名無しさん@お腹いっぱい。
2006/02/04(土) 15:06:52> /bin/sh を使ってるみたい。
なにその角度
0187名無しさん@お腹いっぱい。
2006/02/04(土) 17:04:37/bin/shを使う(ビルトインじゃないのは丸投げかよ)
でぶの考えは理解できんな。
0188名無しさん@お腹いっぱい。
2006/02/04(土) 17:11:31どっちにしろ
Debian$ dash -c 'echo `echo どっちにしろ | iconv -f euc-jp -t utf-8`' | iconv -f utf-8 -t euc-jp
どっちにしろ
0189名無しさん@お腹いっぱい。
2006/02/04(土) 17:59:06/bin/sh は /bin/echo の書き間違いね。失敬。
>>188
むむ。
% dash -c 'echo `echo どっちにしろ | iconv -f euc-jp -t utf-8`' | iconv -f utf-8 -t euc-jp
iconv: 位置 0 で不正な入力シーケンスがありました
手元の stable 環境だとこうなった。環境か dash の version 固有の話っぽい
ので犬板行ってみる。
0190名無しさん@お腹いっぱい。
2006/02/04(土) 23:02:430191名無しさん@お腹いっぱい。
2006/02/05(日) 11:14:410192名無しさん@お腹いっぱい。
2006/02/05(日) 11:24:27ttp://food6.2ch.net/test/read.cgi/pasta/
0193名無しさん@お腹いっぱい。
2006/02/05(日) 11:41:240194名無しさん@お腹いっぱい。
2006/02/05(日) 17:32:59Thanks
0195名無しさん@お腹いっぱい。
2006/02/06(月) 15:06:02んで任意の時間帯のみをgrepしたいのですが、
全然わかりません・・・
教えてください(*´Д`)
--------------------------------------------------
〜〜〜
XXXX 10:11 XXXXXX〜
XXXX 10:12 XXXXXX〜
XXXX 10:13 XXXXXX〜
XXXX 10:14 XXXXXX〜
XXXX 10:15 XXXXXX〜
〜〜〜
--------------------------------------------------
$xxx.sh 1012 1014
XXXX 10:12 XXXXXX〜
XXXX 10:13 XXXXXX〜
XXXX 10:14 XXXXXX〜
のような感じです。
0196名無しさん@お腹いっぱい。
2006/02/06(月) 15:13:47sed -n '/10:12/,/10:14/p' logfile
でいいじゃん。
ただし、終了時刻の行は最初の1行のみ出力になるので、
必要ならば終了時刻の1分後を指定すればいい。
0197名無しさん@お腹いっぱい。
2006/02/06(月) 15:22:33そか、sedか・・・
初心者ですいません。
さっそくやってみたところできました!
ありがとうございます(*´Д`)
0198名無しさん@お腹いっぱい。
2006/02/06(月) 15:39:48sed -e '/10:12/,/10:14/! d' logfile
なら終了時刻の調整不要。
0199名無しさん@お腹いっぱい。
2006/02/06(月) 15:48:35>>198 でも終了時刻の調整は必要。
0200名無しさん@お腹いっぱい。
2006/02/06(月) 15:56:20すまそ
0201名無しさん@お腹いっぱい。
2006/02/06(月) 18:07:02sed -n '/10:12/,/10:14/p; /10:14/p;' logfile |uniq
0202名無しさん@お腹いっぱい。
2006/02/06(月) 18:18:54簡単にやっつけたかったら、
sed -n '/ 10:1[234] /p;' logfile
が良いと思う。
日付もちゃんとみたいならunix timeに変換して大小比較するperl scriptで。
スレ違いなのでscriptは省略。他にはTime::Periodなど。
0203名無しさん@お腹いっぱい。
2006/02/06(月) 18:24:360204名無しさん@お腹いっぱい。
2006/02/06(月) 18:52:5210:12 から 12:03 だと >>203 や >>202 じゃできなくなるんだよな。
0205名無しさん@お腹いっぱい。
2006/02/06(月) 21:36:19道具は選ばないと。
0206名無しさん@お腹いっぱい。
2006/02/06(月) 21:52:030207名無しさん@お腹いっぱい。
2006/02/06(月) 22:00:39頭は使わないと。
0208名無しさん@お腹いっぱい。
2006/02/06(月) 22:02:380209名無しさん@お腹いっぱい。
2006/02/06(月) 22:04:27文脈(ry クマー
0210名無しさん@お腹いっぱい。
2006/02/06(月) 22:05:520211名無しさん@お腹いっぱい。
2006/02/07(火) 00:01:310212名無しさん@お腹いっぱい。
2006/02/07(火) 00:05:210213名無しさん@お腹いっぱい。
2006/02/07(火) 00:21:28b=`grep -n '12:03' logfile |sed -n '$ p' |cut -d ':' -f 1`
sed -n "$a, $b p" logfile
いまいち。
0214名無しさん@お腹いっぱい。
2006/02/07(火) 01:57:05でいいのかという話もある
0215名無しさん@お腹いっぱい。
2006/02/07(火) 02:37:14ruby -ane 'puts $_ if $F[1] >= "10:12" and $F[1] <= "12:03"' logfile
0216名無しさん@お腹いっぱい。
2006/02/07(火) 04:19:18スレタイ読めよ。
だから ruby 使いはキモいって言われるのに、自覚と学習能力がないらしいな。
0217名無しさん@お腹いっぱい。
2006/02/07(火) 04:46:480218名無しさん@お腹いっぱい。
2006/02/07(火) 06:19:05がいしゅつ
0219名無しさん@お腹いっぱい。
2006/02/07(火) 23:36:280220名無しさん@お腹いっぱい。
2006/02/08(水) 08:07:340221名無しさん@お腹いっぱい。
2006/02/08(水) 19:47:16#!/bin/sh
awk -f - logfile $1 $2 <<'EOS'
BEGIN { s = ARGV[2]; e = ARGV[3]; ARGC = 2; }
$2 > s && $2 < e { print; }
EOS
$ xxx.sh 10:10 10:15
0222名無しさん@お腹いっぱい。
2006/02/14(火) 00:09:370223名無しさん@お腹いっぱい。
2006/02/14(火) 07:28:36sleep: too few arguments
Try `sleep --help' for more information.
0224名無しさん@お腹いっぱい。
2006/02/14(火) 07:35:08GNU sleep うざい。
0225名無しさん@お腹いっぱい。
2006/02/14(火) 13:18:060226名無しさん@お腹いっぱい。
2006/02/14(火) 23:11:040227名無しさん@お腹いっぱい。
2006/02/15(水) 00:18:39usage: sleep seconds
0228名無しさん@お腹いっぱい。
2006/02/15(水) 00:25:070229名無しさん@お腹いっぱい。
2006/02/15(水) 00:27:000230名無しさん@お腹いっぱい。
2006/02/15(水) 00:46:070231名無しさん@お腹いっぱい。
2006/02/15(水) 09:28:310232名無しさん@お腹いっぱい。
2006/02/15(水) 13:19:16$ host fj.news.usage
Host fj.news.usage not found: 3(NXDOMAIN)
0233名無しさん@お腹いっぱい。
2006/02/17(金) 15:44:20{;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;;
ヾ;;;ハ ノ .::!lリ;;r゙ シェルプログラミングはダサい…
`Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が
,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました
~''戈ヽ `二´ r'´:::.
0234名無しさん@お腹いっぱい。
2006/02/19(日) 20:42:230235名無しさん@お腹いっぱい。
2006/02/20(月) 11:37:550000:0000:0000:0000:0000:0000:0000:0001
に変換するシェルって、どこかにありますか?
簡単そうで結構大変なので、、、
0236名無しさん@お腹いっぱい。
2006/02/20(月) 11:41:000237名無しさん@お腹いっぱい。
2006/02/20(月) 12:43:370238名無しさん@お腹いっぱい。
2006/02/20(月) 12:58:56そんな変換は必要ないのがv6アドレスなので自分で作れ。
0239名無しさん@お腹いっぱい。
2006/02/20(月) 13:03:06シェルじゃないけど。
http://www.routemeister.net/projects/sipcalc/
0240名無しさん@お腹いっぱい。
2006/02/20(月) 13:16:29頭悪いのでperlでこんなのしか書けませんでした。
引数は stdin から与えてください。echo a:b:c:d::1 | これ とか。
#!/usr/bin/perl -n
chomp;
s/^::/0::/;
s/::$/::0/;
($s,$t) = /^(.*)::(.*)/;
$cs = split(':',$s) - 1;
$ct = split(':',$t) - 1;
$_ = $s . ':' x (7-$cs-$ct) . $t;
1 while s/::/:0:/g;
s/([0-9af-fA-F]{1,4})/000\1/g;
s/0*([0-9a-fA-F]{4})/\1/g;
print "$_\n\n";
0241名無しさん@お腹いっぱい。
2006/02/20(月) 13:19:28#!/usr/bin/perl -n
chomp;
s/^::/0::/;
s/::$/::0/;
($s,$t) = /^(.*)::(.*)/;
$cs = split(':',$s) - 1;
$ct = split(':',$t) - 1;
$_ = $s . ':' x (7-$cs-$ct) . $t;
1 while s/::/:0:/g;
s/([0-9a-fA-F]{1,4})/000\1/g;
s/0*([0-9a-fA-F]{4})/\1/g;
print "$_\n\n";
0242名無しさん@お腹いっぱい。
2006/02/20(月) 13:59:16なにこの顔。ふざけてるの?
0243名無しさん@お腹いっぱい。
2006/02/20(月) 14:12:10ば、いろんなところが顔に見えてきたorz
■ このスレッドは過去ログ倉庫に格納されています