シェルスクリプト総合@LINUX Part3
■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin
2007/07/10(火) 23:17:13ID:qGthZdMEまあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。
初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。
perlやらPythonやらの話が混ざっても良いんでない?
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc11.2ch.net/test/read.cgi/linux/1154578200/
http://pc8.2ch.net/test/read.cgi/linux/1121994321/
>>2-5あたりに色々と。
0196login:Penguin
2007/09/18(火) 18:48:06ID:mMDRvNP8スマソが懽の隣の文字のフォントが無いのだが
E3
5E
って表示になってる
0197login:Penguin
2007/09/18(火) 19:09:24ID:AGCqK3mV0198login:Penguin
2007/09/18(火) 21:50:07ID:En+WDn3C~/tmp/ 以下にあるファイルすべてに対してファイル変換したいのです(例 aaaaa ⇒ aaaaa.txt)
~/tmp/aaaaa
~/tmp/bbbbb
:
~/tmp/nnnnn
=============
cd ~/tmp/
ls_result1=`ls`
for list1 in $ls_result1
do
#便宜上 (変換コマンド) (変換前) (変換後) とします
(変換コマンド) ~/tmp/$(list1) ~/tmp/tmp/$(list1).txt ←listの使い方が間違っているのだと思います
done
=============
list1 not found というエラーがたくさん出てきてしまい困っております。
~/tmp/ 以下にあるファイル名をそのまま使いたいので、どなたかご教授ください。
0199login:Penguin
2007/09/18(火) 22:05:47ID:9R+Y1frn×(変換コマンド) ~/tmp/$(list1) ~/tmp/tmp/$(list1).txt
○(変換コマンド) ~/tmp/${list1} ~/tmp/tmp/${list1}.txt
0201login:Penguin
2007/09/19(水) 06:55:54ID:OLZv4Z+v\tとか技も覚えますたww
みなさん�d�d!
0202198
2007/09/19(水) 12:51:22ID:OlaeIc6lまたつまづいてしまいました
# その前の処理で year month day hour という変数が与えられています
txtファイルの1行目 2007090100AB ⇒ year month day hour AB(変数の間のスペースなし、ABは固定文字列)
txtファイルの2行目 2007/09/01 ⇒ year/month/day
そこで以下のように作ったのですが、~/tmp/ に bakファイルが作られておらず、
echo $ls_result を見ると /home/myname/tmp/*.txt となっていました
想定では *.txt だったのですが・・・
=================
ls_result=`ls ~/tmp/*.txt`
for list in $ls_result
do
cp -p $list ${list}.bak
sed -e '1 s/2007090100AB/${year}${month}${day}${hour}AB/' ${list}.bak
sed -e '2 s/2007\/09\/01/${year}\/${month}\/${day}/' ${list}.bak
mv &{list}.bak $list
#rm -f ${list}.bak
=================
どなたか教えてください。よろしくお願いします。
0203login:Penguin
2007/09/19(水) 15:41:53ID:Ii4uF/l/0204login:Penguin
2007/09/19(水) 18:36:32ID:42fTFu0Hこれだと置換後のファイルを.bakに作って、そのあと出来た.bakをオリジナルに
重ね書き(しかもムーヴ)してるように見えるけど。
.bakとオリジナルの2個とも残したいなら、mvじゃなくてcpだろうね。
それ以前に、こういう処理だと普通は.bakに変換前のオリジナルを残すと思うが。
最初にオリジナルを.bakにcpしてあるんだから、.bakは触らずに、元のファイルに
sedかけて、最後のmvは不要では
0205198
2007/09/19(水) 20:34:50ID:OlaeIc6lコメントありがとうございます
いただいたアドバイスどおり、bakにはさわらずにオリジナルでsedかけてみました
ところが、シェルを動かした後のファイルを見ると動かす前とまったく同じ状態でした。
タイムスタンプも動かす前と同じでした。
sedの使い方が間違っているのでしょうか。今一度教えてください。
=================
ls_result=`ls ~/tmp/*.txt`
for list in $ls_result
do
cp -p $list ${list}.bak
sed -e '1 s/2007090100AB/${year}${month}${day}${hour}AB/' ${list}
sed -e '2 s/2007\/09\/01/${year}\/${month}\/${day}/' ${list}
#rm -f ${list}.bak
=================
0206login:Penguin
2007/09/19(水) 20:37:21ID:NIZBsTRKsedは-iオプションを指定しないと結果を標準出力に書き出すだけだよ。
0207login:Penguin
2007/09/19(水) 21:25:46ID:gh8Zvftq-e "1s/2007090100AB/${year}${month}${day}${hour}AB/" \
-e "2s,2007/09/01,${year}/${month}/${day}," \
~/tmp/*.txt
で、よくね?
0208198
2007/09/19(水) 21:44:56ID:OlaeIc6l207さんのとおりにしたら、想定どおりに動きました!
みなさんありがとうございました。m(_ _)m
ずっと調べてたらこんな時間に…
今からごはん作ります (^o^)/
0209login:Penguin
2007/09/21(金) 15:18:02ID:5N/Tidqv10/1〜10/31の日付名でコピーしたいのですが
なんかいい方法無いでしょうか?
Zshだと cp -R A 10[1-31]なんてできるのでしょうか?
0210login:Penguin
2007/09/21(金) 15:27:31ID:KLJI/R6Gfor i in {01..31}; do cp -pR A A10$i; done
zsh と bash で挙動違うな。
0211login:Penguin
2007/09/21(金) 15:37:28ID:KLJI/R6G< - > のことなら、ちょっと用途が違うよ。
こんなんやってみ。
% touch B2
% ls B{1..3}
% ls B<1-3>
0212login:Penguin
2007/09/21(金) 15:46:39ID:5N/TidqvディレクトリーAにhoge01〜100ってファイルを作ったときは
Zshでさらさら〜って逝けたのですが
現在bash環境なのでそれなりに書かないといかんなと思いつつ
3行になってしまう、漏れの脳みそでした il||li○| ̄|_
1行でやりたかったww さすがです>>210様 1行でばっちりコピーできますた
0213login:Penguin
2007/09/21(金) 15:49:11ID:5N/Tidqvなかなか参考になるスッドレですね
正規表現もきっちり覚えないといけませんねorz
0214login:Penguin
2007/09/22(土) 04:00:27ID:DSw3XQMb021573ですが
2007/09/22(土) 22:02:55ID:TBL9KN2Jおくればせながらスクリプトが動くようになりました。
御指摘のとおりスペースの数などがあっていませんでした。
ありがとうございました。
0216login:Penguin
2007/09/26(水) 09:48:46ID:kfTmpMA+やぱ現在時刻から60進法で計算したほうが早い?
現在時刻 21:24 残り時間 36分で22時 って感じ
で、やてみたい
0217login:Penguin
2007/09/26(水) 09:54:08ID:lgPbyfYBcoreutilsのdateを使う。
0218login:Penguin
2007/09/26(水) 13:11:02ID:kfTmpMA+しらなんだポカーン
>>217 ありが�dクス
0219login:Penguin
2007/09/26(水) 14:13:45ID:kfTmpMA+これでもでけた!
0220login:Penguin
2007/09/27(木) 18:47:27ID:Qh1DP+hx0221login:Penguin
2007/10/02(火) 23:24:08ID:57QYWA2W0222login:Penguin
2007/10/09(火) 18:07:07ID:lJCQFIXV今のところcuを使って対話的にATH0を
送っているのですが、これを
シェルスクリプト内で実行して
自動化する方法はありますか?
0223login:Penguin
2007/10/09(火) 23:58:35ID:rK7+VmTA0225login:Penguin
2007/10/11(木) 00:25:04ID:0rD2It5e草の根BBSでもやるんかい?
0226login:Penguin
2007/10/11(木) 02:33:49ID:8ZTBNRII報じてたじゃん。
こんなときにもなんとかなるよう在外公館にアナログモデムを常備してたりは
しないだろうか。
0227222
2007/10/11(木) 06:32:06ID:o32fDZEhこれまでCCT-98IIIのマクロで自動巡回してたんですが
Linuxにしたら使えなくなるそうなので・・・・。
って、いやそうじゃなくて、vgettyで留守電のテストを
やってたら回線をつかんだまま切れないことがあって
それを切断させたいわけです。
>>226
自分はいざというときのためにジャストシステム製の
音響カプラ持ってます。(処分してないだけかも)
0228login:Penguin
2007/10/11(木) 08:26:20ID:A6nFaf5VNIFTY フォーラム自動巡回スクリプトなので、CCT-98な人には改造が容易かも。
ダイアルアップpppスクリプトを書けば済むんじゃないかと思うけど、やったことないから分かりません。。。
0229login:Penguin
2007/10/11(木) 13:36:28ID:wykYuUw8cd /home/hogehoge
というシェルスクリプトを作成し、実行してみても、移動でき
ません。
ディレクトリを移動するにはどのようなスクリプトを書けばい
いでしょうか?
0230login:Penguin
2007/10/11(木) 13:41:47ID:wNnhF+3Eシェルスクリプトとバッチファイルは違う。
シェルスクリプトはシェル内で動作する子プロセスだ。
0231login:Penguin
2007/10/11(木) 13:44:37ID:wNnhF+3E一部訂正。
s/シェルスクリプトは/単純に実行したシェルスクリプトは/
解決方法は "source" 。
0233login:Penguin
2007/10/11(木) 18:43:47ID:KODaF1ATshell.sh がシェルスクリプトのファイル名だとして
chmod a+x shell.sh で実行権限与えて
shell.shがあるディレクトリで
./shell.sh
したら移動するよ。
0234229
2007/10/12(金) 09:38:40ID:EbLcx1Ghsourceやってみたら無事cd出来ました。
>>233
やってみたけど、上手くいきませんでした。
お二方ともありがとうございました。
0235login:Penguin
2007/10/12(金) 10:44:01ID:7zE2B01m子シェル(sh,cshなど)が新たに作られて、その子シェルがスクリプトを実行する。
で、スクリプトが終わるとその子シェルもろとも消えて親シェルに戻ってくる。
だから、シェルスクリプト内でcdしたり、環境変数をセットしても、その影響は
子シェルの中にとどまって、スクリプト終了と共に消えてなくなる。
cshのsourceやshの.(ドット)は、子シェルを作らないで自分の中でスクリプトを実行する。
だからcdやsetenv、exportの結果が、起動した親シェルに反映される
0236login:Penguin
2007/10/12(金) 11:22:55ID:5+kNLqtp0237233
2007/10/12(金) 17:40:09ID:sUVuIX9sごめん!間違った。
./shell.sh じゃなくて
. ./shell.sh でした。
. を打って1個スペース空けて シェルスクリプトファイル指定。
0238login:Penguin
2007/10/12(金) 17:46:35ID:5+kNLqtpなんで ./ を付けるの?
0239login:Penguin
2007/10/12(金) 17:59:22ID:+Kk0eMQd0240login:Penguin
2007/10/15(月) 14:50:05ID:NjtHefoB今のところwgetを使ってwget http://hogehoge をクーロンで動かす予定ですが
もっとスマートなやりかたはありますか?
0241login:Penguin
2007/10/15(月) 22:15:04ID:yaqxWPIKそれでいいんじゃね?
0242login:Penguin
2007/10/15(月) 23:35:58ID:6xnjJ9Cnじゃあ1分に1回よりも高頻度(30秒に1回とか、15秒に1回とか) やりたい場合はどうすれば?
0243login:Penguin
2007/10/16(火) 00:24:31ID:7lwU6GvW0244login:Penguin
2007/10/16(火) 01:36:38ID:IhGBMLbJwget http://...; sleep 30; wget http://...
するスクリプトを毎分実行するとか。
0245login:Penguin
2007/10/16(火) 08:18:30ID:a72PxkLHアタックしたいわけじゃないですよ。
ただcronって最高でも1分に1回しか実行できないはずなので、それよりももっと短い間隔で
処理をさせたい場合とかどうするのかなぁとふと疑問に思ったもので。
>>244
なるほど・・。 しかし wget http://... ; のところで1分ぐらい処理に時間がかかった場合
その後の sleep 30 ; がきて、そしてまた wget http://... がくるから、タイミングと言うか場合によっては
30分に1回キッチリ実行されるとは限りませんね。31分かかって、その後実行されて
今度は29分後に実行されるみたいなズレ方はしますよね。
0246login:Penguin
2007/10/16(火) 08:26:34ID:IhGBMLbJバックグラウンドで実行するとか。
つーか、何分もかかる処理を30秒ごとに実行していいのか?
0247login:Penguin
2007/10/16(火) 11:46:31ID:wfMufGFCSolarisだと、確か同時実行数が100個を超えるとそれ以降は時刻が来ても起動しなくなる
LinuxだとOOMキラーが動いて刈り取られるかもしれん
cronの起動間隔 ≒ プロセスの実行時間
となるような長めのプロセス、特に通信関係とかで長めのタイムアウトが発生しそうな
プロセスをcronに仕込むときは、注意したほうがいい
0248229
2007/10/16(火) 13:58:23ID:EtpWijek>>235
なるほどです。ありがとうございました。
>>236
ありがとう。aliasでも出来そうでした。
>>237
.の後に続けて入力したところ、うまくcdできました。
>>238
素人なのでよく分かりませんが、実行ファイルを実行するときに付けるんでは?
それでは、みなさんありがとうございました。
0249login:Penguin
2007/10/16(火) 14:09:44ID:IhGBMLbJ. shell.sh
でもいっしょだよ。
やってみ。
0250login:Penguin
2007/10/16(火) 17:45:32ID:a72PxkLHつけないと 環境変数 $PATH の中から該当する物が無いかを探してなかったら
エラー返すので。 カレントディレクトリのファイルを指定する時にいちいち
./ をつけるのが面倒だからって $PATH に ./ も含めてしまうとセキュリティホールになるので
やらないでね。
0251login:Penguin
2007/10/16(火) 17:50:59ID:IhGBMLbJ>>249
0252login:Penguin
2007/10/16(火) 18:39:11ID:tU6zGUOB0253login:Penguin
2007/10/16(火) 19:18:04ID:iHfKM46h0254login:Penguin
2007/10/16(火) 19:45:06ID:tU6zGUOB情報ありがとうございます。
行数を表示するだけでなくて、
シェルスクリプトの中で行数を変数に格納して、
なんらかの処理を行いたいと思っているのですが
何かうまい方法はありますでしょうか
0255login:Penguin
2007/10/16(火) 21:12:10ID:pdm4T3SFROWS=`stty -a | tr ";" "\n" | grep rows | sed "s/.*rows //"`
0256login:Penguin
2007/10/16(火) 21:36:05ID:tU6zGUOBできましたありがとうございました。
0257login:Penguin
2007/10/16(火) 23:32:43ID:sWAUZpv30258login:Penguin
2007/10/17(水) 04:58:42ID:d5Vjha9K0259login:Penguin
2007/10/17(水) 10:00:57ID:9KXOUzKWCOLS=`tput cols`
0260login:Penguin
2007/10/17(水) 22:15:42ID:VuOM9tU/echo $LINES $COLUMNS
0261login:Penguin
2007/10/18(木) 12:39:19ID:fyMSNeWaresize は X がインストールされていない環境では使えない。
xterm の付属物なので。
0262login:Penguin
2007/10/23(火) 17:14:39ID: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"では上手く行きません。
何かいいアドバイスを教えてください。よろしく御願いします。
0263login:Penguin
2007/10/23(火) 17:19:48ID:4jX2ZQqucut -c57- ってのは何?
0264login:Penguin
2007/10/23(火) 17:20:31ID:XqFIvlF4シェルスクリプト以前の話だな。
まずは最終的に何をやりたいのかをはっきりしろ。
0265login:Penguin
2007/10/23(火) 17:26:06ID:4jX2ZQqu$log にたくさんファイル名が入ってるのに
echo $log をいじろうとするのがよくわからんな。
>>264
まずは日本語の勉強からだな。
0266login:Penguin
2007/10/23(火) 17:50:56ID:OMh5qn/Oサイト名だけの文字を取りたかったので、cut -c57- としました。
>>264
申し訳御座いません。
ログファイル名からサイト名だけを文字を取り出して、取り出した文字
(サイト名)のフォルダを作って、作ったフォルダにそれぞれログを
振り分けてログファイルをマージさせたいです。
これで、少しは伝わりますでしょうか?
>>265
$logの結果からサイト名の文字だけ取りたかったので、echo $logを
いじっています。
0267login:Penguin
2007/10/23(火) 18:08:13ID:XqFIvlF4プログラミングの論理部分を勉強したほうがいい。
「やりたいこと」と「実際のスクリプト」の間には
「ロジックを組み上げる」作業が必要になるが、
君はこの部分について全く理解できていないようだ。
まずは
「findで検索したファイルの一覧はどういう形で変数logに入っているのか」
「その変数logに対して繰り返し処理を行なうにはどうしたらよいか」
を調べてくるべし。
0268login:Penguin
2007/10/23(火) 18:09:14ID:4jX2ZQqu0269login:Penguin
2007/10/23(火) 18:17:19ID:OI+rqPplfind . -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作って実行
0270login:Penguin
2007/10/23(火) 18:18:51ID:OMh5qn/Oアドバイスありがとうございます。
正直、インフラ担当なのでプログラムさっぱりです(;´Д`)
とりあえず、ググって調べてみます。
>>268
もう少し調べてから、スクリプト書き直します。
ありがとうございました。
0271login:Penguin
2007/10/23(火) 18:20:53ID:OMh5qn/Oありがとうございます。
参考にさせて頂きます。とりあえず、スクリプト周りを調べて
書いてみます。
0272login:Penguin
2007/10/23(火) 18:25:49ID:4jX2ZQqucd /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
ファイル数が多過ぎるとかヘンなファイル名とかは知らね。
0273login:Penguin
2007/10/27(土) 10:44:25ID:mm4VeEeLどうやりますか?
0274login:Penguin
2007/10/27(土) 13:17:13ID:D/VUEDKM0275login:Penguin
2007/10/27(土) 13:26:52ID:QMQXG4ov俺のIPサンプルに使うなよ。晒されたら攻撃の的になるだろうが(´・ω・`)
0276login:Penguin
2007/10/27(土) 13:35:53ID:6kGxUA5Uありがとうございました。
0277login:Penguin
2007/10/27(土) 14:33:40ID:NSYPc3Nwネットに繋がらないと思ったらお前のせいかー!
早く俺のIP返してくれよ(´・ω・`)
0278login:Penguin
2007/10/27(土) 15:34:59ID:XQQiaIjqそうか、そんなにお望みなら今から的にしてやるよwww
タシロ砲とブラスターとあと手持ちの攻撃ツールの標的IPを全部セットして攻撃開s
0279login:Penguin
2007/10/27(土) 19:24:46ID:OFawlVSO0280login:Penguin
2007/10/27(土) 21:20:28ID:jIwdHtQL0281login:Penguin
2007/10/29(月) 10:48:36ID:AXA/ueYo0282login:Penguin
2007/10/29(月) 10:55:37ID:PqFYrP+50283login:Penguin
2007/10/29(月) 11:01:37ID:F/RFN0baいややめとく
0284login:Penguin
2007/10/29(月) 18:16:52ID:lN+2vPd7オレのIPは
169.254.88.24だぞ。
0285login:Penguin
2007/10/29(月) 20:28:52ID:vqPZDaQA255.255.255.255 -> 0xffffffff
のように、IPv6表記を16進表記に変換する手続きを考えてくだちい。
f000::1 -> 0xf0000000_00000000_00000000_00000001 ("_"は不要)
ff::169.254.88.24 -> 0x00ff0000_00000000_00000000_a9fe5818
0286login:Penguin
2007/10/29(月) 23:28:48ID:Hdkrl+3D> ruby -rsocket -e 'p Socket.gethostbyname("ff::169.254.88.24")[3].unpack("C16").map{|c|format "%x",c}.join'
"00ff00000000000000000000a9fe5818"
0287login:Penguin
2007/10/30(火) 21:40:02ID:Hmkhn1Qfgethostbyname()等を使えばいいのか。
0288login:Penguin
2007/11/06(火) 00:15:33ID:vKEt0xzk(カラム位置) [col1 col2 col3 col4]
(コマンド出力) 0001 0002 * 0004
である場合にこの結果をset `hoge`で受けた場合、位置変数
$3に「*」が入ってくるようにbashのスクリプトを作成したい
のですが現状ではどうやってもカレントディレクトリ配下の
ファイル一覧が入ってきてしまいます。
何か良い手がありましたら教えて下さい。
0289login:Penguin
2007/11/06(火) 00:55:19ID:M5wBEVHJ0290login:Penguin
2007/11/09(金) 03:25:37ID:r4+4tELyオイオイ!w
マジレスすると
$ set -o noglob
じゃないの
0291login:Penguin
2007/11/09(金) 06:12:20ID:BEUM5jSjzenity を使うとシェルスクリプトで手軽な GUI が作れるぞ
0292login:Penguin
2007/11/09(金) 08:21:31ID:kDM6jkymでトップに出て来るページは、もしかしてケンカを売ってますか?
>最新のGnomeデスクトップを使っていても古いUnixユーザーはすぐにターミナルエミュレータを開いてしまいがちです。
0293login:Penguin
2007/11/09(金) 12:05:22ID:ei55nGr20294login:Penguin
2007/11/10(土) 01:20:06ID:5ErO5tFm音声ファイルをビデオホスティングサイトに投稿時に使用
====================================
#!/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
====================================
0295login:Penguin
2007/11/10(土) 09:47:24ID:9Zj/zooJLinuxから入った人だけど、Gnomeなんてマルチウインドウ端末エミュレータ支援ソフト西か見えません
■ このスレッドは過去ログ倉庫に格納されています