シェルスクリプト総合 その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 でトレースしましょう。
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
0244名無しさん@お腹いっぱい。
2006/02/20(月) 21:57:120245名無しさん@お腹いっぱい。
2006/02/20(月) 22:25:160のバイトを省略せずに、0000:0000:0000:0000:0000:0000:0000:0001
に変換するエッソって、どこかにありますか?
0246名無しさん@お腹いっぱい。
2006/02/20(月) 22:45:340247名無しさん@お腹いっぱい。
2006/02/20(月) 23:59:130248名無しさん@お腹いっぱい。
2006/02/21(火) 09:45:59新しいシェルでしょうか?
既存のシェルにはどれも不満な点があるので
試してみたいのですがググっても
それらしいものは見つかりませんでした
0249名無しさん@お腹いっぱい。
2006/02/21(火) 09:47:440250名無しさん@お腹いっぱい。
2006/02/21(火) 09:59:31ん〜なんか簡単にできそうでうまくいかないんですよね・・・
一応できるんですが、なんかいまいち強引になるので・・・
教えてください。
/home/usr/ini/hoge.ini
/home/usr/ini/log.ini
/home/usr/ini/foo/test.ini
/home/usr/ini/foo/bar.ini
こんなんだったら
/home/usr/ini/の直下のhoge.iniとlog.iniだけをフルパス取得したい。
ただし、/home/usr/ini/の直下に何もないときは何も返さない。
0251名無しさん@お腹いっぱい。
2006/02/21(火) 10:31:120252名無しさん@お腹いっぱい。
2006/02/21(火) 10:32:060253名無しさん@お腹いっぱい。
2006/02/21(火) 10:42:36それ最初に思いついたのですが、
ls: 0653-341 ファイル /home/usr/ini/*.ini が存在しません。
のようにファイルが存在しない場合実現できません。
>>252
それよくわからんのですが、今の環境じゃ使えなさそうです。
AIX 5.2
0254名無しさん@お腹いっぱい。
2006/02/21(火) 10:46:16ls /home/usr/ini/*.ini 2>/dev/null
0255名無しさん@お腹いっぱい。
2006/02/21(火) 10:49:04ls: asdf*wqerty: そのようなファイルやディレクトリはありません
$ bash -c 'shopt -s nullglob; echo asdf*wqerty'
$ bash -c 'shopt -u nullglob; echo asdf*wqerty'
asdf*wqerty
0256名無しさん@お腹いっぱい。
2006/02/21(火) 10:53:36なるほど。これがシンプルでいいですね。
>>255
ほぉこんなのがあるのですね。
参考にさせていただきます。
こんな質問に答えてくれたかたありがとうございました。
0257名無しさん@お腹いっぱい。
2006/02/21(火) 10:56:110258名無しさん@お腹いっぱい。
2006/02/21(火) 12:11:340259名無しさん@お腹いっぱい。
2006/02/21(火) 12:23:570260名無しさん@お腹いっぱい。
2006/02/21(火) 12:26:51depth の
ディレクトリ本体の前に、ディレクトリの内容を先に評価する。
意味がよくわからんのですが、教えてください。
これで>>250可能なんすか?
0261名無しさん@お腹いっぱい。
2006/02/21(火) 12:30:04-depthはdepth firest search。指定しないとbreadth first search。
0262名無しさん@お腹いっぱい。
2006/02/21(火) 13:19:090263名無しさん@お腹いっぱい。
2006/02/21(火) 16:26:10hostコマンドを使うとしても、CNAMEが絡んでいたりすると
その標準出力の書式が一定せず、かといってdigコマンドでは
無駄な情報が多過ぎて切り出しが大変です。
さらに、bindのバージョンによってもhostやdigの出力が微妙に違うようです。
もっと言うと、DNSに登録されていなくて、/etc/hostsにのみ存在するホスト名でも
IPアドレスに変換したいのですが、となると、host/digコマンドは使えません。
シェルでIPアドレスに変換するには、どうやるのが一般的ですか?
あ、シェルで無理なら、エネオスでもジョモでもいいです。
0264名無しさん@お腹いっぱい。
2006/02/21(火) 16:55:220265名無しさん@お腹いっぱい。
2006/02/21(火) 20:30:29… という冗談はさておき、本当はどうやるのが一般的でしょうか?
0266名無しさん@お腹いっぱい。
2006/02/21(火) 20:36:14でもホスト名−IPアドレスってのは一意に決まらんと思う。
DNSでロビンちゃんしてたらどうするの?
0267名無しさん@お腹いっぱい。
2006/02/21(火) 20:47:27だと、実際には2行目以降が出力されて初めてパイプが終了するため、
取得に1秒程度かかってしまいます。
さらに、hostが立ち上がっていなかったり、firewallでpingが閉じられていると
2行目が出力されないため、head -1 が終了しません。
タイムアウトまで待てば終了するでしょうが、これでは使いものになりません。
0268名無しさん@お腹いっぱい。
2006/02/21(火) 20:54:03ホストのダウン対策は -t 1
0269名無しさん@お腹いっぱい。
2006/02/21(火) 21:02:03これって標準コマンドじゃないのかな。
0270名無しさん@お腹いっぱい。
2006/02/21(火) 21:04:56とか。
ロビンちゃん問題もどうするのか書いてないしどーでもいいけどな。
0271名無しさん@お腹いっぱい。
2006/02/21(火) 22:43:240272名無しさん@お腹いっぱい。
2006/02/21(火) 23:06:070273名無しさん@お腹いっぱい。
2006/02/21(火) 23:44:240274名無しさん@お腹いっぱい。
2006/02/22(水) 00:20:340275名無しさん@お腹いっぱい。
2006/02/22(水) 00:21:410276名無しさん@お腹いっぱい。
2006/02/22(水) 00:56:53getentがどこにもあれば一番いいと思うけれど。
0277名無しさん@お腹いっぱい。
2006/02/22(水) 01:06:470278名無しさん@お腹いっぱい。
2006/02/22(水) 02:05:26Linux だけど、gethostipインストールされてないです。
ちなみに Debian 3.1 (sarge)。
0279名無しさん@お腹いっぱい。
2006/02/22(水) 02:08:370280名無しさん@お腹いっぱい。
2006/02/22(水) 02:19:08root じゃないので、インストールできません…
0281名無しさん@お腹いっぱい。
2006/02/22(水) 02:27:040282名無しさん@お腹いっぱい。
2006/02/22(水) 02:28:20$ getent hosts www.2ch.net
でええやろ
0283名無しさん@お腹いっぱい。
2006/02/22(水) 09:37:48俺はこんなの自作して使ってるが。
#!/bin/sh
echo -n "Enter lines to get: "
read lines
iplist=`ssh hoge@hogehoge.org tail -$lines /var/log/httpd/access_log
| cut -f1 -d¥ `
for ip in $iplist
do
ipout=`host $ip | grep pointer | awk '{print($5)}' |
grep -v NXDOMAIN | sed "s/.$//g"`
if test "$ipout" = ""
then
echo "$ip"
else
echo "$ipout"
fi
done
0284名無しさん@お腹いっぱい。
2006/02/22(水) 09:45:49host じゃ /etc/host 見ないっしょ。
0285名無しさん@お腹いっぱい。
2006/02/22(水) 10:54:43getent hosts いいですね。glibcの付属コマンドみたいですね。
ただ、getent hostsでは、ごくたまーに、IPv6が登録されてるホストだと、
IPv6だけが引けて、IPv4が(登録されてるのに)引けません。
gethostipだと、IPv6は無視してIPv4のみが引けます。
どうすればいいでしょうか?
0286名無しさん@お腹いっぱい。
2006/02/22(水) 11:06:21・/etc/hostsは優先かどうか?
・v4/v6は両方欲しいのか、片方だけか。
0287名無しさん@お腹いっぱい。
2006/02/22(水) 11:11:39IPv4だけが欲しい。なるべくOS非依存にしたい。です。
0288名無しさん@お腹いっぱい。
2006/02/22(水) 11:43:46バージョンによる差異が無視できるかどうかがポイントか。
RubyでもPythonでもいいんだけど、入ってないことも多いし。
0289名無しさん@お腹いっぱい。
2006/02/22(水) 11:55:210290名無しさん@お腹いっぱい。
2006/02/22(水) 12:04:320291名無しさん@お腹いっぱい。
2006/02/22(水) 12:46:20ロビンちゃん問題はどうするんだよ!!
0292名無しさん@お腹いっぱい。
2006/02/22(水) 13:02:160293名無しさん@お腹いっぱい。
2006/02/22(水) 13:07:290294名無しさん@お腹いっぱい。
2006/02/22(水) 13:08:030295名無しさん@お腹いっぱい。
2006/02/22(水) 18:14:50ソフトリンクのみリストアップするシェルって、どう書けばいいですか?
0296名無しさん@お腹いっぱい。
2006/02/22(水) 18:18:27英語に親しんでおけって。
あ、スクリプトじゃなくてシェルを作るのか。bisonやflexについて
調べるのかな。まあどうでもいいことだけど。
0297名無しさん@お腹いっぱい。
2006/02/22(水) 18:22:43find . -type s | while true; do read x; ls -L $x >/dev/null; done | awk '{ print $2 }' | sed 's/:$//'
0298名無しさん@お腹いっぱい。
2006/02/22(水) 18:23:13find . -type l
や、
find . -follow -type l
ではできないことを確認の上で聞いてます。
ちなみに、英語は得意です。
0299名無しさん@お腹いっぱい。
2006/02/22(水) 18:23:560300名無しさん@お腹いっぱい。
2006/02/22(水) 18:25:16-type s ってUNIXドメインソケットなんですが、、
それ違うでしょう。
あと、ファイル名に空白があると誤動作するんじゃ困ります。
0301名無しさん@お腹いっぱい。
2006/02/22(水) 18:31:500302名無しさん@お腹いっぱい。
2006/02/22(水) 18:42:08ある程度自分でも書いてみたんでしょ? 晒してみなよ。 勇気だしてさ。
■ このスレッドは過去ログ倉庫に格納されています