1 名前:login:Penguin [2007/07/10(火) 23:17:13 ID:qGthZdME] UNIX板のスレを見ている方も多数おられるかと思いますが、 まあそれはそれとして、BASHウゼーとか言われる心配なく 平和にLINUX的スクリプト談義しましょうよ。 初めての自作スクリプト、自信ないから見てください。な初心者から トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで いろいろな人に参加して頂けると嬉しいです。 perlやらPythonやらの話が混ざっても良いんでない? 【sed】シェルスクリプト総合@LINUX Part2【awk】 pc11.2ch.net/test/read.cgi/linux/1154578200/ pc8.2ch.net/test/read.cgi/linux/1121994321/ >>2-5 あたりに色々と。
7 名前:login:Penguin mailto:sage [2007/07/14(土) 22:53:16 ID:29sQfd47] >>6 呼ばれるスクリプトの側でなんとかしたいってことなら 無理だよ。
8 名前:login:Penguin [2007/07/14(土) 23:13:50 ID:Lb+uQxni] >>7 そんな気はしていましたが、そうですか。。 残念です。
9 名前:login:Penguin mailto:sage [2007/07/14(土) 23:26:42 ID:29sQfd47] 呼ぶシェル側でなんとかするなら $ set -o noglob $ test.sh *.txt とか。
10 名前:login:Penguin [2007/07/15(日) 05:00:56 ID:OzInTFfn] >>6 test.sh '*.txt' (シングルコーテーションならてんかいされないはず)
11 名前:login:Penguin mailto:sage [2007/07/15(日) 11:22:44 ID:oGW94xFn] >2 おまけの関連スレ シェルスクリプト相談室 pc11.2ch.net/test/read.cgi/tech/1112553783/ awkについて語るスレ $2 pc11.2ch.net/test/read.cgi/tech/1172242542/
12 名前:login:Penguin [2007/07/15(日) 12:37:56 ID:llPpP8sT] >>8 よく仕様がわからんが、スクリプトの多段階呼び出しで展開されたくないんだったら、 $ test.sh @.txt みたいに、擬似ワイルドカード指定指定しておいて 使ううときに、 fs=`eco $1 | sed 's/@/*/'` echo $fs
13 名前:login:Penguin mailto:sage [2007/07/15(日) 22:24:45 ID:ZpXAubZ6] >>6 complete とかで、補完のルールを作れるんじゃないか? bashで補完スレ [UNIX板] pc11.2ch.net/test/read.cgi/unix/1013019416/
14 名前:login:Penguin [2007/07/16(月) 12:28:16 ID:MK2VLXxK] すみませんちょっとヘルぽ /homeの中にある複数のファイル・ディレクトリーをrm -rf したいのですが /home/hogeとlost+found だけは消したくないので 何とかそれ以外を消す方法をご教示頂きたいのですが おしえてたもれ
15 名前:login:Penguin mailto:sage [2007/07/16(月) 13:05:49 ID:fC+1yCpQ] >14 shell script関係ないが、lsでリストとって、リストから削除したくないファイル・ディレクトリを削除し、 その後 rm -rf `cat 〜` なんかするのが間違いなくて確実だとおもー。
16 名前:login:Penguin mailto:sage [2007/07/16(月) 13:13:37 ID:hTbLQxc+] >>14 bashだったら、GLOBIGNORE="hoge:lost+found" に賭けてみたまえ
17 名前:login:Penguin mailto:sage [2007/07/16(月) 13:32:26 ID:xW/HZyHj] /home/hogeとlost+foundに書き込み禁止属性をつけてから一気に rm -rf その後戻せばいいのでわ
18 名前:login:Penguin mailto:sage [2007/07/16(月) 21:41:14 ID:J/qZmNrt] >>14 ?!(xxx|yyy)
19 名前:login:Penguin mailto:sage [2007/07/17(火) 03:37:44 ID:I2w4SVYd] awk の出力をコマンドとして実行したいでつ。 どうやればいいでつか?
20 名前:login:Penguin mailto:sage [2007/07/17(火) 10:02:57 ID:ZxaQD0ZF] awk ... | sh
21 名前:login:Penguin mailto:sage [2007/07/18(水) 08:18:48 ID:Dw+iZryL] >>5 遅くなりましたが、ありがとうございます。 試してみたいと思います。
22 名前:login:Penguin mailto:sage [2007/07/18(水) 16:34:40 ID:cvC9pUm6] >>20 ありがとう。 できまちた。
23 名前:login:Penguin mailto:sage [2007/07/19(木) 07:38:39 ID:gg1Is+TJ] >>16 >>17 >>18 dクス とりあえず、試験機でゴリゴリしてみます
24 名前:login:Penguin mailto:sage [2007/07/19(木) 07:41:44 ID:gg1Is+TJ] あ、>>15 もdクスです その方法でやってみたいと思います
25 名前:login:Penguin [2007/07/20(金) 01:54:45 ID:bZea7ZdA] スクリプトに実行時間制限を設けたいんですが、いい方法はないですか? 厳密さは求めていません。暴走防止程度です。 (因みにLinux初心者のプログラマです、あまり複雑な概念は未だ理解できていないと思います。 今は大体こんな感じでやろうとしています、 (sleep 10; kill $$)& 時間制限を設けたいコマンド これだと、時間内に終了しなかったとき、スクリプトのみ終了し、実際に終了させたいコマンドは生き残ります。 時間内に終了したときにkillさせないために最後に kill `jobs -p` すると「(sleep 10; kill $$)&」は終了しますが、sleepだけが残ります(自然消滅はする だからといって kill 0 とするとこのスクリプトの呼び出し元まで死んでしまいます。 プロセスを kill するときに、その子も殺せればいいんですが如何でしょうか。
26 名前:login:Penguin mailto:sage [2007/07/20(金) 02:25:54 ID:zucTG+iZ] >>25 ps --ppid とか pstree -p とかで 子の pid を調べれば kill できると思う。
27 名前:login:Penguin mailto:sage [2007/07/20(金) 07:34:06 ID:0zbWXhyq] ulimit -tはだめ? CPU使った時間になっちゃうけど。
28 名前:login:Penguin mailto:sage [2007/07/20(金) 13:11:40 ID:VbE5NJtk] killのman見ればprocess groupを殺す方法書いてあるだろうに。
29 名前:login:Penguin mailto:sage [2007/07/22(日) 01:17:56 ID:MkzMxIYh] >>26 pstree -p からpidだけ取り出す方法が分かりません。 ps --ppid の再起で殺すようにしてみましたが思い通り動いてくれません。 間違えている可能性は大いにありますが。 >>27 CPU時間でも構いません。寧ろその方が良いかもしれません。 ありがとうございます。調べてみます。 >>28 でしょうね。
30 名前:login:Penguin mailto:sage [2007/07/24(火) 02:36:44 ID:TdZoIfh3] >>29 % pstree -p 親PID 親cmd(親PID)-+-子cmd(子PID) と表示されるんだから、 % pstree -p 親PID | perl -nle '/親PID\)[^\(]+\((\d+)\)/ && print $1' 子PID とならないかな?awkでもsplitを使えば同じようにできると思う。 そもそもperl使うならpstreeもkillも内部で呼び出せば済むけど。 それ以前にプロセスをアレコレする関数かmodがあるんだろうな...
31 名前:login:Penguin [2007/08/04(土) 23:01:23 ID:prsNz29A] awkの区切り文字に'|'を指定するにはどうすればいいですか awk -F'|' ではパイプとみなされてしまいます
32 名前:login:Penguin mailto:sage [2007/08/04(土) 23:37:42 ID:dhi36EzE] やってみた。 % echo 'a|b|c' | gawk -F'|' '{print $2}' b
33 名前:login:Penguin mailto:sage [2007/08/05(日) 03:46:06 ID:a+1tcmkL] >>31 -F'[|]' とか
34 名前:login:Penguin mailto:sage [2007/08/05(日) 23:10:51 ID:ftJrAaPL] 非rootのアカウントからシェルを実行して 規定のHDDをマウントしたいと思っています。 問題は非rootなのでmountの実行権が無い点です。 sudo は設定方法がよく分からないので、 もちょっと簡単なやり方ないかと探しているのですが 何かよい方法ないもんでしょうか? スクリプトの中でrootでログインして、そのまま 実行してほしい。(passwd入力はOK) ちなみにSuSE 10.2を使ってます。
35 名前:login:Penguin mailto:sage [2007/08/05(日) 23:39:27 ID:YQ3bjemY] >>34 sudo の設定くらいわかれ。 そんなに難しくないよ。
36 名前:login:Penguin mailto:sage [2007/08/06(月) 01:50:25 ID:xhWrZGpQ] sudo -u USER /dev/hd ... いかん、だるい。
37 名前:login:Penguin mailto:sage [2007/08/06(月) 02:18:34 ID:AKmvozj+] >>34 /etc/fstabの規定のHDDのエントリ内に user というオプションを書いておけば、 そこは一般ユーザでもmount/unmountできるようになる。 もちろんこの場合、mountコマンド自体のxビットは、一般ユーザが実行できるように 設定する必要がある。
38 名前:login:Penguin [2007/08/06(月) 22:17:00 ID:LTHEPNn8] テキストファイルが2つあると仮定して、(a.log、b.txt) a.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 などをしたい。
39 名前:login:Penguin mailto:sage [2007/08/06(月) 22:32:01 ID:kQOiX48t] $ cat b.txt | while read keyword; do grep -i "$keyword" a.log; done bshしか知らね。
40 名前:login:Penguin mailto:sage [2007/08/06(月) 22:50:29 ID:q2/C5Z+3] grep -f b.txt a.log
41 名前:login:Penguin [2007/08/09(木) 03:57:05 ID:q+NJZ5PJ] スクリプトの中から、 スクリプト自身のパスを知るにはどうすればいいですか?
42 名前:login:Penguin mailto:sage [2007/08/09(木) 06:28:33 ID:EHaDR+6/] echo $0
43 名前:login:Penguin mailto:sage [2007/08/09(木) 08:01:28 ID:NwjhxE+f] >>42 www.nurs.or.jp/~asada/FAQ/UNIX/section4.4.html
44 名前:login:Penguin mailto:sage [2007/08/09(木) 11:34:05 ID:EHaDR+6/] >>43 俺? $0で十分だと思うけど?
45 名前:login:Penguin mailto:sage [2007/08/09(木) 21:51:00 ID:8UsjPRp6] うわ。あさたくの文章、久しぶりに見た。
46 名前:login:Penguin mailto:sage [2007/08/10(金) 18:42:50 ID:hRezB52r] こんなの作った。 #!/bin/sh for i in "$@" do a="$(echo $i | nkf -w)" mv $i $a done convmv は元の文字コードを指定しなきゃならないのが面倒なので。 良かったらどぞ。
47 名前:46 mailto:sage [2007/08/10(金) 18:44:30 ID:hRezB52r] 書き忘れたので一応。 ./myconvmv.sh * とかで使える。
48 名前:38 mailto:sage [2007/08/11(土) 02:02:30 ID:h4twNLWe] >>39 >>40 できました。神様ありがとう。
49 名前:login:Penguin mailto:sage [2007/08/15(水) 18:16:19 ID:oxw3opBU] ・ファイルを指定フォルダ内へコピー ・同名ファイルが存在する場合は、 既に存在するファイル名を「ファイル名.1」へ変更し、 既にファイル名.1が存在しているのであれば、それをさらにファイル名.2へ変更し、、、(繰り返し) というコピーシェルスクリプトがほしいんですが、 簡単な記述方法などがあったらおながいします。
50 名前:login:Penguin mailto:sage [2007/08/15(水) 18:22:48 ID:vI6OWTR9] >>49 自分ではどこまでできたの?
51 名前:49 mailto:sage [2007/08/15(水) 18:30:05 ID:oxw3opBU] シェルスクリプト自体ほとんど作成経験がないので、 mv とかのオプションでそんな機能ないかな〜と 調べている程度の状態です。 -------------------------------------------------- ・同名ファイルが存在する場合は、 既に存在するファイル名を「ファイル名.1」へ変更し、 既にファイル名.1が存在しているのであれば、それをさらにファイル名.2へ変更し、、、(繰り返し) -------------------------------------------------- この部分を数行で教えていただけるとありがたいでつ。 ループ処理が必要になるのはなんとなく予想がつくのですが、、、
52 名前:login:Penguin mailto:sage [2007/08/15(水) 18:34:51 ID:vI6OWTR9] >>51 ファイルが何番まであるかを先にチェックして 番号大きい方から順に mv してくのが楽かな。 [ とか expr 使え。
53 名前:login:Penguin mailto:sage [2007/08/15(水) 23:30:14 ID:BP+0zqca] 番号をrotateすることに大した意味がないことに気付き、--backupオプションとかで安易に済ます。 そんな自堕落な道を私は選びました。
54 名前:login:Penguin mailto:sage [2007/08/16(木) 07:16:56 ID:D/eLf54Q] ディレクトリにあるすべての*.cファイルを 全部*.cppにするにはどういう風に書いたらよいのでしょうか? mv *.c *.cpp としてみましたがだめでした どなたかお知恵を...
55 名前:login:Penguin mailto:sage [2007/08/16(木) 07:57:42 ID:Uoi1O64b] rename コマンドで出来そうな気がする。
56 名前:login:Penguin mailto:sage [2007/08/16(木) 10:10:37 ID:MWEjh3WB] まあそうだけど。シェルスクリプトスレであることだし for f in *.c; do mv "$f" "${f}pp"; done
57 名前:login:Penguin mailto:sage [2007/08/16(木) 13:33:29 ID:D/eLf54Q] >>56 Thx,できますた!
58 名前:login:Penguin mailto:sage [2007/08/23(木) 16:17:17 ID:n9QZBMiJ] flashの動画をダウンロードできる シェルスクリプトある?
59 名前:login:Penguin mailto:sage [2007/08/23(木) 16:36:59 ID:lPn22JjI] kurekure厨
60 名前:login:Penguin mailto:sage [2007/08/23(木) 16:53:47 ID:C+I5hIDu] >>58 普通にwgetでダウンロードすればいいだけでは? youtubeから簡単に落としたいとかであればyoutube-dlとかが便利。
61 名前:login:Penguin mailto:sage [2007/08/24(金) 19:56:13 ID:k2Yrnokn] すごく基本的なことなんだろうけど、 いくつかのディレクトリの中にあるファイルのそれぞれの名前を変数に入れたいんだけど、 files=ls dir* | sort for i in files do done みたいなことは出来ませんか? 要するに標準出力する内容を変数に入れたいだけなんだけど。
62 名前:login:Penguin mailto:sage [2007/08/24(金) 20:25:50 ID:iKvrTLai] >>61 「コマンド置換」でぐぐってみ
63 名前:login:Penguin mailto:sage [2007/08/24(金) 20:43:22 ID:k2Yrnokn] >>62 理解できました。どうもありがとりんこです。
64 名前:login:Penguin mailto:sage [2007/08/26(日) 16:36:55 ID:sDCP6Pah] ファイル一覧だと長大になって溢れるので ls ... | sort | while read i; do echo $i; done とかも定番。
65 名前:login:Penguin mailto:sage [2007/08/27(月) 08:44:07 ID:mTK43/6/] for i in dir* do done sortを挟むのは良くわからんが、単純にこんなんで済む話じゃね?
66 名前:login:Penguin mailto:sage [2007/08/27(月) 18:32:24 ID:Vup2OsE3] >>64 それだとlsの時点ですでに溢れる
67 名前:login:Penguin mailto:sage [2007/08/27(月) 20:04:00 ID:5Y4ThyNx] find DIR -exec (ここで好きなことやれ) \;
68 名前:login:Penguin mailto:sage [2007/08/28(火) 00:17:04 ID:Gt/lw90m] /home/200708/1200・・・1300・・・1400/と100刻み1800までディレクトリーがあるとして A.PDFとかファイルが格納されてて 0KB〜150MBなら 「ne-yo」 500〜600MBなら 「OK」 とfile.txtを出力したいのでつが・・・・・ if,thenの繰り返ししかないでしょうかね?
69 名前:login:Penguin mailto:sage [2007/08/28(火) 00:58:46 ID:is4Tjxw4] なんのバイト数? そのディレクトリ内ファイルの総和?
70 名前:login:Penguin mailto:sage [2007/08/28(火) 08:13:17 ID:k11zEdxe] こんな感じ? $ du -s * | awk '{ print $2," ", ($1 > 10000 ? "ne-yo" : "OK") }' 条件文のところは自分で書き換えてくれ。
71 名前:login:Penguin mailto:sage [2007/08/28(火) 09:07:28 ID:LHhLJxDo] なるほどdu か。。。。と、>68とはちがう漏れ様が感心しますたーw
72 名前:login:Penguin mailto:sage [2007/08/28(火) 14:07:23 ID:LHPFC9xp] du 以外だと例えば何が?
73 名前:login:Penguin mailto:sage [2007/08/28(火) 16:21:13 ID: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でも構いません)で教えていただけるとありがたいです。
74 名前:login:Penguin mailto:sage [2007/08/28(火) 16:31:19 ID:kk6ZVe0N] >>73 つcsplit
75 名前:login:Penguin mailto:sage [2007/08/28(火) 22:47:28 ID:WiEkAmOg] cat /tmp/test.txt | gawk '/^# time = 0\.3/{exit} /^# time = 0\.2/{flag=1} flag==1 { str = str$0"\n" } END{print str}' こんな漢字か。酔っているので合っているのかどうだか。 0.000000...の部分は付け足してクレイ
76 名前:login:Penguin mailto:sage [2007/08/28(火) 23:05:57 ID:WiEkAmOg] cat /tmp/test.txt | gawk '/^# time = 0\.20+E-01 *$/,/^ *$/ {print $0}' あと仕様の意味が、#time=...から始まる一ブロックだけ出す(空行が出たらオシマイ) という意味ならもっと単純になる
77 名前:login:Penguin mailto:sage [2007/08/28(火) 23:48:14 ID:Gt/lw90m] >>70 すげーまさにOK!ですた! awk の ? と : の使い方に感動 >>71-72 ls -lh とかでやろうとしたのは漏れ様も同じww
78 名前:login:Penguin mailto:sage [2007/08/29(水) 12:08:46 ID:NEtL1MxO] >>74 >>75 さっそくにありがとうございます。 試してみます。
79 名前:login:Penguin [2007/08/29(水) 22:41:00 ID:4pERO676] 再帰的に2つのディレクトリをdiffしたいのですが存在するかしないか と違うファイルだということだけわかればいいので わかりやすく比較する方法はありませんか? diffのマニュアルみてもそれらしいのはないようで
80 名前:login:Penguin mailto:sage [2007/08/29(水) 22:50:35 ID:UIgvqpQI] >>79 diff -rq dir1 dir2 ではだめなの?
81 名前:login:Penguin mailto:sage [2007/08/29(水) 22:51:26 ID:N3MeiS9e] >>79 www.gnu.org/software/diffutils/manual/html_node/Comparing-Directories.html#Comparing%20Directories $ LANG=C diff -r dir1 dir2 | grep Only とかである程度分かるかも。
82 名前:login:Penguin mailto:sage [2007/08/29(水) 22:52:42 ID:N3MeiS9e] む、-qで違いが分かるのか orz
83 名前:login:Penguin mailto:sage [2007/08/29(水) 23:16:46 ID:9GyP78LH] デジャヴなんだが俺だけか?
84 名前:login:Penguin [2007/08/30(木) 01:02:14 ID: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
85 名前:login:Penguin mailto:sage [2007/08/30(木) 04:22:00 ID:GmS5dPb3] hoge="1.3.37" foo="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までループさせればいいと思う
86 名前:login:Penguin mailto:sage [2007/08/30(木) 07:19:55 ID:QpfKAJKg] そのバージョン表記の書式にもよるけど、 oldv=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 あたりでどうかな。
87 名前:login:Penguin mailto:sage [2007/08/30(木) 18:00:56 ID:bHskgKzh] >>84 rpmver ってのがある。 $ 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 にある。 他のディストリは知らないけど パッケージが用意されてるかもしれない。
88 名前:login:Penguin mailto:sage [2007/08/30(木) 23:05:03 ID:nhWZyH15] $ which rpmver rpmver not found うえーん。。。
89 名前:login:Penguin mailto:sage [2007/08/31(金) 00:47:12 ID:U99N+hxP] >>84 Linux板だから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 添削してぇ
90 名前:73ですが mailto:sage [2007/09/01(土) 15:15:18 ID:uwRTp3HZ] >>76 おくればせながらありがとうございました。
91 名前:73ですが mailto:sage [2007/09/01(土) 22:39:45 ID:uwRTp3HZ] >>76 仕様はおっしゃるとおりです。 その際のスクリプトも教えてくだされば幸いです。 なお、他のスクリプトは現在のところ動作していません。わたしの知識不足なのだろうと思うのでもうすこし調べてみます。 #0は補ってはあるのですが... ついでといってはなんですが、awkの本でおすすめの本などありましたら教えていただけませんか?
92 名前:login:Penguin mailto:sage [2007/09/02(日) 04:19:30 ID:WMH1r7G1] >>91 オライリーの sed & awk てかawkの本なんて何冊もないって。
93 名前:login:Penguin mailto:sage [2007/09/02(日) 08:46:56 ID:ToB27R8d] 本命 足立さんの訳してる awk 本 大穴 awk 256 本
94 名前:login:Penguin mailto:sage [2007/09/02(日) 20:47:44 ID:VmAuZafy] awk256倍はDOS時代からある骨董本で内容もふざけまくっているが、初心者が 「正規表現」「連想配列」という二つのキモを学習するにふさわしい内容。 読み終わったあとも、巻末の関数一覧がずっと使える。未だに刷を重ねてるけど 愛用者もおおいんじゃない? 大して御本家3人の書いたawk本は内容が高度な上に散発的で、調べたいことが すぐに出てこなくて使いにくい >>91 >>76 のがその仕様のスクリプトなんだけど。うまく動かないのは、スペースとかが ちゃんとコピペされてないからなんじゃないの?
95 名前:73ですが mailto:sage [2007/09/02(日) 21:37:03 ID:71yMDj2y] >>92-94 本の紹介ありがとうございました。 >>94 気づきませんでした。すいません。スペースの問題などを再確認してみます。 またなにかあったら伺うかもしれません。よろしくおねがいします。
96 名前:login:Penguin mailto:sage [2007/09/02(日) 21:40:05 ID:QLbcFUyG] DOS時代ってのはいつまでを言うんだ?
97 名前:login:Penguin mailto:sage [2007/09/02(日) 21:55:05 ID:ToB27R8d] awk 256 本の話の文脈としては、MS-DOS上のawk実装の時代かな
98 名前:login:Penguin mailto:sage [2007/09/02(日) 22:03:47 ID:VmAuZafy] >>97 そう。今の版じゃ改訂されてるのかもしれないが、俺の持ってるのだと gawkをDOSに移植したjgawkとかいうのを下敷きにしていて、中には486を乗せたキューハチだと スクリプトの速度が向上したとか、パイプの実行速度が遅いのはUNIXみたいな本物のパイプじゃないからとか、 そんな話題が満載
99 名前:login:Penguin mailto:sage [2007/09/02(日) 22:04:37 ID:QLbcFUyG] MS-DOS上のawk実装の時代ってのはいつを言うんだ?
100 名前:>>84 [2007/09/04(火) 00:34:58 ID:3rxVdbk9] おくらばせながら、ありがとうございますm(_ _)m
101 名前:login:Penguin mailto:sage [2007/09/06(木) 08:15:09 ID:33eRwNa2] 指定されたディレクトリ以下にあるディレクトリ一覧を返してくれるコマンドはありませんか? /data/ をTOPディレクトリとしますと /data/hoge/ /data/piyo/ /data/moge/ 等が帰ってくるコマンドです。で、この際 /data/hoge/direc/ みたいに、TOPディレクトリの 孫ディレクトリ以下は返さないで欲しいんです。TOPディレクトリの子ディレクトリのみを 返して欲しいのです。そして for TARG in command; do 処理; done のように for文で1つ1つのディレクトリを処理したいのです。 それからもう1つ、指定されたディレクトリ以下の子ディレクトリの数を返すには ls -l /data/ | grep ^d | wc -l でいいのでしょうか?ディレクトリだと ls -l した時に必ず最初が dから始まるので これでディレクトリのみがマッチして、後はwcでその行数を数えればいいかと思っているのですが 今の所これでちゃんと動作していますが、不具合が発生するようなケースは想定されますか? ディレクトリの数も孫ディレクトリ以下は数えません(再帰処理しない)。 昨日 basename と言う便利なコマンドを知った程度のレベルの人間ですので awk や sed 等の難しいコマンドはなるべく使わずに実現したいのですが、出来ませんかねぇ? 宜しくお願い致します。
102 名前:login:Penguin mailto:sage [2007/09/06(木) 08:27:57 ID:QTrKtnCG] >>101 ls -d /data/*/
103 名前:login:Penguin mailto:sage [2007/09/06(木) 08:30:08 ID:QTrKtnCG] /data/.x/ とかも考慮したいなら find で。
104 名前:login:Penguin mailto:sage [2007/09/06(木) 08:31:55 ID:33eRwNa2] >>102 あっちゃー・・・・そんな簡単なコマンドでこんな素晴らしい出力が得られるんですか! LinuxのCUIって本当に高機能ですね・・・素晴らしいです。本当にありがとうございます。 ls -l /data/ | grep ^d | wc -l ってやるより ls -ld /data/*/ | grep ^d | wc -l ってやる方が良いのでしょうか?どんなファイルやディレクトリがあっても確実に動作するような 書き方をしたいのですが・・・。
105 名前:login:Penguin mailto:sage [2007/09/06(木) 08:32:01 ID:QFjDOBHf] 属性が見えて良ければ ls -d /data/*|grep "^d"
106 名前:login:Penguin mailto:sage [2007/09/06(木) 08:33:56 ID:QFjDOBHf] -l忘れてた
107 名前:login:Penguin mailto:sage [2007/09/06(木) 10:26:24 ID:QTrKtnCG] >>104 > ls -ld /data/*/ | grep ^d | wc -l なんで grep するんだ?