[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 19:35 / Filesize : 221 KB / Number-of Response : 848
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合@LINUX Part5



1 名前:1様 [2009/04/03(金) 22:17:43 ID:0qFlvOW9]
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

Part4 : pc11.2ch.net/test/read.cgi/linux/1210999497/
Part3 : pc11.2ch.net/test/read.cgi/linux/1184077033/
Part2 : pc11.2ch.net/test/read.cgi/linux/1154578200/
Part1 : pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。

189 名前:login:Penguin [2009/07/31(金) 16:40:28 ID:YezVKpJb]
コンフィグ情報から
DEVICEとIPADDRだけを抜き出したいのですが下記だとDEVICEの行が5行表示され
ます。
構文が間違っているからだと思いますがアドバイスもらえないでしょうか。

eth0=/etc/sysconfig/network-scripts/ifcfg-eth0
while read eth0
do
echo $eth0 | sed -n '/DEVICE/p' /etc/sysconfig/network-scripts/ifcfg-eth0
done < /etc/sysconfig/network-scripts/ifcfg-eth0

190 名前:login:Penguin mailto:sage [2009/07/31(金) 16:49:00 ID:Q0h6j6GB]
sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0

191 名前:login:Penguin mailto:sage [2009/07/31(金) 16:51:37 ID:dFOhVUdW]
なんで何度も /etc/sysconfig/network-scripts/ifcfg-eth0 を書いてんだろ。

192 名前:login:Penguin mailto:sage [2009/07/31(金) 16:52:11 ID:sKGfGulX]
>>189
答え先に書かれちゃったか。

1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか
ちょっと落ち着いて考えた方が良い

193 名前:login:Penguin mailto:sage [2009/07/31(金) 16:56:53 ID:IvZ7j8yJ]
>>189
今後の為に基礎から勉強しなおしてきた方がいいよ

194 名前:login:Penguin mailto:sage [2009/07/31(金) 16:57:14 ID:6mUE4jrQ]
> 1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか
> ちょっと落ち着いて考えた方が良い

落ち着いて考えてもわかんねーよ
1行目のeth0がどこにも使われてないのはわかるけど

195 名前:189 [2009/07/31(金) 17:37:11 ID:YezVKpJb]
みなさん回答ありがとうございます。
改めて見ると意味わからないことしてました。
下記のコードで意図する事ができました。
ありがとうございました。

while read
do
echo | sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0
break
done < /etc/sysconfig/network-scripts/ifcfg-eth0

196 名前:login:Penguin mailto:sage [2009/07/31(金) 17:45:29 ID:sKGfGulX]
>>195
全力で釣られてやる。

>>190 さんが書いてるように、sed1行でいける
sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0

whileしたあげくに無条件でbreakとか意味わからん。
各行で何をしているのかもう少し考えよう

197 名前:login:Penguin mailto:sage [2009/07/31(金) 20:49:41 ID:M2gWEg8T]
>>195
まずその「よく分からないけどとにかく丸写しでそれらしく作っとけばいいだろう」
という思想を改めるべきだな。



198 名前:login:Penguin [2009/07/31(金) 21:59:52 ID:JVm6T/2T]
何やら上でもsedの質問出てますが質問させてください。
sedでtet.txt内にあるhogeをhogehogeに書き換えるものをつくりました。

sed -i 's/hoge/hogehoge/g' /tmp/test.txt

次にhogeとhogehogeの部分を変数にしたのですが今度は書き換わってくれません。
$aにはhoge
$bにはhogehoge
sed -i 's/$a/$b/g' /tmp/test.txt

test.txtを見ると更新はされているので何らかのアクションがあるみたいなんで
すが何か指定方法間違ってますでしょうか?




199 名前:login:Penguin mailto:sage [2009/07/31(金) 22:03:23 ID:Y1b6fdMF]
sed -i "s/$a/$b/g" /tmp/test.txt

200 名前:login:Penguin mailto:sage [2009/07/31(金) 22:06:26 ID:Gbr9waoH]
>>199
""だとシェル変数展開されないっすか?

201 名前:sage mailto:sage [2009/08/01(土) 01:27:09 ID:2gkCvOw5]
シェルでリスタートとかかけると
活性化しますとか表示されるんですが、これ表示させないようにする方法ありますか?
/dev/nullとかしても表示されたので表示させない方法あれば教えてください。

202 名前:login:Penguin mailto:sage [2009/08/01(土) 01:38:27 ID:MXySzGMG]
>>201
使ってるディストリのスレへ。

203 名前:login:Penguin mailto:sage [2009/08/01(土) 02:29:31 ID:SZCdXM7k]
>>198
$ a='hoge'
$ b='hogehoge'
$ cat >/tmp/test.txt
hogepiyo$a$b$c
$ sed -i 's/$a/$b/g' /tmp/test.txt
$ cat /tmp/test.txt
hogepiyo$b$b$c # hogeはそのまま、$aは$bに。
$ cat >/tmp/test.txt
hogepiyo$a$b$c
$ sed -i "s/$a/$b/g" /tmp/test.txt
$ cat /tmp/test.txt
hogehogepiyo$a$b$c # hogeがhogehogeに、$aはそのまま。

204 名前:login:Penguin mailto:sage [2009/08/01(土) 04:42:15 ID:SZCdXM7k]
>>181
入れ子のとき注意がいる。
$ echo $(echo a:$(echo b:$(echo c:$(echo d))))
a:b:c:d
$ echo `echo a:`echo b:`echo c:`echo d````
a:echo b:c:echo d
$ echo `echo a:\`echo b:\\\`echo c:\\\\\\\`echo d\\\\\\\`\\\`\``
a:b:c:d

205 名前:login:Penguin mailto:sage [2009/08/02(日) 01:23:15 ID:tM/nSNrk]
画面を切り替えたりするとselect文が数行表示されない(実際には選択は出来る)ことが
よくあるんですが、データの受信が表示までに間に合ってないような感じです。
これを避ける方法などはあるんでしょうか?
使用しているターミナルはPoderosaになります。

206 名前:login:Penguin [2009/08/03(月) 09:09:05 ID:J0mTyN5X]
今までbashでスクリプト組んで表示はExiteで翻訳とか適当にコピペってたのですが
シェルスクリプトって日本語表示出来ますか?
お偉いさんが英語じゃわからんとかぬかしやがったので・・・

207 名前:login:Penguin mailto:sage [2009/08/03(月) 09:14:24 ID:+8DYA08E]
>>206
文字コード決めうちでよければ比較的簡単だな。

問題はそれで表示できるかどうかは実行する人が
使ってるターミナルに依存するということだ。一般的に
やろうとするとロケール見て切り替えみたいなことを
しなきゃならないが結構面倒だね。

ま、お偉いさんの環境に合わせておけばいいんじゃね?



208 名前:206 [2009/08/03(月) 09:29:50 ID:J0mTyN5X]
>>207
やっぱりそうですよね。
アクセスしてきたターミナルの文字コードを判別してとか切り替えられればいいんですが
さすがに無理ですよね。

お偉いさんだけじゃなくてユーザーも使うんで文字コードって混在してるんですよね。
標準的な文字コードってどんなの使われてるのかはよくわかりませんが
まぁ無理って方向で進めていこうかと思います。

ありがとうございます。

209 名前:login:Penguin mailto:sage [2009/08/03(月) 09:57:12 ID:pu8sCNil]
ローマ字でいいんじゃね。

210 名前:login:Penguin mailto:sage [2009/08/03(月) 10:31:49 ID:3RzsW8i/]
exciteのわけわからん翻訳貼り付けるのは
ユーザーが可哀想だろw
自分の英語に自信が持てないなら、いっそ日本語の方がいいんじゃね。

そのディストリビューションで日本語選んでインストールしたとき
デフォルトになる文字コード選んどけば
誰も文句いわないんじゃね?
自分でLANGいじるようなやつは、文字化けのなおしかたぐらい知ってるだろ。

211 名前:login:Penguin mailto:sage [2009/08/03(月) 10:52:42 ID:3RzsW8i/]
なんか変だ。
ユーザー作ったときデフォルトでなってる文字コードにしとけばいいんじゃね、だ。
LANGとかLANGUAGEとかいじるやつは文字化けの直し方ぐらい知ってるだろ。
デフォルトがCとかenとかなら…シラネ

212 名前:login:Penguin [2009/08/04(火) 12:15:50 ID:OyyR8ocQ]
動けばいいって程度で作ってたものをどうやら他にもリリースするとかで見栄えをよくしろと言われました。
bashで文字を寄せたり全体を中央寄せにしたりするコマンドとか関数ってありますか?

213 名前:login:Penguin mailto:sage [2009/08/04(火) 12:53:29 ID:h5jokg18]
COLUMNS見て計算する。

いっそwhiptailやdialog使うとかな。

214 名前:login:Penguin mailto:sage [2009/08/04(火) 21:45:57 ID:1cLNSoFd]
printf ?
あとよく知らないけど fmt とか groff とか?

215 名前:212 [2009/08/04(火) 22:25:14 ID:OyyR8ocQ]
>>213
文字数はじき出して何とか出来ました。

あとスクリプトの中で
/etc/rc.d/network restart
といれているんですが、手動で/etc/rc.d/network restartすると大丈夫なんですが
#!/bin/bash
/etc/rc.d/network restart
とかで実行するとshould not be world writeable users cannnot control this device
と表示されて実行されていないようです。
権限の問題かと思い色々と変えてみましたがダメでした。
なにか他に注意すべき点があればご教示いただければと思います。

216 名前:login:Penguin mailto:sage [2009/08/04(火) 22:32:07 ID:ACq2bWOB]
> 色々と変えてみましたがダメでした。

そりゃダメだろうな。


217 名前:login:Penguin mailto:sage [2009/08/04(火) 22:49:56 ID:p9z/5JkD]
もしかして: should not be world writable users cannot control this device



218 名前:212 [2009/08/05(水) 09:09:45 ID:Sso6+/38]
>>217
すいません
スペル間違えてました。
217で記述されている内容が表示されておりました。

219 名前:login:Penguin mailto:sage [2009/08/05(水) 09:38:19 ID:gztfuFMV]
いろいろgrepしたけどうちのマシンには
そのメッセージを吐くプログラムは入ってないようだ。

ディストリビューションと、どのプログラム/スクリプトが
そのメッセージ出してるか書けば?

ちなみにそのスクリプトはrootで実行してるんだよね?

220 名前:212 [2009/08/05(水) 10:47:05 ID:Sso6+/38]
>>219
すいません。
CentOS5.3 です。スクリプト内容は膨大なのですがエラーが出る場所は
/etc/rc.d/init.d/network restart
の部分になります。
実行しているのは別のユーザーでてっきりrootで実行してるもんだと思ったら別ユーザーで実行していたようです。
ファイルは
-rwxr-xr-x 1 root root 1234 7月 31 00:00 test.sh
実際に実行していたログインユーザーはtestというユーザーでした。
上記の事とエラー内容から権限がないために出ていると思います。
testユーザーでもrestartをかけれる権限を付与するか、testユーザーを
rootのグループに入れるような事が出来れば出来そうな気もしますが自分には少しレベルが高そうですね。

221 名前:login:Penguin mailto:sage [2009/08/05(水) 13:12:18 ID:gztfuFMV]
のりピーが心配で仕事が手に着かない。

init.dのスクリプトは一般ユーザーが使うようには出来てない。
仮にパーミッション緩めまくって実行できるようにしても、
インターフェースの設定はuid=0じゃないと出来ないので
どこかで権限を昇格するかrootのプロセスに引き継ぐかしないと行けない。

具体的な実装方法の話に入ると、
そもそも一般ユーザーがインターフェースupdownする必要が
本当にあるのかという事から検討したくなって
長くなりそうなのでとりあえずがんばれと言っておく。

222 名前:219 [2009/08/05(水) 13:35:06 ID:Sso6+/38]
>>221
ありがとうございます。
ネットワークの設定を一般ユーザー(といっても特定のユーザーのみですが)
が出来るようにしたいと思っております。
そんなに頻繁にあるわけではないのですがroot権限を持ったものが常駐しているわけでは
ないということもありましたのでネットワーク周りだけを触るスクリプトを組みました。
権限の昇格やrootのプロセスをシェルスクリプトで引き継げるようであれば行いたいと思います。
ご存じのかたおられましたらアドバイスいただけると助かります。

223 名前:login:Penguin mailto:sage [2009/08/05(水) 14:02:44 ID:gztfuFMV]
そのぐらいならsudoでどぞ。

224 名前:login:Penguin mailto:sage [2009/08/05(水) 21:35:22 ID:dz5dEKuL]
>>222
ifcfg-eth0とかに「USERCTL=yes」でroot以外でもできそう
www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ja/ref-guide/s1-networkscripts-interfaces.html

225 名前:login:Penguin [2009/08/08(土) 16:14:34 ID:Nnr+lme9]
rebootやshutdownはrootでなくても使用できるんでしょうか?
試しにrootではないsampleユーザーで
#!/bin/bash
reboot
を実行させたら再起動かかったんですが、てっきり弾かれるかパスワード聞かれると思ってました。
上のほうで権限がどうのこうのって質問があったんですが、OSとかによって違うってことですかね。

226 名前:login:Penguin mailto:sage [2009/08/09(日) 11:26:19 ID:1P+Q9AS+]
そんなのあんの?
rebootやshutdownは管理者権限だろ

227 名前:login:Penguin mailto:sage [2009/08/09(日) 11:34:22 ID:IkGSFCMm]
sudoersに書いてたとしてもsudo rebootじゃないと駄目だろうし
何だろ



228 名前:login:Penguin mailto:sage [2009/08/09(日) 11:46:08 ID:0aZIEnpY]
>>225
rebootはできてもshutdownはできないんじゃない?

229 名前:login:Penguin [2009/08/09(日) 12:55:17 ID:aaFRdfIZ]
ディストリ次第じゃないんですか。Debian ではできないみたいだけど、Vine では
一般ユーザでも shutdown できる (Red Hat 系はみんなできるのかも)。Vine の場合、
/usr/bin/shutdown はシェルスクリプトで、中で halt や reboot を呼び出している。
そして、この halt や reboot はリンクで、実体は /usr/bin/consolehelper。
あとは、man consolehelper ですね。

230 名前: ◆Zsh/ladOX. mailto:sage [2009/08/09(日) 14:01:11 ID:/ZeBm1qf]
んーできない。

% cat /etc/redhat-release
CentOS release 5.3 (Final)
% id
uid=500(hage) gid=500(hage) 所属グループ=500(hoge) context=user_u:system_r:unconfined_t
% /sbin/shutdown -r now
shutdown: you must be root to do that!
% /sbin/reboot
reboot: must be superuser.


231 名前:229 mailto:sage [2009/08/09(日) 14:18:48 ID:PRPNML+y]
>>230
CentOS の場合、/sbin/shutdown じゃなくて、/usr/bin/shutdown はないんですか。
だとしたら、Vine だけなのかな。たしか、「一般ユーザに電源をぶち切られるより、
shutdown を許した方がマシだ」という考えだったと思います。

232 名前: ◆Zsh/ladOX. mailto:sage [2009/08/09(日) 14:27:23 ID:/ZeBm1qf]
% /usr/bin/shutdown -r now
zsh: そのようなファイルやディレクトリはありません: /usr/bin/shutdown
% locate shutdown|grep bin
/sbin/shutdown
/usr/bin/pm-shutdown

なんで無いね。


233 名前:login:Penguin mailto:sage [2009/08/09(日) 16:35:29 ID:CB8fkMOP]
# ながいこと Vine しか使ってないから他のディストリのことはわからない。

>>225
シェルスクリプトの "reboot" を
/sbin/reboot とか /usr/bin/reboot とかに書き換えてみると動作に違いがでると思う。

> 権限
pam って仕組みで管理されてると思う。/etc/pam.d/ 以下のファイル。

>>225-232
Vine だと usermode っていうパッケージに
/usr/bin/consolehelper
/usr/bin/halt
/usr/bin/poweroff
/usr/bin/reboot
/usr/bin/shutdown
/usr/sbin/userhelper
とかいったものが入ってる。usermode-gtk ってパッケージもある。

Description :
usermode パッケージには、一般ユーザが設定されたプログラムをスーパーユー
ザとして実行できるようにするユーザヘルパープログラムが含まれています。

234 名前:login:Penguin [2009/08/09(日) 22:04:40 ID:ivLlFzN/]
シェルスクリプトでコマンド番号を選択したりIPを入力したりするツールつくったんですが、
ctrl+cやIP入力にコマンドを入れてみて実行されるかどうかといった確認はしてみましたが
それ以外にセキュリティやテストしてみるといいことなどあれば教えてください。


235 名前:login:Penguin mailto:sage [2009/08/09(日) 22:52:55 ID:C0J3iJDt]
スクリプト晒して!

236 名前:login:Penguin mailto:sage [2009/08/09(日) 23:03:57 ID:IVuBeWRI]
晒されても答えようがないような。
C-c が入れられたときの正しい処理とか本人でないと知らないし。

237 名前:234 [2009/08/09(日) 23:20:52 ID:ivLlFzN/]
>>235
IP以外の文字が入れられたらといった時の処理はまだいれてませんが
下記のような事を繰り返してconfを書き換えて再起動するという感じです。

read newip
$newip="IPADDR=""$newip"
sed -i "s/$oldip/$newip/g" /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/rc.d/init.d/network restart
menufunc




238 名前:login:Penguin mailto:sage [2009/08/10(月) 00:04:28 ID:CdStD5IJ]
>>227
sidを知らんのか。

239 名前:login:Penguin mailto:sage [2009/08/10(月) 01:28:19 ID:qfqY90wM]
a
b
c
...

と一語ごとに改行された一つのテキストファイルを
a b c d e f g h i j k
l m n o ...
と言うように10列ごとに改行するテキストにしたいと思い、
スクリプトを組んだのですが動作が遅く、重くなってしまって困惑しています
どなたかお知恵をお貸しくださると助かります。

#/bin/bash
FILE=$1
LINENUM=`expr 1`
OFILE=/dev/shm/hoge

while read line
do
if [ $LINENUM -lt 10 ];then
echo -n "$line" >> $OFILE
echo -n -e "\t" >> $OFILE
LINENUM=`expr $LINENUM + 1`
else
echo "$line" >> $OFILE
LINENUM=`expr 1`
fi
done <$FILE

240 名前:login:Penguin mailto:sage [2009/08/10(月) 01:50:52 ID:vmT7yJCz]
#!/bin/sh
FILE=$1
OFILE=/dev/shm/hoge
LINENUM=1
while read line
do
if [ $LINENUM -lt 10 ]
then
echo -n "$line"
echo -n -e "\t"
LINENUM=$(( LINENUM + 1 ))
else
echo "$line"
LINENUM=1
fi
done <$FILE >$OFILE

241 名前:login:Penguin mailto:sage [2009/08/10(月) 02:00:08 ID:qfqY90wM]
>>240
ありがとうございます! 処理が覿面に早くなりました!
いちいち書き出さないで最後に一括して書けばよかったんですね…

242 名前:login:Penguin mailto:sage [2009/08/10(月) 02:10:30 ID:vmT7yJCz]
>>241
たぶんexprの呼び出しのほうがコストが高いよ

243 名前:login:Penguin mailto:sage [2009/08/10(月) 12:26:13 ID:5IcilgjJ]
自分で動かすだけならこれでいいやと思ったら、そんだけで改善できたのか…
----
#!/bin/sh
FILE=$1
OFILE=/dev/shm/hoge

sed -e '$!N;$!N;$!N;$!N;$!N;$!N;$!N;$!N;$!N;s/\n/\t/g' <$FILE >$OFILE

244 名前:login:Penguin [2009/08/10(月) 15:31:57 ID:oeYkUDqx]
数字の判定は[0-9]と正規表現使って判定してるんですが
IPアドレスかどうかの判定が出来るような正規表現ってあるんでしょうか。
無い脳みそひねってもいい案が出なかったのであれば教えてください。

245 名前:login:Penguin [2009/08/10(月) 15:41:18 ID:86RyWVEw]
>>244
ググレばサンプルたくさんあるよ。

246 名前:login:Penguin mailto:sage [2009/08/10(月) 15:59:59 ID:BhLss4cE]
お前ならどうするかを教えてやりゃーいいじゃん。

247 名前:login:Penguin mailto:sage [2009/08/10(月) 16:10:10 ID:sXOG+s90]
PowerShell神すぎだろ。
このスレ見てると原始人が石斧振り回してるように見えてくるぜ。



248 名前:login:Penguin mailto:sage [2009/08/10(月) 17:33:20 ID:6xgY8KY4]
僕には端末エミュとシェルの違いもわかってないマヌケが見えます。

249 名前:login:Penguin mailto:sage [2009/08/11(火) 00:20:03 ID:GKnhcfe3]
>>247
型の概念が邪魔。
コマンドが無駄に長い。
重い。

250 名前:login:Penguin [2009/08/11(火) 00:27:50 ID:4esITO9l]
Macのbashもここでいいんでしょうか…
OSは10.5.8です。

test.shを
----
#!/bin/sh

echo $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12
----

とします。
./test.sh 1 2 3 4 5 6 7 8 9 10 11 12
と実行すると素直に
1,2,3,4,5,6,7,8,9,10,11,12
となるのに
./test.sh 1.0 2 3 4 5 6 7 8 9 10 11 12
と小数を入れて実行すると
1.0,2,3,4,5,6,7,8,9,1.00,1.01,1.02
となってしまうのはなぜでしょうか。


251 名前:login:Penguin mailto:sage [2009/08/11(火) 00:35:21 ID:XDXqx0+D]
./test.sh a 2 3 4 5 6 7 8 9 10 11 12
としてごらんなさい

252 名前:login:Penguin [2009/08/11(火) 01:01:07 ID:4esITO9l]
>>251

な、な、な、なんでしかこりは!

はっ!そうか!…

$1,$2...って書いてあるサイトが多いからけっこうな個数使えるのかと思ってました。
ありがとうございました。

253 名前:login:Penguin mailto:sage [2009/08/11(火) 01:07:27 ID:e9ttEiKp]
echo $1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11},${12}

254 名前:login:Penguin [2009/08/11(火) 02:19:40 ID:4esITO9l]
>>253
$(10)は試したのに${10}は試してませんでした…orz
ありがとうございます。

>>251を受けてshiftを使う対処法を知りました。

10個以上の引数を扱いたいという目的においては、shiftと${10}の善し悪しはあるんでしょうか。


255 名前:login:Penguin mailto:sage [2009/08/11(火) 02:26:00 ID:MclIhwRq]
こーいうトラップがあるからperlに逃げる人が多い

256 名前:login:Penguin mailto:sage [2009/08/11(火) 02:52:40 ID:e9ttEiKp]
>>254
$ man bash
/位置パラメータ
2 桁以上の数値を含む位置パラメータを展開するときには、ブレース ({}) で
囲まなければなりません。

よって${n}が正解だと思います

257 名前:login:Penguin [2009/08/11(火) 05:29:40 ID:4esITO9l]
>>255
僕はこのツンデレな感じが好きです。

>>256
やっぱりそうですよねw
正式名称は位置パラメータかー"引数"という呼び方しか認識してませんでした。




258 名前:sage mailto:sage [2009/08/11(火) 16:31:12 ID:ggsX9yQb]
topコマンドの内容をテキストに書き出したいんですが
top >> /tmp/top.test
とした場合に延々と書き込まれていきます。1度だけtopの内容を取得したいんですが
どのように変更すればよいでしょうか?

259 名前:login:Penguin mailto:sage [2009/08/11(火) 16:36:53 ID:zgCywBrU]
>>258
man top

260 名前:258 mailto:sage [2009/08/11(火) 17:33:42 ID:ggsX9yQb]
>>259
すいません。
manにありました。

現在topの内容をテキストに書き出して、テキストをsedで切り出して表示してるんですが
コマンドの戻り値を求めたいと思っておりますが
hogera=$(top -i -n1)
cpu=`sed -n '/Cpu(s)/p' "$hogera"`
こうすると「読み込めません: ファイル名が長すぎます」と出ます。
本来ファイル名の指定なのでうまくいかないのはあたりまえなのですが、
ファイルに書き出す事無くスマートに切り出す方法がありましたら教えてください。

261 名前:login:Penguin mailto:sage [2009/08/11(火) 17:42:23 ID:zgCywBrU]
>>260
いまいちやりたいことがわからんが
cpu=`top -b -n1 | grep '^Cpu'`
か?

262 名前:258 mailto:sage [2009/08/11(火) 17:54:30 ID:ggsX9yQb]
>>261
ありがとうございます。
そうか、grepすればいいだけの事ですね。
どうやら無意味にテンパってしまってるようです。

すいません。最後に1つだけ疑問に思っていることがあるのですが
シリアルコンソールで見る画面は横70文字にしとけって言われたんですが
何かそういった規格かなにかあるんでしょうか。検索してみてもそられしいものが
引っかからなかったんですが、70文字だとなかなか厳しいものがあるので
特に根拠のない文字数であるなら超えても構わないのではないかと思っております。

たびたびの質問で申し訳ありませんが、識者の方でご存じの人いたら教えてください。

263 名前:login:Penguin mailto:sage [2009/08/11(火) 17:55:36 ID:zgCywBrU]
>>262
スレ違い。

264 名前:258 mailto:sage [2009/08/11(火) 18:03:42 ID:ggsX9yQb]
>>263
解答ありがとうございます。
スレ違いとのことですが、これはどういったスレで質問するのがよろしいのでしょうか。
シェルスクリプトの表示だったのでこちらに投げさせていただいたのですが
どういった方面のスレかだけでも助言いただけないでしょうか。

265 名前:login:Penguin mailto:sage [2009/08/11(火) 18:07:41 ID:zgCywBrU]
>>264
くだらねえ質問はここに書き込め! Part176
pc11.2ch.net/test/read.cgi/linux/1246986882/

266 名前:login:Penguin mailto:sage [2009/08/12(水) 00:03:08 ID:0UM4nevW]
>>263
きびしー

267 名前:login:Penguin [2009/08/12(水) 00:05:03 ID:I1tOnENr]
>>264
VGAとかSVGAとか解像度で違うっての聞いたことある。
もしかしたら全然違うかもしれんがそういうときはきっと誰か激しく突っ込んでくれるはず。



268 名前:login:Penguin mailto:sage [2009/08/12(水) 00:10:31 ID:u9/Em9/R]
>>267
ぜんぜん違う話。

269 名前:login:Penguin mailto:sage [2009/08/12(水) 05:02:52 ID:0UM4nevW]
$ cat<<<h$(cat<<<e$(cat<<<l$(cat<<<l)o)\!)

270 名前:login:Penguin [2009/08/12(水) 14:49:33 ID:/9MBM8gW]
特定文字列が含まれてるかどうかの判断って出来ますか?
sedとかで文字の置き換えとか入れ替えが出来る程度のレベルです。
dg=`route | grep '192.168.24.1'`
でdgの中にug含まれているかどうかを確認したいと思ってます。


271 名前:login:Penguin mailto:sage [2009/08/12(水) 14:51:54 ID:u9/Em9/R]
>>270
route | grep '192.168.24.1' | grep ug
ってこと?

272 名前:login:Penguin mailto:sage [2009/08/12(水) 14:59:52 ID:LZ159q8G]
>>270
case "${dg}" in
*ug*)
# match
;;
*)
# not match
;;
esac


273 名前:270 [2009/08/12(水) 15:13:57 ID:/9MBM8gW]
>>271
そうでした。パイプでさらにgrepすればよかったですね。
こちらの方法でも出来ました。
ありがとうございます。

>>272
判定までしていただいて助かります。
こちらの方法で出来ました。
ありがとうございます。


まだまだよくわかってないですがここで質問しなくてもすむように勉強したいと思います。

274 名前:login:Penguin [2009/08/12(水) 18:46:07 ID:jKHDnL7q]
シェルスクリプトでサーバーのチェックをしてます。
それ自体はcronで定期的に行ってますが、これと併せて定期的にデータを送信出
来ればと考えてます。
実際にはチェックして引っかかったサーバーにzipを送り、サーバーは時間が来
れば勝手に実行するという感じですが、シェルスクリプトでzipデータを別サー
バーに送るとかいうことが可能でしょうか。
可能ならどんな関数を使えばよいかアドバイスもらえないでしょうか。
初歩的な質問かと思いますが宜しくお願いいたします。



275 名前:login:Penguin mailto:sage [2009/08/12(水) 18:54:50 ID:8iPFdi1w]
金玉 → >>274






。゜( ゜^∀^゜)゜。アーッハハハハノヽノヽノヽノ\ / \

276 名前:login:Penguin mailto:sage [2009/08/12(水) 21:03:12 ID:0s7n/+F7]
>>274
sshの鍵交換してパスワードを聞かれないようにしておいて
scpなりrsyncなりで送れば良いと思う。

277 名前:login:Penguin mailto:sage [2009/08/12(水) 23:35:06 ID:tCsvaW+m]
>>239

これはどう?

#/bin/bash
FILE=$1
OFILE=/dev/shm/hoge
xargs < $FILE -n10 | tr " " "\t" > $OFILE




278 名前:login:Penguin mailto:sage [2009/08/12(水) 23:40:23 ID:tCsvaW+m]
>>277 じこれす

まちがった

xargs < $FILE -n10 | tr ' ' \\t > $OFILE

です。

279 名前:login:Penguin mailto:sage [2009/08/12(水) 23:56:35 ID:0UM4nevW]
すげー

280 名前:login:Penguin mailto:sage [2009/08/14(金) 09:45:57 ID:vesWTwzQ]
変数COUNTER の値が10より小さければ
MMF0009 と表示
100より小さければ
MMF0099 と表示
1000より小さければ
MMF0999 と表示
1000ならば
MMF1000 と表示
というスクリプトをcase 文を用いてすっきり書きたくて下記の通り書きましたが、
算術式及び、case の構文の違いでしょうか間違っています、ご教示願えないでしょうか。

#!/bin/bash
COUNTER=0
DIGIT3=000
DIGIT2=00
DIGIT1=0

while [ ${COUNTER} -lt 999 ]
do
case "$COUNTR" in
`expr ${COUNTER}` -lt 10) echo "MMF$DIGIT3$COUNTER";;
`expr ${COUNTER}` -lt 100) echo "MMF$DIGIT2$COUNTER";;
`expr ${COUNTER}` -lt 1000) echo "MMF$DIGIT1$COUNTER";;
`expr ${COUNTER}` = 1000) echo "MMF$COUNTER";;
esac
COUNTER=`expr ${COUNTER} + 1`
done


281 名前:login:Penguin mailto:sage [2009/08/14(金) 09:56:51 ID:HEs3iRVc]
>>280
manpageより

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
A case command first expands word, and tries to match it against each pattern in turn,
using the same matching rules as for pathname expansion (see Pathname Expansion below).

282 名前:login:Penguin mailto:sage [2009/08/14(金) 10:03:19 ID:GRUhI9LP]
こういうこと?
seq -f 'MMF%04.f' 0 1000

283 名前:login:Penguin mailto:sage [2009/08/14(金) 15:19:52 ID:VHMVUNf7]
>>280
すっきり書いてみた。

#! /bin/sh
COUNTER="$1"

DIGIT1=000
DIGIT2=00
DIGIT3=0
DIGIT4=
eval 'echo "MMF${DIGIT'"${#COUNTER}"'}${COUNTER}"'


284 名前:283 mailto:sage [2009/08/14(金) 15:31:27 ID:VHMVUNf7]
printfがあれば更にすっきり。

#! /bin/sh
COUNTER="$1"

printf 'MMF%04d\n' "${COUNTER}"


285 名前:login:Penguin mailto:sage [2009/08/14(金) 23:08:31 ID:vesWTwzQ]
>>280 です
皆さんどうもありがとうございます。
C のswitch〜case構文のようなものかと勘違いし、case の使い方が全然間違ってましたし他にも細かなミスがありましたが、調べてこんな感じで期待通りの振る舞いができました
case $COUNTR in
?)
echo "MMF$DIGIT3$COUNTER"
??)
echo "MMF$DIGIT2$COUNTER"
??)
echo "MMF$DIGIT1$COUNTER"
1000)
echo "MMF$COUNTER"
esac
それから、seq とかeval の使い方も調べて見ます、どうもありがとう。

286 名前:login:Penguin mailto:sage [2009/08/14(金) 23:17:06 ID:vesWTwzQ]
>>285です
もう一つお願いします。
シェルスクリプト というのは、そのような仕組みになってるんでしょうか?
単純にインタプリタ型の言語なのでしょうか、自分としてはそうではない気がします
なぜなら、sudo コマンドを使う場合、シェルスクリプトの場合、スイッチ を付加して実行しますが
それは直接、カーネルに対してオペレーションしているような気がするのですが?詳しい方が居られましたら教えてください。

287 名前:login:Penguin mailto:sage [2009/08/14(金) 23:19:32 ID:vesWTwzQ]
×シェルスクリプト というのは、そのような仕組みになってるんでしょうか?
○シェルスクリプト というのは、どのような仕組みになってるんでしょうか?



288 名前:login:Penguin mailto:sage [2009/08/14(金) 23:40:04 ID:4UQz02FW]
>>286
>それは直接、カーネルに対してオペレーションしているような気がするのですが?

気のせいです。
手始めにforkとかexecvとか調べたらいいんじゃね?


289 名前:login:Penguin mailto:sage [2009/08/14(金) 23:56:56 ID:cgRLII5a]
インタプリタだよ。

sudoは、シェルとは別のプログラムです。
シェルスクリプト中で、シェルのビルトイン関数やらで無いコマンドを書くと、
シェルは、その名前のプログラムを探してそれを実行しようとします。

上に出てきた中で言うと、
while case echo evalはシェルのビルトイン関数(?)で
seq printf sudoは外部プログラムです。

「カーネルに対してオペレーションしている」云々は、
言っている意味が良く分かりません。
全ての意味のあるプログラムは、直接的にしろ間接的にしろ、
カーネルと相互作用するはずですから。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<221KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef