シェルスクリプト総合@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あたりに色々と。
0002login:Penguin
2007/07/10(火) 23:18:45ID:qGthZdMEおまいら! sed の使い方教えて下さいm(_ _)m@linux板
http://pc11.2ch.net/test/read.cgi/linux/1067815570/
【Shell】どのシェル使ってる?【Script】@LINUX板
http://pc11.2ch.net/test/read.cgi/linux/1067330754/
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
sed@UNIX板
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
2ちゃん画像落としまくりスクリプト@UNIX板
http://pc11.2ch.net/test/read.cgi/unix/1003833552/
連番のH画像/動画を一気にダウンロードする2
http://pc11.2ch.net/test/read.cgi/unix/1135533382/
ログを読みたい人はこちら
http://makimo.to/cgi-bin/search/search.cgi?q=%83V%83F%83%8B%83X%83N%83%8A%83v%83g&andor=OR&sf=0&H=&view=table&all=on&shw=
0003login:Penguin
2007/07/10(火) 23:20:21ID:qGthZdMEbashで始めるシェルスクリプト基礎の基礎 @IT
http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08a.html
シェルスクリプト(Bash)入門 CYBERAM Documents Project
http://cyberam.dip.jp/linux_command/shellscript.html
IBM developerWorks
実例でわかるsed
http://www-06.ibm.com/jp/developerworks/linux/010202/j_l-sed1.html
http://www-06.ibm.com/jp/developerworks/linux/010216/j_l-sed2.html
http://www-06.ibm.com/jp/developerworks/linux/010223/j_l-sed3.html
実例でわかるawk
http://www-06.ibm.com/jp/developerworks/linux/010330/j_l-awk1.html
http://www-06.ibm.com/jp/developerworks/linux/010413/j_l-awk2.html
http://www-06.ibm.com/jp/developerworks/linux/010622/j_l-awk3.html
コマンドラインからのグラフィックス操作
http://www-06.ibm.com/jp/developerworks/linux/031031/j_l-graf.html
洗練されたPerl: MP3とPerlで遊ぶ
http://www-06.ibm.com/jp/developerworks/linux/040319/j_l-cpmp31.html
http://www-06.ibm.com/jp/developerworks/linux/040402/j_l-cpmp32.html
0004login:Penguin
2007/07/14(土) 09:56:17ID:42ZxWwqP0005login:Penguin
2007/07/14(土) 11:17:49ID:29sQfd47nkf とか iconv とか。
0006login:Penguin
2007/07/14(土) 22:31:28ID:Lb+uQxni該当するファイルがファイルシステム上にある場合はそのファイルが変わりに
引数として渡されるみたいですが、ワイルドカード自体を取得したいのです。
何か方法はないでしょうか?
ちなみにダブルクォーテーションをつければ展開されないのは知っていますが、面倒で。。
(例)
$ test.sh *.txt
$ echo $1
とするとカレントにあるXXX.txtを表示するのではなく
「*.txt」を表示したいのです。
0007login:Penguin
2007/07/14(土) 22:53:16ID:29sQfd47呼ばれるスクリプトの側でなんとかしたいってことなら
無理だよ。
0008login:Penguin
2007/07/14(土) 23:13:50ID:Lb+uQxniそんな気はしていましたが、そうですか。。
残念です。
0009login:Penguin
2007/07/14(土) 23:26:42ID:29sQfd47$ set -o noglob
$ test.sh *.txt
とか。
0010login:Penguin
2007/07/15(日) 05:00:56ID:OzInTFfntest.sh '*.txt'
(シングルコーテーションならてんかいされないはず)
0011login:Penguin
2007/07/15(日) 11:22:44ID:oGW94xFnおまけの関連スレ
シェルスクリプト相談室
http://pc11.2ch.net/test/read.cgi/tech/1112553783/
awkについて語るスレ $2
http://pc11.2ch.net/test/read.cgi/tech/1172242542/
0012login:Penguin
2007/07/15(日) 12:37:56ID:llPpP8sTよく仕様がわからんが、スクリプトの多段階呼び出しで展開されたくないんだったら、
$ test.sh @.txt
みたいに、擬似ワイルドカード指定指定しておいて
使ううときに、
fs=`eco $1 | sed 's/@/*/'`
echo $fs
0013login:Penguin
2007/07/15(日) 22:24:45ID:ZpXAubZ6complete とかで、補完のルールを作れるんじゃないか?
bashで補完スレ [UNIX板]
http://pc11.2ch.net/test/read.cgi/unix/1013019416/
0014login:Penguin
2007/07/16(月) 12:28:16ID:MK2VLXxK/homeの中にある複数のファイル・ディレクトリーをrm -rf したいのですが
/home/hogeとlost+found だけは消したくないので
何とかそれ以外を消す方法をご教示頂きたいのですが
おしえてたもれ
0015login:Penguin
2007/07/16(月) 13:05:49ID:fC+1yCpQshell script関係ないが、lsでリストとって、リストから削除したくないファイル・ディレクトリを削除し、
その後 rm -rf `cat 〜` なんかするのが間違いなくて確実だとおもー。
0016login:Penguin
2007/07/16(月) 13:13:37ID:hTbLQxc+bashだったら、GLOBIGNORE="hoge:lost+found" に賭けてみたまえ
0017login:Penguin
2007/07/16(月) 13:32:26ID:xW/HZyHjその後戻せばいいのでわ
0018login:Penguin
2007/07/16(月) 21:41:14ID:J/qZmNrt0019login:Penguin
2007/07/17(火) 03:37:44ID:I2w4SVYdどうやればいいでつか?
0020login:Penguin
2007/07/17(火) 10:02:57ID:ZxaQD0ZF0021login:Penguin
2007/07/18(水) 08:18:48ID:Dw+iZryL遅くなりましたが、ありがとうございます。
試してみたいと思います。
0022login:Penguin
2007/07/18(水) 16:34:40ID:cvC9pUm6ありがとう。
できまちた。
0023login:Penguin
2007/07/19(木) 07:38:39ID:gg1Is+TJ�dクス
とりあえず、試験機でゴリゴリしてみます
0024login:Penguin
2007/07/19(木) 07:41:44ID:gg1Is+TJその方法でやってみたいと思います
0025login:Penguin
2007/07/20(金) 01:54:45ID:bZea7ZdA厳密さは求めていません。暴走防止程度です。
(因みにLinux初心者のプログラマです、あまり複雑な概念は未だ理解できていないと思います。
今は大体こんな感じでやろうとしています、
(sleep 10; kill $$)&
時間制限を設けたいコマンド
これだと、時間内に終了しなかったとき、スクリプトのみ終了し、実際に終了させたいコマンドは生き残ります。
時間内に終了したときにkillさせないために最後に kill `jobs -p` すると「(sleep 10; kill $$)&」は終了しますが、sleepだけが残ります(自然消滅はする
だからといって kill 0 とするとこのスクリプトの呼び出し元まで死んでしまいます。
プロセスを kill するときに、その子も殺せればいいんですが如何でしょうか。
0026login:Penguin
2007/07/20(金) 02:25:54ID:zucTG+iZps --ppid とか pstree -p とかで
子の pid を調べれば
kill できると思う。
0027login:Penguin
2007/07/20(金) 07:34:06ID:0zbWXhyqCPU使った時間になっちゃうけど。
0028login:Penguin
2007/07/20(金) 13:11:40ID:VbE5NJtk0029login:Penguin
2007/07/22(日) 01:17:56ID:MkzMxIYhpstree -p からpidだけ取り出す方法が分かりません。
ps --ppid の再起で殺すようにしてみましたが思い通り動いてくれません。
間違えている可能性は大いにありますが。
>>27
CPU時間でも構いません。寧ろその方が良いかもしれません。
ありがとうございます。調べてみます。
>>28
でしょうね。
0030login:Penguin
2007/07/24(火) 02:36:44ID:TdZoIfh3% pstree -p 親PID
親cmd(親PID)-+-子cmd(子PID)
と表示されるんだから、
% pstree -p 親PID | perl -nle '/親PID\)[^\(]+\((\d+)\)/ && print $1'
子PID
とならないかな?awkでもsplitを使えば同じようにできると思う。
そもそもperl使うならpstreeもkillも内部で呼び出せば済むけど。
それ以前にプロセスをアレコレする関数かmodがあるんだろうな...
0031login:Penguin
2007/08/04(土) 23:01:23ID:prsNz29Aawk -F'|'
ではパイプとみなされてしまいます
0032login:Penguin
2007/08/04(土) 23:37:42ID:dhi36EzE% echo 'a|b|c' | gawk -F'|' '{print $2}'
b
0033login:Penguin
2007/08/05(日) 03:46:06ID:a+1tcmkL-F'[|]' とか
0034login:Penguin
2007/08/05(日) 23:10:51ID:ftJrAaPL非rootのアカウントからシェルを実行して
規定のHDDをマウントしたいと思っています。
問題は非rootなのでmountの実行権が無い点です。
sudo は設定方法がよく分からないので、
もちょっと簡単なやり方ないかと探しているのですが
何かよい方法ないもんでしょうか?
スクリプトの中でrootでログインして、そのまま
実行してほしい。(passwd入力はOK)
ちなみにSuSE 10.2を使ってます。
0035login:Penguin
2007/08/05(日) 23:39:27ID:YQ3bjemYsudo の設定くらいわかれ。
そんなに難しくないよ。
0036login:Penguin
2007/08/06(月) 01:50:25ID:xhWrZGpQいかん、だるい。
0037login:Penguin
2007/08/06(月) 02:18:34ID:AKmvozj+/etc/fstabの規定のHDDのエントリ内に user というオプションを書いておけば、
そこは一般ユーザでもmount/unmountできるようになる。
もちろんこの場合、mountコマンド自体のxビットは、一般ユーザが実行できるように
設定する必要がある。
0038login:Penguin
2007/08/06(月) 22:17:00ID:LTHEPNn8a.logはソフトのログファイル。
b.txtはerror、badなどの複数行の文字列が入っています。
で、a.logに対して、b.txtの中を一行ずつgrepさせたいときはどうすればいいの?
↓のようにしたい。b.txtは50行程度の行数があるとする。
grep -i error a.log
grep -i bad a.log
grep -i ...... a.log
などをしたい。
0039login:Penguin
2007/08/06(月) 22:32:01ID:kQOiX48tbshしか知らね。
0040login:Penguin
2007/08/06(月) 22:50:29ID:q2/C5Z+30041login:Penguin
2007/08/09(木) 03:57:05ID:q+NJZ5PJスクリプト自身のパスを知るにはどうすればいいですか?
0042login:Penguin
2007/08/09(木) 06:28:33ID:EHaDR+6/0043login:Penguin
2007/08/09(木) 08:01:28ID:NwjhxE+fhttp://www.nurs.or.jp/~asada/FAQ/UNIX/section4.4.html
0044login:Penguin
2007/08/09(木) 11:34:05ID:EHaDR+6/俺? $0で十分だと思うけど?
0045login:Penguin
2007/08/09(木) 21:51:00ID:8UsjPRp60046login:Penguin
2007/08/10(金) 18:42:50ID:hRezB52r#!/bin/sh
for i in "$@"
do
a="$(echo $i | nkf -w)"
mv $i $a
done
convmv は元の文字コードを指定しなきゃならないのが面倒なので。
良かったらどぞ。
004746
2007/08/10(金) 18:44:30ID:hRezB52r./myconvmv.sh *
とかで使える。
0049login:Penguin
2007/08/15(水) 18:16:19ID:oxw3opBU・同名ファイルが存在する場合は、
既に存在するファイル名を「ファイル名.1」へ変更し、
既にファイル名.1が存在しているのであれば、それをさらにファイル名.2へ変更し、、、(繰り返し)
というコピーシェルスクリプトがほしいんですが、
簡単な記述方法などがあったらおながいします。
0050login:Penguin
2007/08/15(水) 18:22:48ID:vI6OWTR9自分ではどこまでできたの?
005149
2007/08/15(水) 18:30:05ID:oxw3opBUmv とかのオプションでそんな機能ないかな〜と
調べている程度の状態です。
--------------------------------------------------
・同名ファイルが存在する場合は、
既に存在するファイル名を「ファイル名.1」へ変更し、
既にファイル名.1が存在しているのであれば、それをさらにファイル名.2へ変更し、、、(繰り返し)
--------------------------------------------------
この部分を数行で教えていただけるとありがたいでつ。
ループ処理が必要になるのはなんとなく予想がつくのですが、、、
0052login:Penguin
2007/08/15(水) 18:34:51ID:vI6OWTR9ファイルが何番まであるかを先にチェックして
番号大きい方から順に mv してくのが楽かな。
[ とか expr 使え。
0053login:Penguin
2007/08/15(水) 23:30:14ID:BP+0zqcaそんな自堕落な道を私は選びました。
0054login:Penguin
2007/08/16(木) 07:16:56ID:D/eLf54Q全部*.cppにするにはどういう風に書いたらよいのでしょうか?
mv *.c *.cpp
としてみましたがだめでした
どなたかお知恵を...
0055login:Penguin
2007/08/16(木) 07:57:42ID:Uoi1O64b0056login:Penguin
2007/08/16(木) 10:10:37ID:MWEjh3WBfor f in *.c; do mv "$f" "${f}pp"; done
0057login:Penguin
2007/08/16(木) 13:33:29ID:D/eLf54QThx,できますた!
0058login:Penguin
2007/08/23(木) 16:17:17ID:n9QZBMiJシェルスクリプトある?
0059login:Penguin
2007/08/23(木) 16:36:59ID:lPn22JjI0060login:Penguin
2007/08/23(木) 16:53:47ID:C+I5hIDu普通にwgetでダウンロードすればいいだけでは?
youtubeから簡単に落としたいとかであればyoutube-dlとかが便利。
0061login:Penguin
2007/08/24(金) 19:56:13ID:k2Yrnoknいくつかのディレクトリの中にあるファイルのそれぞれの名前を変数に入れたいんだけど、
files=ls dir* | sort
for i in files
do
done
みたいなことは出来ませんか?
要するに標準出力する内容を変数に入れたいだけなんだけど。
0062login:Penguin
2007/08/24(金) 20:25:50ID:iKvrTLai「コマンド置換」でぐぐってみ
0063login:Penguin
2007/08/24(金) 20:43:22ID:k2Yrnokn理解できました。どうもありがとりんこです。
0064login:Penguin
2007/08/26(日) 16:36:55ID:sDCP6Pahls ... | sort | while read i; do echo $i; done
とかも定番。
0065login:Penguin
2007/08/27(月) 08:44:07ID:mTK43/6/do
done
sortを挟むのは良くわからんが、単純にこんなんで済む話じゃね?
0066login:Penguin
2007/08/27(月) 18:32:24ID:Vup2OsE3それだとlsの時点ですでに溢れる
0067login:Penguin
2007/08/27(月) 20:04:00ID:5Y4ThyNx0068login:Penguin
2007/08/28(火) 00:17:04ID:Gt/lw90mA.PDFとかファイルが格納されてて
0KB〜150MBなら 「ne-yo」
500〜600MBなら 「OK」 とfile.txtを出力したいのでつが・・・・・
if,thenの繰り返ししかないでしょうかね?
0069login:Penguin
2007/08/28(火) 00:58:46ID:is4Tjxw40070login:Penguin
2007/08/28(火) 08:13:17ID:k11zEdxe$ du -s * | awk '{ print $2," ", ($1 > 10000 ? "ne-yo" : "OK") }'
条件文のところは自分で書き換えてくれ。
0071login:Penguin
2007/08/28(火) 09:07:28ID:LHhLJxDo0072login:Penguin
2007/08/28(火) 14:07:23ID:LHPFC9xp0073login:Penguin
2007/08/28(火) 16:21:13ID:N3nQTqrG# time = 0.1000000000000000E-01
0 0.0000000000000000E+00 0.9108669739482692E-01 0.2058642824721793E-04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00
1 0.3175362884490020E+01 0.5150471547462544E+01 0.2241689225773500E-03 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00
# time = 0.2000000000000000E-01
0 0.0000000000000000E+00 0.9108669739482692E-01 0.8246429583076927E-04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00
1 0.3176583636040012E+01 0.5152080697165893E+01 0.8959185481550624E-03 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00
2 0.1132676183258557E+01 0.5482797684864557E+01 0.1300893227929982E-03 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00
# time = 0.3000000000000000E-01
0 0.0000000000000000E+00 0.9108669739482692E-01 0.1858117181080544E-03 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00
1 0.3178027531327324E+01 0.5153971284976635E+01 0.2013740280923297E-02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00
という形式で出力されるデータで、# time = 0.2000000000000000E-01からはじまって、# time = 0.3000000000000000E-01の手前までを切り出すスクリプトを教えてもらえないでしょうか。できればawk(perlかrubyでも構いません)で教えていただけるとありがたいです。
0074login:Penguin
2007/08/28(火) 16:31:19ID:kk6ZVe0Nつcsplit
0075login:Penguin
2007/08/28(火) 22:47:28ID:WiEkAmOgこんな漢字か。酔っているので合っているのかどうだか。
0.000000...の部分は付け足してクレイ
0076login:Penguin
2007/08/28(火) 23:05:57ID:WiEkAmOgあと仕様の意味が、#time=...から始まる一ブロックだけ出す(空行が出たらオシマイ)
という意味ならもっと単純になる
0077login:Penguin
2007/08/28(火) 23:48:14ID:Gt/lw90mawk の ? と : の使い方に感動
>>71-72 ls -lh とかでやろうとしたのは漏れ様も同じww
0078login:Penguin
2007/08/29(水) 12:08:46ID:NEtL1MxO>>75
さっそくにありがとうございます。
試してみます。
0079login:Penguin
2007/08/29(水) 22:41:00ID:4pERO676と違うファイルだということだけわかればいいので
わかりやすく比較する方法はありませんか?
diffのマニュアルみてもそれらしいのはないようで
0080login:Penguin
2007/08/29(水) 22:50:35ID:UIgvqpQIdiff -rq dir1 dir2 ではだめなの?
0081login:Penguin
2007/08/29(水) 22:51:26ID:N3MeiS9ehttp://www.gnu.org/software/diffutils/manual/html_node/Comparing-Directories.html#Comparing%20Directories
$ LANG=C diff -r dir1 dir2 | grep Only
とかである程度分かるかも。
0082login:Penguin
2007/08/29(水) 22:52:42ID:N3MeiS9e0083login:Penguin
2007/08/29(水) 23:16:46ID:9GyP78LH0084login:Penguin
2007/08/30(木) 01:02:14ID:F11xsKF5イメージ的には、こんなことがしたいんです↓
----------------------------------
hoge="1.3.37"
foo="1.11.12"
if [ "$hoge" -gt "$foo" ]; then
echo "OK"
else
echo "NG"
fi
----------------------------------
これだと、以下のようjにエラーになってしまいます。。。。
[: 1.3.37: bad number
NG
0085login:Penguin
2007/08/30(木) 04:22:00ID:GmS5dPb3foo="1.11.12"
hoge=`echo $hoge | gawk -F. '{print (($1*100+$2)*100)+$3}'`
foo=`echo $foo | gawk -F. '{print (($1*100+$2)*100)+$3}'`
if [ "$hoge" -gt "$foo" ]; then
echo "OK"
else
echo "NG"
fi
ピリオド区切りの数が固定(この場合は3)
ピリオド内の桁数が固定(この場合は1-2桁)
という条件付だけど。これらが不定なら、$1,$2,$3...を$iにして、
NFまでループさせればいいと思う
0086login:Penguin
2007/08/30(木) 07:19:55ID:QpfKAJKgoldv=1.11.12
newv=1.3.37
として
if [ `echo $newv -gt $oldv | sed 's/\.//g'` ]; then
echo OK;
fi
もしくは、
if [ `echo $newv.$oldv | tr . ' ' | xargs printf "%d%.3d%.3d -gt %d%.3d%.3d"` ]; then
echo OK
fi
あたりでどうかな。
0087login:Penguin
2007/08/30(木) 18:00:56ID:bHskgKzhrpmver ってのがある。
$ rpmver -v 1.3.37 1.11.12
RPM version 1.3.37 is lesser than version 1.11.12.
Vine,VineSeed の RPMS.main SRPMS.main にある。
他のディストリは知らないけど
パッケージが用意されてるかもしれない。
0088login:Penguin
2007/08/30(木) 23:05:03ID:nhWZyH15rpmver not found
うえーん。。。
0089login:Penguin
2007/08/31(金) 00:47:12ID:U99N+hxPLinux板だからbashでもいいよね。
#!/bin/bash
v2n () {
local IFS=.
set $1
echo -n $(($1 * 1000000 + $2 * 1000 + $3))
}
hoge="1.3.37"
foo="1.11.12"
echo $(v2n $hoge) $(v2n $foo)
if [ $(v2n $hoge) -gt $(v2n $foo) ]; then
echo "OK"
else
echo "NG"
fi
添削してぇ
009173ですが
2007/09/01(土) 22:39:45ID:uwRTp3HZ仕様はおっしゃるとおりです。
その際のスクリプトも教えてくだされば幸いです。
なお、他のスクリプトは現在のところ動作していません。わたしの知識不足なのだろうと思うのでもうすこし調べてみます。
#0は補ってはあるのですが...
ついでといってはなんですが、awkの本でおすすめの本などありましたら教えていただけませんか?
0092login:Penguin
2007/09/02(日) 04:19:30ID:WMH1r7G1オライリーの sed & awk
てかawkの本なんて何冊もないって。
0093login:Penguin
2007/09/02(日) 08:46:56ID:ToB27R8d大穴 awk 256 本
■ このスレッドは過去ログ倉庫に格納されています