1 名前:login:Penguin [2007/07/10(火) 23:17:13 ID:qGthZdME] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? 【sed】シェルスクリプト総合@LINUX Part2【awk】 pc11.2ch.net/test/read.cgi/linux/1154578200/ pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
242 名前:login:Penguin mailto:sage [2007/10/15(月) 23:35:58 ID:6xnjJ9Cn] >>241 じゃあ1分に1回よりも高頻度(30秒に1回とか、15秒に1回とか) やりたい場合はどうすれば?
243 名前:login:Penguin mailto:sage [2007/10/16(火) 00:24:31 ID:7lwU6GvW] アタックしたいのか?
244 名前:login:Penguin mailto:sage [2007/10/16(火) 01:36:38 ID:IhGBMLbJ] >>242 wget ...; sleep 30; wget ... するスクリプトを毎分実行するとか。
245 名前:login:Penguin mailto:sage [2007/10/16(火) 08:18:30 ID:a72PxkLH] >>243 アタックしたいわけじゃないですよ。 ただcronって最高でも1分に1回しか実行できないはずなので、それよりももっと短い間隔で 処理をさせたい場合とかどうするのかなぁとふと疑問に思ったもので。 >>244 なるほど・・。 しかし wget ... ; のところで1分ぐらい処理に時間がかかった場合 その後の sleep 30 ; がきて、そしてまた wget ... がくるから、タイミングと言うか場合によっては 30分に1回キッチリ実行されるとは限りませんね。31分かかって、その後実行されて 今度は29分後に実行されるみたいなズレ方はしますよね。
246 名前:login:Penguin mailto:sage [2007/10/16(火) 08:26:34 ID:IhGBMLbJ] >>245 バックグラウンドで実行するとか。 つーか、何分もかかる処理を30秒ごとに実行していいのか?
247 名前:login:Penguin mailto:sage [2007/10/16(火) 11:46:31 ID:wfMufGFC] cronはプロセスが無限増殖するのを抑えるために、同時実行数に制限があるので注意 Solarisだと、確か同時実行数が100個を超えるとそれ以降は時刻が来ても起動しなくなる LinuxだとOOMキラーが動いて刈り取られるかもしれん cronの起動間隔 ≒ プロセスの実行時間 となるような長めのプロセス、特に通信関係とかで長めのタイムアウトが発生しそうな プロセスをcronに仕込むときは、注意したほうがいい
248 名前:229 mailto:sage [2007/10/16(火) 13:58:23 ID:EtpWijek] 環境が手元にないもので、遅レスになってしまいすみません。 >>235 なるほどです。ありがとうございました。 >>236 ありがとう。aliasでも出来そうでした。 >>237 .の後に続けて入力したところ、うまくcdできました。 >>238 素人なのでよく分かりませんが、実行ファイルを実行するときに付けるんでは? それでは、みなさんありがとうございました。
249 名前:login:Penguin mailto:sage [2007/10/16(火) 14:09:44 ID:IhGBMLbJ] >>248 . shell.sh でもいっしょだよ。 やってみ。
250 名前:login:Penguin mailto:sage [2007/10/16(火) 17:45:32 ID:a72PxkLH] ./ を つけるのは カレントディレクトリのファイルを指定する為。 つけないと 環境変数 $PATH の中から該当する物が無いかを探してなかったら エラー返すので。 カレントディレクトリのファイルを指定する時にいちいち ./ をつけるのが面倒だからって $PATH に ./ も含めてしまうとセキュリティホールになるので やらないでね。
251 名前:login:Penguin mailto:sage [2007/10/16(火) 17:50:59 ID:IhGBMLbJ] >>250 >>249
252 名前:login:Penguin mailto:sage [2007/10/16(火) 18:39:11 ID:tU6zGUOB] シェルスクリプトで端末の現在の行数を得るにはどうしたらいいですか
253 名前:login:Penguin mailto:sage [2007/10/16(火) 19:18:04 ID:iHfKM46h] stty -a とかかな。
254 名前:login:Penguin mailto:sage [2007/10/16(火) 19:45:06 ID:tU6zGUOB] >>253 情報ありがとうございます。 行数を表示するだけでなくて、 シェルスクリプトの中で行数を変数に格納して、 なんらかの処理を行いたいと思っているのですが 何かうまい方法はありますでしょうか
255 名前:login:Penguin mailto:sage [2007/10/16(火) 21:12:10 ID:pdm4T3SF] >>254 ROWS=`stty -a | tr ";" "\n" | grep rows | sed "s/.*rows //"`
256 名前:login:Penguin mailto:sage [2007/10/16(火) 21:36:05 ID:tU6zGUOB] >>255 できましたありがとうございました。
257 名前:login:Penguin mailto:sage [2007/10/16(火) 23:32:43 ID:sWAUZpv3] $LINES じゃだめなの?
258 名前:login:Penguin mailto:sage [2007/10/17(水) 04:58:42 ID:d5Vjha9K] シェルスクリプトの中で$LINESがとれるとでも?
259 名前:login:Penguin mailto:sage [2007/10/17(水) 10:00:57 ID:9KXOUzKW] ROWS=`tput lines` COLS=`tput cols`
260 名前:login:Penguin mailto:sage [2007/10/17(水) 22:15:42 ID:VuOM9tU/] eval `resize` echo $LINES $COLUMNS
261 名前:login:Penguin mailto:sage [2007/10/18(木) 12:39:19 ID:fyMSNeWa] >>260 resize は X がインストールされていない環境では使えない。 xterm の付属物なので。
262 名前:login:Penguin [2007/10/23(火) 17:14:39 ID:OMh5qn/O] ちょっと相談に乗ってください。 日付.pc名.サイト名_access_log ex) 20071023.pc-local01.hoge_access_log 20071023.pc-local02.hoge_access_log 20071023.pc-local01.hagehoge_access_log 20071023.pc-local02.testhoge_access_log と言うログファイルをサイト名別のフォルダに移動した後 1つのログファイルにマージさせるスクリプトを書きたいのですが。 とりあえず、スクリプト書いてみたのですが正直何がなんだか 分かりません。アドバイスを下さい。 #!/bin/sh timestamp=`date +%Y%m%d` log=`find /home/hoge/log -name $timestamp.*` list=`echo "$log" | sed -e 's/_access_log//g' | cut -c57-` スクリプトでは、今日のタイムスタンプを取ってlogファイルを検索し その結果のサイト名以降の”_access_log”を消して、サイト名より前 も入らないので、表示させないようにする。これから、サイト別にフォルダを 作ってそこに移動させるのですが、mkdir "$list"では上手く行きません。 何かいいアドバイスを教えてください。よろしく御願いします。
263 名前:login:Penguin mailto:sage [2007/10/23(火) 17:19:48 ID:4jX2ZQqu] >>262 cut -c57- ってのは何?
264 名前:login:Penguin mailto:sage [2007/10/23(火) 17:20:31 ID:XqFIvlF4] >>262 シェルスクリプト以前の話だな。 まずは最終的に何をやりたいのかをはっきりしろ。
265 名前:login:Penguin mailto:sage [2007/10/23(火) 17:26:06 ID:4jX2ZQqu] >>262 $log にたくさんファイル名が入ってるのに echo $log をいじろうとするのがよくわからんな。 >>264 まずは日本語の勉強からだな。
266 名前:login:Penguin mailto:sage [2007/10/23(火) 17:50:56 ID:OMh5qn/O] >>263 サイト名だけの文字を取りたかったので、cut -c57- としました。 >>264 申し訳御座いません。 ログファイル名からサイト名だけを文字を取り出して、取り出した文字 (サイト名)のフォルダを作って、作ったフォルダにそれぞれログを 振り分けてログファイルをマージさせたいです。 これで、少しは伝わりますでしょうか? >>265 $logの結果からサイト名の文字だけ取りたかったので、echo $logを いじっています。
267 名前:login:Penguin mailto:sage [2007/10/23(火) 18:08:13 ID:XqFIvlF4] >>266 プログラミングの論理部分を勉強したほうがいい。 「やりたいこと」と「実際のスクリプト」の間には 「ロジックを組み上げる」作業が必要になるが、 君はこの部分について全く理解できていないようだ。 まずは 「findで検索したファイルの一覧はどういう形で変数logに入っているのか」 「その変数logに対して繰り返し処理を行なうにはどうしたらよいか」 を調べてくるべし。
268 名前:login:Penguin mailto:sage [2007/10/23(火) 18:09:14 ID:4jX2ZQqu] そもそも find でうまくいかんな。
269 名前:login:Penguin mailto:sage [2007/10/23(火) 18:17:19 ID:OI+rqPpl] >>262 find . -type f -printf %f\\n|awk -F. '{gsub(/_access_log/,"",$3);print $2 "." $3}'|uniq >hostlist for i in $(cat hostlist);do mkdir $i;done あとawkで同じように cp 20071023.pc-local02.testhoge_access_log pc-local02.testhoge のようなlist作って実行
270 名前:login:Penguin mailto:sage [2007/10/23(火) 18:18:51 ID:OMh5qn/O] >>267 アドバイスありがとうございます。 正直、インフラ担当なのでプログラムさっぱりです(;´Д`) とりあえず、ググって調べてみます。 >>268 もう少し調べてから、スクリプト書き直します。 ありがとうございました。
271 名前:login:Penguin mailto:sage [2007/10/23(火) 18:20:53 ID:OMh5qn/O] >>269 ありがとうございます。 参考にさせて頂きます。とりあえず、スクリプト周りを調べて 書いてみます。
272 名前:login:Penguin mailto:sage [2007/10/23(火) 18:25:49 ID:4jX2ZQqu] #!/bin/sh cd /home/hoge/log for i in `date +%Y%m%d`.*; do dir=`echo $i | cut -f2 -d.` [ -d $dir ] || mkdir $dir mv $i $dir done ファイル数が多過ぎるとかヘンなファイル名とかは知らね。
273 名前:login:Penguin mailto:sage [2007/10/27(土) 10:44:25 ID:mm4VeEeL] IPアドレスを16進に変換したいです。 どうやりますか?
274 名前:login:Penguin mailto:sage [2007/10/27(土) 13:17:13 ID:D/VUEDKM] echo '192.168.0.1' | gawk -F. '{printf("%02x%02x%02x%02x\n", $1, $2, $3, $4)}'
275 名前:login:Penguin [2007/10/27(土) 13:26:52 ID:QMQXG4ov] >>274 俺のIPサンプルに使うなよ。晒されたら攻撃の的になるだろうが(´・ω・`)
276 名前:login:Penguin mailto:sage [2007/10/27(土) 13:35:53 ID:6kGxUA5U] >>274 ありがとうございました。
277 名前:login:Penguin mailto:sage [2007/10/27(土) 14:33:40 ID:NSYPc3Nw] >>275 ネットに繋がらないと思ったらお前のせいかー! 早く俺のIP返してくれよ(´・ω・`)
278 名前:login:Penguin [2007/10/27(土) 15:34:59 ID:XQQiaIjq] >>275 そうか、そんなにお望みなら今から的にしてやるよwww タシロ砲とブラスターとあと手持ちの攻撃ツールの標的IPを全部セットして攻撃開s
279 名前:login:Penguin mailto:sage [2007/10/27(土) 19:24:46 ID:OFawlVSO] 俺のIPは127.0.0.1だから攻撃するなよ
280 名前:login:Penguin mailto:sage [2007/10/27(土) 21:20:28 ID:jIwdHtQL] ひどいネタスレと化してるなココwwwwww
281 名前:login:Penguin mailto:sage [2007/10/29(月) 10:48:36 ID:AXA/ueYo] 俺のIPは172.31.0.1だぞ。
282 名前:login:Penguin mailto:sage [2007/10/29(月) 10:55:37 ID:PqFYrP+5] もういいよ。
283 名前:login:Penguin [2007/10/29(月) 11:01:37 ID:F/RFN0ba] 俺のIPは203.・・・・ いややめとく
284 名前:login:Penguin mailto:sage [2007/10/29(月) 18:16:52 ID:lN+2vPd7] じゃあオレも1個 オレのIPは 169.254.88.24だぞ。
285 名前:login:Penguin mailto:sage [2007/10/29(月) 20:28:52 ID:vqPZDaQA] あ、思い出した。 255.255.255.255 -> 0xffffffff のように、IPv6表記を16進表記に変換する手続きを考えてくだちい。 f000::1 -> 0xf0000000_00000000_00000000_00000001 ("_"は不要) ff::169.254.88.24 -> 0x00ff0000_00000000_00000000_a9fe5818
286 名前:login:Penguin mailto:sage [2007/10/29(月) 23:28:48 ID:Hdkrl+3D] 完全に他人まかせだなぁ。 > ruby -rsocket -e 'p Socket.gethostbyname("ff::169.254.88.24")[3].unpack("C16").map{|c|format "%x",c}.join' "00ff00000000000000000000a9fe5818"
287 名前:login:Penguin mailto:sage [2007/10/30(火) 21:40:02 ID:Hmkhn1Qf] あー、目鱗。 gethostbyname()等を使えばいいのか。
288 名前:login:Penguin mailto:sage [2007/11/06(火) 00:15:33 ID:vKEt0xzk] あるコマンド(hoge)の結果が・・・ (カラム位置) [col1 col2 col3 col4] (コマンド出力) 0001 0002 * 0004 である場合にこの結果をset `hoge`で受けた場合、位置変数 $3に「*」が入ってくるようにbashのスクリプトを作成したい のですが現状ではどうやってもカレントディレクトリ配下の ファイル一覧が入ってきてしまいます。 何か良い手がありましたら教えて下さい。
289 名前:login:Penguin mailto:sage [2007/11/06(火) 00:55:19 ID:M5wBEVHJ] "`hoge`"
290 名前:login:Penguin mailto:sage [2007/11/09(金) 03:25:37 ID:r4+4tELy] >>289 オイオイ!w マジレスすると $ set -o noglob じゃないの
291 名前:login:Penguin mailto:sage [2007/11/09(金) 06:12:20 ID:BEUM5jSj] >>300 zenity を使うとシェルスクリプトで手軽な GUI が作れるぞ
292 名前:login:Penguin mailto:sage [2007/11/09(金) 08:21:31 ID:kDM6jkym] ttp://www.google.co.jp/search?hl=ja&q=zenity でトップに出て来るページは、もしかしてケンカを売ってますか? >最新のGnomeデスクトップを使っていても古いUnixユーザーはすぐにターミナルエミュレータを開いてしまいがちです。
293 名前:login:Penguin mailto:sage [2007/11/09(金) 12:05:22 ID:ei55nGr2] 文章全体から見てポジティブな物言いだと思うが...
294 名前:login:Penguin mailto:sage [2007/11/10(土) 01:20:06 ID:5ErO5tFm] zenity の使用例: jpg と mp3 をあわせて avi を出力するスクリプト 音声ファイルをビデオホスティングサイトに投稿時に使用 ==================================== #!/bin/sh # mp3jpg2avi.sh JPG_FILE=`zenity --title="JPG ファイルを選択してください" --file-selection` MP3_FILE=`zenity --title="MP3 ファイルを選択してください" --file-selection` zenity --title="質問" --question --text "変換開始しますか?" if [ $? = 0 ]; then ffmpeg -shortest \ -loop_input -f image2 -i $JPG_FILE \ -i $MP3_FILE \ -sameq output.avi fi ====================================
295 名前:login:Penguin mailto:sage [2007/11/10(土) 09:47:24 ID:9Zj/zooJ] >>292 Linuxから入った人だけど、Gnomeなんてマルチウインドウ端末エミュレータ支援ソフト西か見えません
296 名前:login:Penguin mailto:sage [2007/11/10(土) 11:07:23 ID:vw7Wu+HW] マルチウインドウ端末エミュレータ支援ソフト西やら マルチウインドウ端末エミュレータ支援ソフト力石やら マルチウインドウ端末エミュレータ支援ソフトホセ=メンドーサやら知らん。
297 名前:login:Penguin mailto:sage [2007/11/10(土) 11:19:14 ID:9Zj/zooJ] >>296 一応ここでタオル投げときますね。つ〜
298 名前:login:Penguin mailto:sage [2007/11/10(土) 18:43:49 ID:Skjd8N2z] そういやこの間表参道歩いていたら、 胸にでっかく 「マンモス西」 と書かれたTシャツを着たガイジンが 前からいきなり歩いてきてビビった。 東京は怖い街だよ。
299 名前:login:Penguin mailto:sage [2007/11/10(土) 19:19:41 ID:PRddAKpB] そんなアナタに engrish.com/
300 名前:login:Penguin mailto:sage [2007/11/10(土) 20:24:35 ID:Skjd8N2z] そこのこの写真に、"Photo courtesy of Paul Gilbert"ってあるけど、 あのポールギルバートなんだろうか? ttp://www.engrish.com/detail.php?imagename=Hate.jpg&category=Clothing&date=2001-11-03 日本に住んでたしなあ。
301 名前:HhMiKdKNVb mailto:vyqkae@ndzhjf.com [2007/11/12(月) 01:38:17 ID:J0HpIKvZ] hlUotX <a href="jtpkztrjwlma.com/">jtpkztrjwlma</a>, [url=ykcooubrqrga.com/]ykcooubrqrga[/url], [link=tvapeckiqvbf.com/]tvapeckiqvbf[/link], cygdvmjubaqg.com/
302 名前:login:Penguin mailto:sage [2007/11/13(火) 02:33:43 ID:tnRwnYpT] 恥を忍んで質問なのですが /home/me/ 以下にjpgファイルが数千有ります 中身はこんな感じなのですが 1082053423922.jpg 1082053508305.jpg 1082053537535.jpg 1082053614971.jpg 1082053699948.jpg 1082053732609.jpg 1082053763346.jpg 1082391828601.jpg 1082392563669.jpg 1083091232922.jpg この数千の*.jpgのファイルをディレクトリから読み込んで以下タグの中にディレクトリから読み インクリメンタルに全ての画像ファイルがリンク代入された状態で出力したいと思っています <div id="myGallery"> <div class="imageElement"> <h3>Item 1 Title</h3> <p>Item 1 Description</p> <a href="mypage1.html" title="open image" class="open"></a> <img src="images/foo/a.jpg" class="full" /> <img src="images/foo/a-thum.jpg" class="thumbnail" /> </div> ディレクトリから読み込んだfileの名前a.jpgににファイルの中が無くなるまで 置換したいという意味なのですが.. どうか、助言願えないでしょうかm(__ __)m
303 名前:login:Penguin mailto:sage [2007/11/13(火) 07:47:54 ID:xB6HVDtO] まずは「この数千の……」以降の文章を推敲して他人に理解できるよう 書き換える。
304 名前:login:Penguin mailto:sage [2007/11/13(火) 10:11:50 ID:VZT+kd7x] >>302 zphoto でも使ったら?
305 名前:login:Penguin mailto:sage [2007/11/13(火) 12:34:27 ID:v1//zET/] こういうことか? for f in `ls -1 /home/me` ; do echo '<img src="images/foo/'$f'" class="full" />'; done for f in `ls -1 /home/me | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done
306 名前:302 mailto:sage [2007/11/13(火) 14:02:39 ID:tnRwnYpT] >>303 深夜に回転数が落ちていまして申し訳ないですm(_ _)m >>304 それも考えたのですが、出来ればこちらの方が良いなと思いまして.. >>305 バッチリ書き出せました、もの凄い感謝なのですが thumとthum無しのイメージが交互に書き出すことが出来ると思います 教えていただいた物を各ディレクトリに置き換えたものが以下の物なのですが for f in `ls -1 /www/web_dir/photo_album/images/foo/`; do echo '<img src="images/foo/'$f'" class="full" />'; done for f in `ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}'` ; do echo '<img src="images/foo/'$f'" class="full" />'; done 1行目と2行目を並べて出力できるように努力したのですが... gawkの部分で引っかかってしまいます、というか1行目しかループしてくれません(T.T) 補足いただければと思うのですが、よろしくお願いします マジ感謝感激です shell sciptとawkの本もamazonしようと思っています
307 名前:302 mailto:sage [2007/11/13(火) 14:19:58 ID:tnRwnYpT] もうちょっとで出来そう...
308 名前:302 mailto:sage [2007/11/13(火) 15:05:30 ID:tnRwnYpT] 出来ました ありがとうございましたm(__ __)m
309 名前:login:Penguin mailto:sage [2007/11/13(火) 15:14:48 ID:MuKLiZO1] 最終的にどうやりましたか? 報告して下さい。
310 名前:302 mailto:sage [2007/11/13(火) 15:32:02 ID:tnRwnYpT] ディレクトリを作りthumnail入れてこれで出力できました for f in `ls -1 /www/web_dir/photo_album/images/foo/`; do echo '<div id="myGallery">'; echo '<div class="imageElement">' echo '<h3>Item 1 Title</h3>' echo '<p>Item 1 Description</p>' echo '<img src="images/foo/'$f'" class="full" />'; echo '<img src="images/foo-thum/'$f'" class="full" />'; echo'</div>'; echo ' '; done
311 名前:login:Penguin mailto:sage [2007/11/13(火) 15:42:18 ID:MuKLiZO1] ちなみにサムネールは thumnail じゃなくて thumbnail ね。
312 名前:302 mailto:sage [2007/11/13(火) 16:02:23 ID:tnRwnYpT] はい、ありがとうございました^^
313 名前:login:Penguin mailto:sage [2007/11/13(火) 18:23:44 ID:v1//zET/] >>306 ls -1 /www/web_dir/photo_album/images/foo/ | gawk '{gsub("\\\.", "-thum.");print}' ここだけ実行するとどうなるの?
314 名前:login:Penguin mailto:age [2007/11/16(金) 18:50:01 ID:q8UeZNS0] ls -d /a/b/c/d/*/ のようにコマンドを打ち込むと /a/b/c/d/hoge1 /a/b/c/d/hoge2 /a/b/c/d/hoge3 のように出力が帰ってきますよね。この中から hoge1, hoge2, hoge3 の部分のみ、つまり ディレクトリ階層の一番深い部分のディレクトリ名 のみを得る為にはどうすれば良いのでしょうか?シェルスクリプト内で必要なのですが 分かりません。教えてください。 自分で調べた限りだと basename とか dirname がそれに近そうだったのですが、 ちょっと違うようです。他には見つけることが出来ませんでした。
315 名前:login:Penguin mailto:sage [2007/11/16(金) 18:54:10 ID:PPFIsM3H] >>314 > のように出力が帰ってきますよね。 いいえ。
316 名前:login:Penguin mailto:age [2007/11/16(金) 19:44:27 ID:q8UeZNS0] >>315 /a/b/c/d/hoge1 /a/b/c/d/hoge2 /a/b/c/d/hoge3 じゃなくて /a/b/c/d/hoge1/ /a/b/c/d/hoge2/ /a/b/c/d/hoge3/ の間違いでした。 このリストから hoge1, hoge2, hoge3を抜き出したい。 hoge1/ の最後の "/" も切り落としてしまいたいのですが、どうすれば良いでしょうか?
317 名前:login:Penguin mailto:sage [2007/11/16(金) 19:51:40 ID:PPFIsM3H] >>316 sed なり awk なりで切り出せると思うけど、 最初から find /a/b/c/d -mindepth 1 -maxdepth 1 -type d -printf "%f\n" とかじゃだめなん?
318 名前:login:Penguin mailto:sage [2007/11/16(金) 20:01:17 ID:gAB+KHmJ] >>316 for i in ls -d /a/b/c/d/*/; do basename $i; done
319 名前:login:Penguin mailto:sage [2007/11/16(金) 20:10:36 ID:PPFIsM3H] >>318 for i in `ls -d /a/b/c/d/*/`; do basename $i; done と言いたいんだろうが、 for i in /a/b/c/d/*/; do basename $i; done でいいな。 空白とか入ってなければ。
320 名前:login:Penguin mailto:age [2007/11/16(金) 20:14:17 ID:q8UeZNS0] >>317 レスありがとうございました。 しかしfindコマンドに詳しくない為自分ではよく分かりません。それ・・・。 >>318 レスありがとうございました。 こちらの方法はまさに私が求めていた方法です。非常に分かりやすくて助かります。 本当にありがとうございます。
321 名前:320 mailto:age [2007/11/16(金) 21:33:37 ID:q8UeZNS0] 解決したと思ったのですが、 ROOT=/a # ←ココは何でもいい、とにかくディレクトリ cd ${ROOT} for DIR in `ls -d ./*/` do for TARG in `basename ${DIR}` do echo ${DIR} echo "${TARG}" done done といった感じにしてみたのですが、 Venus7.0 Personal Edition といったディレクトリが Venus7.0 と Personal と Edition の3つに分割されてしまい、そのディレクトリに対して 処理したいのに3つの存在しないディレクトリに対して処理しようとする為、 no such file or directory エラーが次々と帰ってきました。 どうも ディレクトリ名に半角スペースが入っているのがダメなようです。解決策はありませんか? ちなみに全角スペースの場合は1つのディレクトリとして正常に動作しています。 for DIR in `ls -d ./*/` ←この部分で分断されてしまっていると思いますが for DIR in `ls -d ./"*/"` などと" " で囲んで見ましたが */ なんてディレクトリは見つからない と怒られました。 ' ' で囲んでも同じ結果です。どうしたら半角スペースをセパレータとして 認識するのを防げますか?
322 名前:login:Penguin mailto:sage [2007/11/16(金) 21:43:34 ID:lBcVe9Af] なんでそんなディレクトリがあるのか を考えたほうが根本的な解決になりそう
323 名前:login:Penguin mailto:sage [2007/11/16(金) 21:44:56 ID:PPFIsM3H] >>321 だから >>319 で言ったじゃん。 >>322 いや、あるときはあるでしょ。 そんなにおかしいことではない。
324 名前:login:Penguin mailto:sage [2007/11/16(金) 22:02:10 ID:lBcVe9Af] わざわざ_使ってる人の意味を考えよう >>321 は''の囲み方が間違ってるだけだが _があるのが普通って考えたほうが手間なくていい windowsがらみならwindowsでやったほうがいい
325 名前:320 mailto:age [2007/11/16(金) 23:35:30 ID:q8UeZNS0] >>322 ま、まぁ色々事情がありまして。あるんですよ。。。 >>323 >>319 の事かと思ってレスを投稿する前に確認したのですが、 for DIR in ./*/ do for TARG in `basename "${DIR}"` do echo ${DIR} echo ${TARG} done done で確認したところ 変数DIRには正しく取れました。 しかし `basename "${DIR}"` としているにも関わらず 元ディレクトリ名 AVG Anti-Virus Free Edition 7.3 実行結果 AVG Anti-Virus Free Edition 7.3 とこのように分断されてしまいます。 " " で囲っているにも関わらず、です。 何がいけないのでしょうか?
326 名前:login:Penguin mailto:sage [2007/11/16(金) 23:59:15 ID:2bsqELIP] #!/bin/sh LIST="\"space aaa\" \"bbb\" \"space ccc\" \"ddd\""; echo $LIST; # "space aaa" "bbb" "space ccc" "ddd" func(){ echo "arg= $#"; #6 echo "$1"; # space echo "$2"; # aaa echo "$3"; # bbb echo "$4"; # space echo "$5"; # ccc echo "$6"; # ddd } func $LIST; 上のようなスクリプトで func には、"space aaa" みたいにスペースの入った引数を渡したいんですが、 なにか方法はないでしょうか? この場合funcにわたす引数を4つにしたいんです。 展開されて、引数が6つになってる。。。素人ですません。
327 名前:login:Penguin mailto:sage [2007/11/17(土) 00:44:46 ID:X3VLuMy8] >>325 for TARG in `basename "${DIR}"` -> for TARG in AVG Anti-Virus Free Edition 7.3
328 名前:login:Penguin mailto:sage [2007/11/17(土) 07:31:23 ID:FrK+lOPY] >>326 $LIST をクォートする。
329 名前:login:Penguin mailto:sage [2007/11/17(土) 08:31:04 ID:tPTtgwaW] >>328 これだけで良かったんですね。 3時間くらい悩んでたよ。d
330 名前:login:Penguin mailto:sage [2007/11/17(土) 09:32:44 ID:X3VLuMy8] つeval
331 名前:320 mailto:age [2007/11/17(土) 10:54:12 ID:oelt9+66] >>327 レスありがとうございます。 そうなんですよ、そんな風に展開されてしまうんですよ。 ${DIR} だけを出力しても ./AVG Anti-Virus Free Edition 7.3 となるのに "${DIR}" とダブルクォートで囲っても ./AVG Anti-Virus Free Edition 7.3 と全く同じ出力になってしまう。つまりダブルクォートが利いてない・・。 だからそれをどうすれば1つの文字列として扱えるのですか?空白を区切りとしないようにする為には・・・。
332 名前:login:Penguin mailto:sage [2007/11/17(土) 12:01:58 ID:dajSe2oX] >331 basename の結果が正しいんだからダブルクォートは効いてるだろ? その後、`` で置き換えた時には既に "${DIR}" とは無関係の文字列なんだから 直書きされてるのと同様に空白で分割されてるだけ。 あえて書くなら for DIR in ./*/ do BASE=`basename "${DIR}"` for TARG in "${BASE}" do echo ${DIR} echo ${TARG} done done っていうか、なんで 2 段で for を回す必要があるのか。
333 名前:login:Penguin mailto:sage [2007/11/17(土) 12:23:43 ID:dh2GLbwy] >>331 バッククォート内はコマンドの出力に置き換えされるんだから、その出力を クォートすればいい。 for TARG in "`basename "${DIR}"`" っていうか、なんで 2 段で…
334 名前:320 mailto:age [2007/11/17(土) 22:43:03 ID:oelt9+66] >>332-333 な、なるほど・・・・ お二人の解説文を10回ほど読み直しながらじっくり考えてみた所、ようやく理解できました。 特に "`basename "${DIR}"`" はややこしくて 最初は何をかいているのだろうかと思いましたが `basename "{DIR}"` の出力結果そのものを " " で囲っているわけですね。なるほどなるほど。 う〜ん、これは思いつかない・・・。発想力ですか・・・。 で、2段でfor回していますが、確かに冷静に考えると2段で回す必要はありませんね・・・。 むしろ2段で回す処理にしている事で複雑化してしまった感があります。 1段forでいけそうです。
335 名前:login:Penguin mailto:sage [2007/11/23(金) 15:28:58 ID:P7OyMgNI] >326です。 拡張が必要になり、問題が増えました。 #!/bin/sh echo $LIST; # "aaa aaa" "bbb" "ccc ccc ccc" "ddd" func(){ 〜処理〜 } func "eee eee" "fff fff" "$LIST" "ggg ggg"; 以下のようにfuncにスペースを含んだ形で ${LIST}とその他の値を同列に引数として渡したいのです。 ↓funcに渡したい引数 "eee eee" "fff fff" "aaa aaa" "bbb" "ccc ccc ccc" "ddd" "ggg ggg" >>328 >>330 にあったように eval func で展開すると LIST以外の引数がスペースで展開されてしまいます。 LIST以外の引数を "eee\ eee" とか"\"eee eee\""とする手で回避も可能ですが、 修正箇所が増えるので、極力この形は取りたくありません。 なにか方法はありませんか?
336 名前:login:Penguin mailto:sage [2007/11/23(金) 22:55:10 ID:rrMjYG9S] Σ^)/アホーアホー☆ミ-
337 名前:login:Penguin mailto:sage [2007/11/23(金) 23:18:09 ID:OSmgQwJo] uniqはsortしておかないとだめですが、 sortしなくても2回目意向の重複を削除するコマンド内ですか?
338 名前:login:Penguin mailto:sage [2007/11/23(金) 23:25:42 ID:KoVu18yL] some | command | perl -ne 'print unless $seen{$_}++'
339 名前:login:Penguin mailto:sage [2007/11/24(土) 02:54:03 ID:Qc2k01yB] >>335 func をスペースを分割しないで処理するようにして、 func に渡す前に "$LIST" だけ分割しちゃえば良いんじゃないの?
340 名前:login:Penguin mailto:sage [2007/11/24(土) 13:44:38 ID:3ItHeK84] >>338 おおおお、できました。ありがとうございました。
341 名前:login:Penguin mailto:sage [2007/11/24(土) 15:57:48 ID:uBYpiRKV] From - Fri Nov 20 14:53:45 2007 From: "Jfda dsadsada" <fdsfdsa@thdsadaer.de> From - Fri Nov 21 14:53:45 2007 From: "rwerw dfsa" <sfdaf@fdfds.com> From - Fri Nov 23 14:53:45 2007 From: "a bcd" <d@dfds.com> From - Fri Nov 23 14:53:46 2007 From: "abc" <abc@abc.net> このようなテキストの中から、日付に対応したアドレスだけをテキストに出力するにはどうしたらいいのでしょうか? 11月20日が指定されたらfdsfdsa@thdsadaer.deを出力 11月23日が指定されたらd@dfds.comとabc@abc.netを出力といった具合です
342 名前:login:Penguin mailto:sage [2007/11/24(土) 16:23:59 ID:bvlPAES0] grep -A1 "Nov 20" | grep -o "<.*@.*>"