|
始めまして、UNIX使い始めです。 この度、awkコマンドを使用してファイルを分別して削除するシェルを作成しているのです。 そこでお聞きしたい事がるのです。 awkコマンドのifなどの中で変数は使えないのでしょうか? 現在、全ファイルに作成日付が付加されており、 指定日より前の物を削除したいいのです。 シェルの前半で指定日付を変数へ代入し、 lsとawkをパイプで繋いで削除しようとしています。 awk内のifなどによる条件判断で変数を宣言すると$0のメンバー名全体が表示されており、判別できないのです。 (ifを削除しprintで変数を表示させて確認) 出来ないのであれば何か別の方法を考えなくてはいけないのですが、 何方かお答えください。 |
|
>>3628 Tangerine 具体的にどのようなスクリプトなのか見せて頂けませんか? (そもそもawkを使う必要があるのでしょうか?) |
|
返信遅れてすいません。 えっと、確かに自分も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); |