|
返信遅れてすいません。 えっと、確かに自分もawkを使う必要があるのか微妙ですが、 #! /usr/bin/sh make_date=`date +"%Y%m%d"` make_date=`echo $make_date"-1" | bc` echo $make_date ls *.*.* | awk -F. '{if($2<make_date) print $0}' 問題としているのはこのあたりです。 変数make_dateに昨日の日付けが入り、 それ以前のものを表示させたいのです。 正直なところを言えば、awkを使う必要性はまったくといってないです。 ただ、自分が色々調べた結果awkを使ってやれば出来るのか? と、考えて使ってみただけですので。 awkじゃなくて別の方法で行えるのであれば、 御教授いただけると嬉しいです。 |
|
>>3630 Tangerine 単純に昨日以前のファイルを表示するのであればこんな感じで。 (ファイルが無い時を考えるとls使った方がいいのかな?) ------ #!/bin/sh make_date=`date '+%Y%m%d'` for f in `echo *.[0-9]*.*` ; do d=`echo $f | cut -d. -f2` [ $d -lt $make_date ] && echo $f done ------ awkを使うのであればこんな感じかな。 実装されているawkによって変数の設定の仕方が違うので注意してください。 ------ #!/bin/sh make_date=`date '+%Y%m%d'` ls *.[0-9]*.* | awk -F. '{if($2 < d) print}' d=$make_date |
|
>>3631 zsh おおっ!!有難う御座います(T▽T) なるほど、forですね。なんとも勉強不足でした(^^; やはりawkでは変数をそのまま引き継げないのですね。 awk内で更に変数に入れ込まなければいけないとは(^^; 有難う御座います。 教えていただいた方法で作成していきます。 本当に助かりました(w |
|
>>3632 Tangerine > やはりawkでは変数をそのまま引き継げないのですね。 そういうわけではありません。 > ls *.*.* | awk -F. '{if($2<make_date) print $0}' awk はどういう引数が欲しいか、というと awk -F. '{if($2<$make_date) print $0}' や awk -F. '{if($2<make_date) print $0}' ではなくて、 awk -F. '{if($2<20040315) print $0}' となってほしいわけです。 で、こうなるように書くにはどうすればよいか。 [方法1] まず awk -F. '{...}' と '' で囲ってはいけません。'' で囲った時点で中に入っている 変数が展開されなくなります。というわけで、 awk -F. "{...}" と "" で囲みます。これで中の変数が展開されます。しかし awk -F. "{if($2<$make_date) print $0}" と書いてしまうと、$2 や $0 まで展開されてしまいます。$2 や $0 は awk にそのまま渡したいので、 awk -F. "{if(\$2<$make_date) print \$0}" と \ でエスケープします。 [方法2] 方法1 のエスケープがうっとうしいなら、まず awk -F. '{...}' と '' で全体を囲みます。そして狙いのところだけ '' の外に出します。例えば awk -F. '{if($2<'$make_date') print $0}' こんな感じ。つまり 'x'$y'z' という形にするわけですが、これは 'x' + $y + 'z' というふうに結合されるので うまく動きます。 いずれの場合であっても、 % sh -x hoge.sh と -x オプションを付け、変数が狙い通り展開されているかどうか チェックする癖をつけましょう。 |
|
なるほど〜、ややこしい事になっていたのですね〜 おかげさまで希望の日付以前のファイルを削除することが出来ました、 有難う御座います。 追伸 >% sh -x hoge.sh 使うようにしてみます(^^; |
|
>>3633 68user その方法があることをすっかり忘れてました。 (というか使った試しが無い・・・反省) いつもながら勉強になります。 |
|
初めまして、Perl初心者です。 Socketを使ってUDPのプロキシ機能を作りたいのですが、 Send関数のあて先の指定で、inet_atonを使わずに指定 する方法がわかりません。というのも、あて先IPアドレスは 分かっているのですが、/etc/resolv.confには記述されて いないからなのですが。 やっぱりinet_aton関数を使ってホスト名からIPアドレスを 取得しないとダメなのでしょうか? どなたか教えてください。 環境は、Solaris8 、perl5 です。 今はこんな感じなのですが、、、 socket(SOCKET, PF_INET, SOCK_DGRAM, 0); $ip = '192.168.253.155'; $sock_addr = pack_sockaddr_in(2426, $ip); send(SOCKET, "test", 0, $sock_addr); |
|
>>3636 tomato inet_aton には IP アドレスも渡せます。なので、 socket(SOCKET, PF_INET, SOCK_DGRAM, 0); $ip = '192.168.253.155'; $iaddr = inet_aton($ip); $sock_addr = pack_sockaddr_in(2426, $iaddr); send(SOCKET, "test", 0, $sock_addr); でよいです。 http://x68000.startshop.co.jp/~68user/net/func.html#inet_aton ではホスト名しか渡せないような書き方をしていますので、ちょっと 不適切でした。 そもそも、C 言語での inet_aton の機能は、 aaa.bbb.ccc.ddd という文字列を解析し、in_addr 構造体に格納する というもので、名前解決は行いません。一方、perl の Socket パッケージの inet_aton は、ホスト名も受け付けるように機能拡張されているわけです。 |
|
また初歩的なことで申し訳ありません。 以下のプログラムで、13行目以降で配列(CMD)の内容を表示させて いるのですが、全てNULLになってしまいます。 +1 #!/usr/bin/ksh +2 INDEX=0 +3 TEST=`ls -l | +4 while read LINE +5 do +6 CMD[$INDEX]=$LINE +7 echo $INDEX":"${CMD[$INDEX]} +8 let "INDEX = INDEX + 1" +9 done` +10 echo "$TEST" +11 +12 INDEX=0 +13 while [ $INDEX -lt 5 ] +14 do +15 echo $INDEX":"${CMD[$INDEX]} +16 let "INDEX = INDEX + 1" +17 done このプログラムの3行目から10行目を以下の様に修正すれば、13行目 以降でも配列の中身が正常に表示されます。 +3 ls -l | +4 while read LINE +5 do +6 CMD[$INDEX]=$LINE +7 echo $INDEX":"${CMD[$INDEX]} +8 let "INDEX = INDEX + 1" +9 done +10 最初のプログラムの様に、最初のループの結果を変数にセットする 場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう か? |
|
>>3638 バンガード バッククォーテーションでくくると別プロセスになるから 変数を保持することはできないと思いますが・・・ |
|
>>3638 バンガード > このプログラムの3行目から10行目を以下の様に修正すれば この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。 |
|
>>3640 68user 3行目から10行目の修正ですとwhile文の出力は標準出力へ出て行くだけです。 これを最初のプログラムの様にwhile文の出力を変数に格納したいと考えています。 |
|
>>3641 バンガード > while文の出力は標準出力へ出て行くだけ それは echo しているからでは? echo しなければ OK かと思います。 > while文の出力を変数に格納したいと考えています 修正版の方でも CMD[$INDEX]=$LINE と格納しているように見えます。 また、ループを抜けた後でも参照が可能だと思います。 |