シェル、オークの質問コーナー

このエントリーをはてなブックマークに追加
911名無しさん@お腹いっぱい。:03/01/26 23:49
shの変数名そのものに、別の変数の値を入れるにはどうやればいいのでしょうか

たとえば、value_2ch_tempという変数に"abc"と入れるために

hoge="2ch"
value_"$hoge"_temp="abc"
echo value_"$hoge"_temp

とするとうまくいきません・・・
どうすればいいのでしょうか。
負荷分散で複数のWebサーバをApacheで立ててるんですが,
ログファイルの acces_log にエントリがばらばらになってしまいます。
なので全部を単一ファイルにマージして,各行の時間順に再度ソート
したいんですが,どうやれば一番スマートでしょうか?単純にすると
えらいメモリ食って遅くなりそうで…
>>912
定期的に別マシンに送って、そっちで merge する。
914雨なのね:03/01/27 00:19
>>911
> value_"$hoge"_temp="abc"

eval value_"$hoge"_temp="abc"
915雨なのね:03/01/27 00:28
>全部を単一ファイルにマージして,各行の時間順に再度ソート
>単純にするとえらいメモリ食って遅くなりそうで…

merge sortを使え。

http://mergelog.sourceforge.net/なんてものある
916名無しさん@お腹いっぱい。:03/01/27 00:43
>>914
おぉ、ほんとだ
evalって、代入側でも参照側でも使えるんですね
ありがとうございましたm(__)m
変数が展開された後の文字列がevalに渡るから、
代入側とか参照側とか関係なし。
918名無しさん@お腹いっぱい。:03/01/27 01:18
なるほど・・・。もっとeval勉強せねば。

ついでにもう一つ、上でeval value_"$hoge"_temp="abc"としたときに
他の変数に代入するときは、

puni="eval echo $`echo value_"$hoge"_temp`"

とやってみたらうまくいったのですが、もっと簡単に記述できますか?
919918:03/01/27 01:29
>> puni="eval echo $`echo value_"$hoge"_temp`"

ありゃ? うまくいってない・・・
気のせいだったみたいです∧||∧
>>915

感謝
921893:03/01/27 23:59
>>909
ごく普通です。終了ステータスが0以外だったらエラーメッセージを吐くだけです。
なのでなるべくステータスの値も出力したくなかったんですが、
もっと詳しく書けば良かったですね。
パイプがサブシェルで実行される事に気づかず、ドツボに嵌ってました。
ちなみに今日思いついたのですが、こんなのもアリかな…と。

(A.sh ; echo ":${?}:") | grep -v '^#' | awk -F: '
!/^:.*:$/{print $0}
/^:.*:$/ {STS=$1}
END {exit STS}'
exit $?
>>910
> 勉強がてらに自宅で使うリネームシェルを作ってるんですよ。
いったいどういうシェルかと一瞬迷ったが、
リネーム用 シ ェ ル ス ク リ プ ト か。
923910:03/01/28 21:16
>>922
おぉ、確かにそう取れる。
いや、ただのムフムフ画像管理用のスクリプトなんですけどね。
これがケッコー懲り出すとメンドーで...
924878:03/02/03 23:40
インフルエンザで一週間寝込んでました(´Д⊂)
>>880さん
main.shのtrapにそう記述したのですが
main.shのPIDをkillしてもsignal 15を拾ってくれません(´・ω・`)
それ以前に、main.shのPIDをkillしても終了すらしません・・・

で、rshのPID(なぜか2プロセス立ち上がってます)をkillすると
止まってくれるんですが、これではtrapする意味がないれす。

やっぱり無理なんでしょうか(´・ω・`)
925名無しさん@お腹いっぱい。:03/02/06 22:35
shのスクリプトでしつもんがあります。

telnet localhost 21 << EOF > RESULT
とした時に
#cat RESULT
Trying 127.0.0.1...
Connected to kmdr (127.0.0.1).
Escape character is '^]'.
のような感じでレスポンスコードがとれません。

# telnet localhost 21 > RESULT
# quit
だと
Trying 127.0.0.1...
Connected to kmdr (127.0.0.1).
Escape character is '^]'.
220 Welcome To KOMADORI
221 Goodbye.
のように取れるのですが、<<を使わないで標準入力にquitを
送る方法がわからないため行き詰まっています。

FTPなら
ftp -v -n localhost << _EOF > RESULT
#cat RESULT
Connected to kmdr.
220 Welcome To KOMADORI
500 AUTH not understood.
221 Goodbye.
のようにレスポンスコードが拾えるのですが、、、

telnet -n hoge とかでトレースをとってもレスポンスコードが入りませんでした。
telnetの結果をレスポンスコード付きで拾うのはshellスクリプトでは難しいのでしょうか?
>>925
expect
927925:03/02/06 23:10
>925 さん ありがとうございます。

expect調べてみました。
便利なものがあるのですね。

実は簡単なポート監視に近いshellスクリプトを作っているのですが、
これを入れるサーバー(Solaris2.6)が他社の基幹システムの本番機でして、
手続きが少しめんどそうです。でも明日きちんと説明してみようと思います。

#Perlで作られたそういうプログラムがあったのですが、
#Perl入れちゃだめってことでボツってしまいました。・゚・(ノД`)・゚・
>>927
と、レスポンスコードが要るのか、てんで見てなかった。スマソ
929925:03/02/07 00:43
う、いまから検証用スクリプト作ろうかなとおもつていたのでつが、、
とれないんですか、、、、・゚・(ノД`)・゚・

いっそのこと泣きながらCでがりがり、、、

別プロセス立ち上げて名前付きパイプ経由で
とったらうまくいかないかなとか今思いつきました。
できあがったら報告しまふ
930名無しさん@お腹いっぱい。:03/02/07 17:44
>>925

( echo quit ; sleep 1 ) | telnet localhost 21
( echo head http/1.0; sleep 1 ; echo \n ) | telnet localhost 80
( echo quit ; sleep 1 ) | telnet localhost 110
( echo helo ; sleep 5 ;echo quit ; sleep 1 ) | telnet localhost 25

sleepはサーバがお返事がのろいとき適宜いれるべし
>>930
ださっ
932名無しさん@お腹いっぱい:03/02/07 21:06
こんにてぃわ。

いきなりだけど、特定ディレクトリの不特定多数ファイルから該当文字
列に一致するファイル名を抽出しようとし根性が尽きました。

grep と find とパイプを駆使しても知能が足りませんでした。

どうすればうまくいくでしょう?
933ヽ(´ー`)ノ:03/02/07 21:10
>>932
何か抽象的過ぎるな(;´Д`)
 FIND_DIR: 特定ディレクトリ
 STRING: 該当文字列
として、
 find FIND_DIR -name 'STRING'
じゃだめかね。てか、man find しる。
>>932
GNU grep なら -r で。
grep -rl
936名無しさん@お腹いっぱい:03/02/07 23:04
確かに抽象、というかミスでした。

例えば、/hoge 以下の全てのディレクトリの全てのファイルから、文字
列 hage を含む全てのファイル名を表示する・・・場合どうやりますか。

これでお願いします。
>>936
man find しる。
du -a /hoge | grep hage | awk '{print $2}'

# du より find のほうがいいかな?
# オレは手軽なので du 使うけど
expect試してみた。結構便利。

#!/usr/bin/expect
set site localhost
set from ore@localhost
set to posmaster@localhost
spawn telnet $site 25
log_file smtp.log
expect "220*" { send "helo $site\n" }
expect "250*" { send "mail from: $from\n" }
expect "250*" { send "rcpt to: $to\n" }
expect "250*" { send "data\n" }
expect "354*" { send "test\n.\n" }
expect "250*" { send "bye\n" }
send_user "script_end\n"
close
exit 0
940名無しさん@お腹いっぱい:03/02/07 23:49
>>933〜938

どうも!

決戦の日は近いぞ。

ガンバルゾぉぉぉ!
>>940
何と戦うのかは知らんが、manは味方にしとけよ。
>>936
find /hoge -name "*hage*"
943名無しさん@お腹いっぱい。:03/02/08 01:09
>>936
grep -lr hage /hoge
>>942
そりゃファイル名にhageを含むものだろう。
945名無しさん@お腹いっぱい:03/02/08 15:19
誰かいますか?

rm -Rf 'find / -name erogazou'

・・をしたいんですが、 "'" をサブシェルにしてもエラーでした。
察しの通り、rm の man を読んでない結果です。

検索結果に再帰的な問題はありますが、それは別として検索結果からの
該当ファイルとディレクトリを全て削除するよい方法ないでしょうか。
946んにゃ。。。:03/02/08 15:33
↑解決。

すっかりボケてるよ(w
>>945
どんなエラーだよ
948名無しさん@お腹いっぱい。:03/02/08 15:36
pythonってどうよ?
>>948
すごいよ。
>>948
ム板に行け。
行末に<br>とかつけるにはどしたらいいんすかね?
(hoge.txt)

hoge
huga
mona

hoge<br>
huga<br>
mona<br>

数値だったりする場合もあるので・・・・うにゃ〜
>>951
cat hoge.txt | sed 's/$/<br>/g' > hoge.new.txt
やぱsedでできるのか〜
修行が足りませんですた逝ってきます
>>953
むしろ拡張正規表現だけでいいから覚えれ。
sedでもperlでもgrepでも使えるから便利だぞ。
拡張正規表現ですかGoogってみます
ありがとやんした!
http://www.kt.rim.or.jp/~kbk/regex/regex.html
ネタが少し古めだけど、正規表現を一通り網羅してあるので便利。

>grepで使用できる正規表現
>egrepで使用できる正規表現
>sedで使用できる正規表現
>awkで使用できる正規表現
>perlで使用できる正規表現
>pythonで使用できる正規表現
>rubyで使用できる正規表現
>gawk 3.0で使用できる正規表現
>Tcl 8.1(以降)で使用できる正規表現
957名無しさん@お腹いっぱい。:03/02/11 20:26
awkで/begin/,/end/な
感じである範囲を検索しようと
したところ行が長すぎると異常終了します
まあ途中4kぐらいの行があるんですけど
でRSで適当な文字を指定したら
その文字だけかけちゃうのね
何かよいやりかたはないでしょうか
ちなみにsolaris7です
nawkでもだめでした
w3mで放置されたので, こちらで質問します.
(よく考えればむこうではスレ違い)

シェルスクリプトで
   default_option='-o extbrowser=mozilla'
   w3m $default_option
みたいにするとうまく行くのですが,
   default_option='-o extbrowser=mozilla %s &'
   w3m $default_option
だとダメです.

どうすればいいんでしょう?
>>958
default_option='-o extbrowser=mozilla'
w3m $default_option %s &
960958
>> 959
どうもです.
それだとw3mが "%s" を引数(URL)だと思っちゃうからダメなんです.

   w3m -o extbrowser="mozilla %s &"
と直接shellからうちこめばうまく行くのですが.