- 1 名前:名無しさん@お腹いっぱい。 [2007/02/15(木) 14:28:44 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 前スレ シェルスクリプト総合 その7 pc10.2ch.net/test/read.cgi/unix/1157601611/
- 55 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 11:15:41 ]
- #!/bin/sh
IFS=\ for a in `find . -type f`;do echo "$a";done これでも、名前に改行が含まれるとダメなのでfind -execをおすすめする。
- 56 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 11:20:18 ]
- >>53
その方法、いいですね! でも環境変数を触るのって、どうなのでしょう? 触るとしても、 - start -------------------- OLD_IFS=$IFS IFS=' ' for f in `find . -type f` do echo $f done IFS=$OLD_IFS - end ---------------------- を推奨すべきかと。
- 57 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 11:27:22 ]
- いろいろ条件が許せば、find -print0とxargs -0のコンビにお任せする。
- 58 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 11:29:43 ]
- >>55
>>57 ああ、本当だ。改行がファイル名に入るとアウトですな。 for や while だと完全ではないですね…。
- 59 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 12:20:55 ]
- >>56
なんでそんなことする必要があるんだ? >>53 のスクリプト作って、実行した後の $IFS 見てみた方がいいよ。
- 60 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 13:11:12 ]
- 続きがあるとは想像できないのだろうか?
- 61 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 13:18:38 ]
- >>60
続きがあっても関係ない。 ↓これ試してみろ。 HOGE=hoge command echo $HOGE
- 62 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 14:04:31 ]
- $ cat hoge
IFS=' ' for f in `find -type f`; do echo "$f"; done; $ sh hoge sh hoge for: not found hoge: 2: Syntax error: ";" unexpected
- 63 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 14:09:59 ]
- $ cat hoge
IFS=' ' for f in `find . -type f`; do echo "$f"; done; だった。
- 64 名前:名無し募集中。。。 mailto:sage [2007/02/17(土) 21:45:40 ]
- 変数=値 command ( IFS='改行コード' for ... ) で実行した際
IFSの変更に対して安全かどうなかなんて元のお題には意味なくないか? 元のお題だとそもそもfindで引っかかる数(吐き出す文字数)が予測不能なんだし tabやspaceのことも含めて for はやめて find | xargs か while の方が安全なんだが あとファイル名に改行コードが含まれる場合は?とかこの板的には重要かもしれん けど、そこまで考えるとどうしたら処理できるか?より、そんなファイルが作られないように するにはどうしたらいいか?という問題になる気がする その上でそういうファイルをリネームや削除するスクリプトを組みたいっていうなら 環境や状況に合わせたものを組めばいい、動くことが重要で エレガントな一般的解法なんて考えても無駄だし必要もないはず
- 65 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/17(土) 22:54:12 ]
- もとのお題に対してはどうでもいいが、if, for, while, caseといった
フロー制御コマンドは変数=値 command形式では使えないという事実は、 このスレ的には重要。
- 66 名前:52 mailto:sage [2007/02/18(日) 09:45:52 ]
- 皆さん、どうもありがとうございました。なるほど、IFS とか while ですか。
自分の環境では改行がファイル名に入ることはとりあえずないんですが、 より厳密には find -print0 として IFS に NUL をセットすればいいんですかね? と思ったんですが... あれ、IFSにNULをセットって、どうやればいいんでしょう? たびたびすいません。
- 67 名前:名無しさん@お腹いっぱい。 [2007/02/18(日) 11:30:58 ]
- grep -e 'foo (\w+?) bar' file
とした場合、 perl などでは \1 で (\w+?) の内容を 参照できるのですが、 grep (sed, awk など) でそうする方法はありますか?
- 68 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 12:52:25 ]
- >>52
厳密にやりたかったら 1 find -print0を使ってNULLをレコードの区切りと認識できるコマンドで 処理する(shのwhileやforは使用できない) 2 find -execで1個づつ処理する。 3 perlで全部やる >>67 sedにはある。awkは知らん。マニュアル嫁。
- 69 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 13:03:35 ]
- 自分が知らんならマニュアル嫁とかほざくな。
- 70 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 13:29:37 ]
- マニュアル嫁よ>>69
- 71 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 14:30:15 ]
- 言うこと無くなると何度も前と同じ事を
繰り返してほざく知恵遅れが小学校の時にいたんだが、 >>68=70 でそいつを思い出した. もしかするとそいつかもw
- 72 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 15:13:28 ]
- 何度諭されてもしつこく絡んでくる >>69=>71 みたいなアフォもいたなぁ。
まあ、諭されてることすら理解できてないんだろうけど。
- 73 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 15:32:02 ]
- 72 が必死すぎる件
- 74 名前:69!=71 mailto:sage [2007/02/18(日) 15:33:37 ]
- おっと俺はこっちだ。
他人に煽られたからってお前がその煽り文句を真似して効果があるとは限らんぞ。
- 75 名前:68 mailto:sage [2007/02/18(日) 15:50:25 ]
- いくら煽っても>>67は回答を得られないという事実。
>>71 残念ながら>>70は俺じゃない。>>69のような糞蝿は煽るほどの価値もない。
- 76 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 15:59:07 ]
- クスクスクス
- 77 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 17:00:23 ]
- (・∀・)ニヤニヤ
- 78 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/18(日) 23:20:22 ]
- >>67
どっちでもできる。 man に載っているよ。
- 79 名前:64 mailto:sage [2007/02/19(月) 05:56:44 ]
- >>65
お、仰るとおりですな >>52 普通?は find コマンドと IFS 変数は関係ないよ いや余程特殊な環境があるなら分からんけど IFS 変数は Bourne Shell 系 ( sh, ksh, bash など) で区切り文字の定義に使われる で find コマンド自体はこの環境変数を参照しないから関係ない find -print0 は出力する各ファイル名にヌル文字を付加する で find -print0 が使える環境なら xargs -0 も使えるんじゃない? >>57さんが既に言ってるけどね >>67, >>78 sed, grep はあるけど awk はなかったような
- 80 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/19(月) 06:11:10 ]
- >>79
grep ではどうやんの?
- 81 名前:名無し募集中。。。 mailto:sage [2007/02/19(月) 06:55:03 ]
- >>80
環境によっては使えないかもね manでもネットでも調べれば?
- 82 名前:64 mailto:sage [2007/02/19(月) 07:03:11 ]
- >>52
あ、find -print0 と IFS を弄って while を組合わせたいって意味なら駄目だよ >>68さんの言ってる方法で それより -print0 オプションが使えない環境もあるから まずはそっちを調べた方がいいよ
- 83 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/19(月) 07:57:15 ]
- >>79
findコマンド自体では IFSは当然関係ないが、 findの結果を ` ` で取り込んで forの引数にする際に IFSが参照される。(IFSの影響を受ける) なので、スペース入りファイル名の問題なら、 IFSの内容を改行コードのみにして for f in `find ...` を実行すればOK なことは既に上に書かれている。
- 84 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/19(月) 17:57:07 ]
- >>68
ちなみに NULL じゃなくて NUL ですね。
- 85 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/19(月) 22:58:23 ]
- >>84
頭ではわかっているが、指が憶えてしまっているのでしょうがない。
- 86 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/20(火) 02:12:08 ]
- >>79
man awk の文字列関数の項を参照してみな。 もしかしたら gawk だけかもしれないけど。
- 87 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/20(火) 10:40:49 ]
- gawk 3.0 以上の拡張機能でございます。
- 88 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/20(火) 11:31:38 ]
- 大嘘つき
- 89 名前:64 mailto:sage [2007/02/20(火) 17:58:58 ]
- いつから正規表現板に?あと自分の環境が全ての人しか居ないの?
素のAIXじゃ、grep '\(a\)\1' はできたが egrep, grep -E は無理みたい 拡張正規表現だと \1 は使えなさそうあとawkも gawk は知らんけどgawkは無い環境も多いからawkとgawkを一緒にするな awkと言えば昔ながらの素のawkのことだよ linuxでshを語るアホウ(そりゃashだ)と同じやね
- 90 名前:64 mailto:sage [2007/02/20(火) 19:15:33 ]
- 最後だけ削除
shについては、Cygwinもash、今時の素のAIX、HP-UXなら実はkshだったりするから Solaris、FreeBSDは知らんけど例としてはかなり不適切やね、無視してくれ
- 91 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/20(火) 21:12:01 ]
- kshはねーよ。デフォルトでは使いにくい。
set -o emacs set -o vi どっち?
- 92 名前:osuga [2007/02/20(火) 22:49:15 ]
- >>90
HP-UXのデフォルトがkshかよ
- 93 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/20(火) 22:58:23 ]
- >>64は面白いな
- 94 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/20(火) 23:48:35 ]
- >>89
> 素のAIXじゃ、grep '\(a\)\1' はできた 参考までに grep のバージョン教えてくれ。 >>90 > Cygwinもash それいつの話? 手元の環境だと ash は入れてあるけど、sh の実体は bash になってるよ? $ uname -r 1.5.24(0.156/4/2) $ /bin/sh --version GNU bash, version 3.2.9(11)-release (i686-pc-cygwin) Copyright (C) 2005 Free Software Foundation, Inc.
- 95 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 02:37:28 ]
- >>89
POSIX的には拡張正規表現(ERE))でbackrefernceが使えるということは 一言も書いていないので、grep -E でbackrefernceが使えるGNU grep なんかが拡張しているということなんだろう。多分。
- 96 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 04:14:13 ]
- それにしてもネタないね
叩きはすぐ集まってくるけど grep '\(a\)\1' は実際できるし(AIX5.3、SFU)、基本正規表現(BRE)にあるんで linuxやHP-UXのgrepでも出来た記憶がある、まぁ昔の事なんで自信はない 拡張正規表現(ERE)にはBREの\( \)にあたるものが無いようで >>95はフォローしてくれたんだろうけど 実際にやってみたが egrep, grep -E じゃできなさそう(AIX5.3)と既に書いている HP-UXのshについては昔、といっても11iなんだが 純粋なshでは使えないはずの [[ ]] や alias なんかが使えたんで調べたら sh-posix とか書かれていて、sh->kshで拡張されたものがほぼ?まんま拡張されてた なんでHP-UXのshはksh、って位の認識だったんだが POSIX の sh いうんやから [[ ]] や alias が使えるのが今時の純粋な sh ということかもしれんね
- 97 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 09:12:36 ]
- おまえら >>1 読め
正規表現については以降はこちらへ ↓ 正規表現 pc10.2ch.net/test/read.cgi/unix/1039165754/
- 98 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 10:35:28 ]
- sh-posix ってのがあるんですよ奥さん
- 99 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 10:37:51 ]
- >>98
だから、sh-posixの部分だけ書けばいい。 正規表現の部分はスレ違い。
- 100 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 10:57:54 ]
- 本当にそういうものはあるのかな?
solaris においては /bin/sh は sh-posixではなく /usr/xpg4/bin/sh が ごにょごにょ FreeBSD では /bin/sh は IEEE Std 1003.2 (``POSIX.2'') に対応する途上 NetBSD では /bin/sh は POSIX 1003.2 and 1003.2a に対応する途上 OpenBSDでは (ry HP-UX では
- 101 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 10:59:10 ]
- あ、きみ宛というよりは>>96宛てかな?
- 102 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 12:16:07 ]
- docs.hp.com/ja/B2355-60104-02/sh-posix.1.html
でも嫁 現在のHP-UXの/bin/shはsh-posixであって、古いbourne shellは存在しない sh-posixはkshによく似ているが別物 >>90は間違いだらけ
- 103 名前:95 mailto:sage [2007/02/21(水) 12:40:01 ]
- >>96
すまん。寝る直前に書いたせいか フォローのつもりがわけのわからんものになってた。 GNU のツールでそうだからといって、 それがUNIX全般でいえるかというと違うよね。 というのを補足したかった(awkとgawkとか)
- 104 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 13:49:30 ]
- >>102
以前は /usr/old/bin/sh に Bourne shell があったんだけど今はもうないの? 手元に実機がないので確認できない。
- 105 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 14:03:34 ]
- >>104
実機がなくても参照できちゃうんだなこれが docs.hp.com/ja/B2355-60104-02/sh.1.html - 注記 : B シェル (/usr/old/bin/sh) は、HP-UX 11i Version 1.5 以降、削除されました。 代りに、POSIX シェル (/usr/bin/sh) を使ってください。 - 本当に実機がこうであるかは確認していないけどね〜
- 106 名前:ksh [2007/02/21(水) 19:49:50 ]
- こんばんわ ペソです。
シェル初心者ですが教えてください。 「ディレクトリの中にあるファイルで、実行権限のないファイルを読み込み そのファイルに実行権限を付与するシェルが必要なのですがどうすればいいのかわかりません。 OS: AIX shell: ksh #!/bin/ksh for filename in ${1:+$1/}* ; do newfilname=$(print $filename |tr [A-Z] [a-z]) newfilename=$newfilename%.} print "$filename -> $newfilename" mv $filename $newfilename done とりあえず自宅のfedora core5 のkshで実行したら、 ' unexpectedtax error: ` と表示されて困ってます。 どうか教えてください。お願いします。
- 107 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 19:56:52 ]
- >>106
質問が支離滅裂。実行権限を付けたいといっているのに、 スクリプトではファイル名の大文字を小文字にリネームしようとしている。 あと、クォートが正しくないので、スペース入りファイル名とかでコケるだろう。 釣りじゃないならもう一度よくまとめてから質問し直せ。
- 108 名前:ksh [2007/02/21(水) 20:43:07 ]
- すいませんでした。
リネームするスクリプトを少し変更して作ろうとしているのですが、 このファイルもこけて動かないんです。
- 109 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 21:12:05 ]
- >>106
そんなの、 #!/bin/sh chmod +x "$1"/* だけでいいじゃん。kshである必要もなし。
- 110 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 21:13:56 ]
- とりあえず
1. シェルスクリプトのことをシェルというな。 2. forの次の行からdoneの前の行までは全部リネーム用でいらないから削れ。 3. man test 4. man chmod
- 111 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 21:15:07 ]
- >>109
「実行権限のないもののみを選び出す」というのが宿題の一部であると 思われるので、問答無用で+xしちゃいけないかもしれない。
- 112 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 21:19:54 ]
- 「実行権限のないもののみを選び出す」意味がない。
もともと +x なファイルを chmod +x しても影響はない。 AIXで実行しようとしてるし、だとすると 宿題じゃなく、実務で必要なんだろ。 chmod +x で十分。 (ctimeは更新されるけど、そんなの普通関係ない)
- 113 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 21:23:34 ]
- >>110
えっと、こういうことでしょうか? #!/bin/ksh for filename in ${1:+$1/}* ; do man test man chmod done やってみましたが、なんか、ファイルの数だけマニュアルのようなものが表示され、 実行権限は付きませんでしたが、、
- 114 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 21:25:51 ]
- なんだ釣りか。
- 115 名前:ksh [2007/02/21(水) 22:08:50 ]
- kshです。
#!/bin/ksh for filename in ${1:+$1/}* ; do if [[ -f $filename ]] ; then chmod +x $filename fi done なんとかディレクトリの中のファイルすべてに実行権限を付与できました。 これはシェルスクリプトと言うのでしょうか? お恥ずかしながらシェルスクリプトとはなにか?イメージが完全でなく・・・
- 116 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/21(水) 22:38:30 ]
- >>115
> kshです。 ペソじゃなかったのかw
- 117 名前:ksh [2007/02/21(水) 22:53:27 ]
- あっペソです!!
ルールよくわかってなくてすみませんっw
- 118 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/25(日) 06:28:13 ]
- >>102
単に興味本位で聞くけどsh-posixとkshを比較して 実際に機能として違う部分てどんなところがあるの?
- 119 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/26(月) 18:34:31 ]
- すごく久しぶりに man tcsh してみたのだが。
あれ、"THE T IN TCSH" なんて項目、昔あったっけ? turbo csh じゃないじゃん > 昔俺にそう教えた奴
- 120 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/26(月) 18:41:12 ]
- Tenex CSHの略だと思っていたが、Tenex & Tops-20だったんだな。
- 121 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 00:44:41 ]
- TOPS-20 ねぇ。command line editing が欲しくてcshからtcshに移ったが、
それまでは、fep 使ってました。bash は、なじめんな。 今は、zsh 派です。
- 122 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 04:53:35 ]
- >>118
102とは別人だけど、kshはksh88とksh93で非常に違う。 とくに後者はperlに遜色ないほどの汎用言語になっている。 kshはbashと同じくshベースということで、 bashがkshから採り入れた機能もけっこうある。ローカル変数とか
- 123 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 17:22:33 ]
- >>119
え?違うんだ、知らなかった
- 124 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 22:13:24 ]
- kshといえばwkshで一度でいいから遊んでみたかった。
もうwのないkshしかないからなぁ・・・
- 125 名前:名無しさん@お腹いっぱい。 [2007/02/27(火) 22:45:55 ]
- viで編集中は日本語のメッセージが正しく表示されていたのですが、シェルスクリプトを実行するとメッセージが文字化けします。どうすればよいですか。
- 126 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 22:49:25 ]
- viが自動認識して処理してる?
nkf -e < script nkf -j < script nkf -s < script nkf -w < script で化けないパターンを探してそれに置き換える。
- 127 名前:名無しさん@お腹いっぱい。 [2007/02/27(火) 22:51:13 ]
- >>125
その vi の実体は、賢い vi で、 シェルの ENV がついていけてないとか。
- 128 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/28(水) 00:25:54 ]
- Cシェル、Oracle10gで
exp 〜 query\"where column_name in\( select col from tableB \) \" みたくqueryパラメータで副照会できないようなんで exp 〜 query\"where column_name in\( $COLUMN_NAMES \) \" なんて具合に変数を埋め込みたい。 シェル変数が展開されてからexportに渡されるようにする方法ないかな?
- 129 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/28(水) 00:54:58 ]
- >>126
nkf -g が無いバージョンかな?
- 130 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/28(水) 01:00:16 ]
- おお、そんなものが。
nkf -wができることに最近気づいたくらいアップデートしてなかったんで。
- 131 名前:名無しさん@お腹いっぱい。 [2007/02/28(水) 09:20:31 ]
- 浜田マキ子って人のジャーナル見てみなよ。
中国の恐さにぞっとすること請け合い。 あいつら本気で日本を侵略する気だ。 そして、手下はやはり立命館?
- 132 名前:118 mailto:sage [2007/03/01(木) 04:39:27 ]
- >>122
すんません書き漏れです 知りたいのはsh-posixとksh88の機能差です kshにksh88とksh93があってかなり違うってのは知ってるというか kshの情報には大抵2つのバージョンの比較が併記されてるもんだし ただsh-posixとksh88の比較は見たことがないし違いも見つけられなかったもんで
- 133 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/01(木) 06:28:17 ]
- >>132
・ パターンマッチングがegrep相当に拡張 ・ [[ ほげ ]] (中身をメタキャラ解釈しないtestのようなもの) ・ 配列が使えた ・ emacs風コマンドライン編集 ってとこか。なおksh93はksh88と挙動が違ったりバグが直されたりしてるし、 ksh88とpdkshでも機能に違いがあるので、 ksh88で動けば他のkshで動作するとは限らない
- 134 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/01(木) 22:50:40 ]
- ksh に限らないが、バージョン依存の対応は本当に面倒だな。
- 135 名前:名無しさん@お腹いっぱい。 [2007/03/02(金) 00:10:52 ]
- こういうデータを、
---- yes ・・・・ ・・・ ・・・・・ IPアドレス xxx.xxx.xx.54 ---- no ・・・・ ・・・・・ IPアドレス xxx.xxx.xx.123 ---- yes ・・・・・・・・・ ・・・・・ IPアドレス xxx.xxx.xx.23 こういうふうに加工したいのですが、 yes,xxx.xxx.xx.54 no,xxx.xxx.xx.123 yes,xxx.xxx.xx.23 ・・・・・・・・・ ・・・・・ の部分は2行のときもあるし10行のときもあります。
- 136 名前:135 [2007/03/02(金) 00:14:33 ]
- 最初の
---- と IPアドレス という文字をうまく関連付ければ 加工可能とは思うのですが、 具体的にどうしたらいいのかよくわかりません。 最初の ---- を見つけたら その次の「IPアドレス」という文字列を捕まえて xxx.xxx.xx.123を確保する、 という形でしょうか。 うまい方法があればヒントをいただけますか? cat、more、grep、cut、sedなど一般的なコマンドは習得しています。
- 137 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 00:19:45 ]
- 1行1レコードじゃないときは
めんどくさいから perl 使っちゃうな。
- 138 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 00:34:22 ]
- csplit input '/^----$/' '{*}'
for file in xx*; do echo `sed -n '2p;${s/.* //;p}' $file`; done csplitってPOSIX標準だっけ?
- 139 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 00:34:30 ]
- 俺もperlかawkに1票。適材適所ってやつ。
- 140 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 01:17:00 ]
- awkで RSに---を入れてやればいいじゃない
- 141 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 01:52:51 ]
- ここはあえてCで
- 142 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 02:52:27 ]
- >>141
書いてみて
- 143 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 08:40:46 ]
- >>135
俺も awk に一票だが、 最初と最後をどうにかすれば grep と sed だけでもできそう。 grep -C 1 -x -e ---- | sed .... こんな感じで。
- 144 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 08:56:59 ]
- 143 | sed -n '
N; N; N; s/¥(yes¥|no¥)¥n/¥1 /; s/----¥n//; s/--¥n//; s/IPアドレス //; p' 改行ってどこのsedでも¥nと書けるのだっけ?
- 145 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 09:03:20 ]
- あー、最後の部分がきちんと処理できないな。
- 146 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 09:10:43 ]
- sed -n '
/¥(yes¥|no¥)/h; /IPアドレス /{ H; x; s/¥(yes¥|no¥)¥n/¥1/; s/IPアドレス /,/; p }' input どだっ!?
- 147 名前:135 [2007/03/02(金) 13:43:23 ]
- みなさんありがとうございます。
僕はまだレベルが低いですし awkは(難しくて)使えないので >>143さんの grep -C オプションでやってみよと思います。
- 148 名前:名無しさん@お腹いっぱい。 [2007/03/02(金) 15:27:32 ]
- 変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするにはどうすればいいですか。
- 149 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 15:32:33 ]
- >>148
ちょっと、質問が複数の意味に取れるけど、 ls > "$1"/"$2" ってことか?
- 150 名前:148 [2007/03/02(金) 16:42:33 ]
- >>149 できたっす。バックスラッシュいれてたっす。
- 151 名前:名無しさん@お腹いっぱい。 [2007/03/02(金) 17:25:16 ]
- 変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするときに、すでにファイルが存在する場合、上書き確認のメッセージを出して処理を分岐させるにはどうすればいいですか。
- 152 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 17:27:36 ]
- test -f ファイル
[ -f ファイル ]
- 153 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 18:47:44 ]
- その調子で、1から10まで全部ここで聞くのか?
- 154 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 19:02:57 ]
- シェルスクリプトの犬小屋でも作るか?
- 155 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 19:07:44 ]
- いらね。
|

|