- 1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その9 pc11.2ch.net/test/read.cgi/unix/1187130302/
- 724 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/21(月) 22:15:16 ]
- >>718
GNUコマンド群くらい最新にしとけよ。6.xなら使える。
- 725 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 02:59:08 ]
- >>724
バージョンアップできない(許可されない)環境って結構多いぞ。 (*nix系ならローカルに実行環境つくれば済む話だが)
- 726 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 07:04:01 ]
- >>725
もしそういう環境なら、GNU lsを入れること自体許可されないだろ。 (古いバージョンとは言え)GNU lsが入っているということは、 OS標準じゃないコマンドを自分でインストールしてもいい環境と考えられる。
- 727 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 10:39:16 ]
- システム構築時にGNU系を入れて構築、運用開始した後、
バージョンアップの費用(現システムの稼働確認費用)が認められないため、そのままってパターンが多い。 そういうトコだと、ローカルに新版lsをコピーしてくる方が(手続き的に)楽だったり。
- 728 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 12:30:34 ]
- >>710
タイムスタンプが、 2008-04-22 12:30 こういう形式で、 $6, $7にあると仮定すれば、 ls -l | sort -k 6,7 | sort -sr でいい。-sはstable sort。
- 729 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 13:27:05 ]
- >>728
それだと symbolic link が先頭に来てしまうので失格。
- 730 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 13:30:00 ]
- >>728
というか、せっかく sort -k 6,7 したあとで sort -sr したら 最初の sort -k 6,7 が無意味になってしまうし、全然ダメじゃん。
- 731 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 19:43:49 ]
- つ sort -srk 1,1
- 732 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/22(火) 19:58:42 ]
- >>731
>>729 失格。
- 733 名前:名無しさん@お腹いっぱい。 [2008/04/23(水) 15:40:13 ]
- Apache の mod_ext_filter モジュールを利用したスクリプトを作成しています。
Apache --標準出力--> script --標準出力 --> Apache を行うスクリプトにて、 Apache からの標準出力を $temp_file に書き出して主な処理をした後に cat $temp_file を行い Apache に返しているのですが、 #!/bin/sh temp_file=`mktemp` while read line do echo "$line" >> $temp_file done ファイル操作 cat $temp_file rm -f $temp_file 上記コードだと、HTML ソースに \ $ ` などが入っていた際に、 echo "$line" >> $temp_file で意図せぬ動作が起きてしまいます。 またファイルに書き出す事で処理速度の低下も考えられるので、 Apache からの標準出力(複数行)を変数に格納する方法はないかと思ったのですが、 どなたかご教授ください。
- 734 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/23(水) 20:08:40 ]
- >>733
それはシェルのreadの仕様だから仕方ない。 そもそも while readで読む必要ないだろ。 while do ... done の部分全部を、 cat > $temp_file に置き換えればよろし。
- 735 名前:733 mailto:sage [2008/04/23(水) 20:31:31 ]
- >>374
おぉ、色々と勘違いしていたみたいですね。 ご指摘の方法でやってみたところちゃんとできました。 すみません、ほんと有難うございます。
- 736 名前:733 mailto:sage [2008/04/24(木) 00:18:33 ]
- 733です。
度々すみません。 #!/bin/sh temp_file=`mktemp` cat > $temp_file ファイル操作 cat $temp_file rm -f $temp_file 確かにご教授いただいた上記コードで可能なのですが、 Apache からの標準出力をファイルに書き出さず、変数として処理する事は出来ないのでしょうか?
- 737 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 00:55:16 ]
- そんなに速度が気になるなら他の言語でやったほうがいい
- 738 名前:733 mailto:sage [2008/04/24(木) 01:45:55 ]
- >>737
ありがとうございます。 色々試行錯誤してみます。
- 739 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 06:52:22 ]
- >>736
その「ファイル操作」の内容が、 sed 's/hoge/boke/' < $temp_file だとすると、そもそもcatは2つとも要らない。 #!/bin/sh sed 's/hoge/boke/' ↑の2行だけでOK。 sedは、何も指定しないと標準入力から読んで標準出力に出すから。
- 740 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 06:56:05 ]
- >>736
一旦変数に入れたいなら、 tmp=`cat` とする。これで変数tmpに入る。 参照する時は、 echo "$tmp" とする。シェルに特殊文字を解釈されないように" "を付けるのを忘れないように。
- 741 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 19:36:45 ]
- >>739
返信ありがとうございます。 標準入力の内容によって条件わけがしたかったので、ご指摘の方法は断念しました。 >>740 返信ありがとうございます。おかげさまで出来ました。 一つ疑問が残るのですが、ダブルクォート (") は $ ` \ 以外を普通の文字として扱うと認識していますが。 # echo "`date`" Thu Apr 24 17:55:30 JST 2008 # cat sample.html <html> <body> `date` </body> </html> # cat filter.sh #!/bin/sh temp=`cat` echo "$temp" # cat sample.html | sh filter.sh <html> <body> `date` </body> </html> なぜ echo "$temp" では ` が普通の文字として扱われているのでしょうか? お恥ずかしい質問で済みません。
- 742 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 19:38:59 ]
- 変数、サブシェルなどの展開は一度だけ。
再度展開したい時はeval。
- 743 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/24(木) 20:15:21 ]
- >>742
eval をさっそく調べ、勉強になりました。 ありがとうございます。
- 744 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:26:56 ]
- 質問させてください。
シェルスクリプトで16進数を2進数に変換するにはどうしたらいいでしょうか?
- 745 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:49:57 ]
- どうしてもシェルスクリプトというならこんな感じか。
最適なのはbc。sedだけでもできる。 h2b() { for h in `echo $1 | sed 's/\(.\)/ \1/g'`; do case $h in 0) echo -n 0000;; 1) echo -n 0001;; 2) echo -n 0010;; 3) echo -n 0011;; 4) echo -n 0100;; 5) echo -n 0101;; 6) echo -n 0110;; 7) echo -n 0111;; 8) echo -n 1000;; 9) echo -n 1001;; a|A) echo -n 1010;; b|B) echo -n 1011;; c|C) echo -n 1100;; d|D) echo -n 1101;; e|E) echo -n 1110;; f|F) echo -n 1111;; esac done echo }
- 746 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 00:54:10 ]
- >>755
あ、どうしてもってわけじゃないです。 コマンドとかありますか?何度もすいません。
- 747 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:17:50 ]
- bcで16進数を2進数に変換。
できそうでよくわからない・・・orz
- 748 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:18:21 ]
- bcならこんな感じかな、便利だね知らなかったよ。
echo "obase=2; ibase=16; $1" | bc
- 749 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:32:27 ]
- >>748
ありがとう。しかしながら 例えば 0xffffff00 これを10進数に変換したいと思い echo "obase=10; ibase=16; 0xffffff00" | bc とやってみましたがsyntax errorがでました・・・orz
- 750 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 01:40:21 ]
- 頭に0xは付けずに,それから大文字で書かないといけないっぽい.
- 751 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 02:03:41 ]
- >>750
なるほど。ありがとうございました。
- 752 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 06:48:02 ]
- >>749
bcなんか使わなくても printfで一発だろww $ printf '%d\n' 0xffffff00 4294967040
- 753 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 08:48:45 ]
- んっと、釣られとくけど、
志村ー
- 754 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:18:18 ]
- >>753
なにが釣りなのかわからないゆとりな俺にkwskたのむ シェルスクリプトのtmtowtdiな感じって好きだ
- 755 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:28:34 ]
- printf(3)は二進がないからなあ。
printf(1)の%bは違う意味だし。
- 756 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 13:35:12 ]
- >>775
欲嫁。 >>749 は 16進→10進の質問。 >>752 はそれに最適解を答えている。
- 757 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:01:10 ]
- 昨日質問した者です。ちょっと間違ってました。ごめんなさい。
正しくは ffffff00 これを 255.255.255.0 に変換したい。です。 これってできるのでしょうか?
- 758 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:09:13 ]
- 簡単だね
>>757 $ hex=ffffff00 $ printf '%d.%d.%d.%d\n' `echo $hex | sed 's/../0x& /g'` 255.255.255.0
- 759 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/25(金) 22:57:09 ]
- >>758
すごいなぁ。ありがとう。
- 760 名前:名無しさん@お腹いっぱい。 [2008/04/26(土) 12:50:24 ]
- >>758 これは(・∀・)イイ!! もれももらた
- 761 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/26(土) 16:59:52 ]
- よく読まずに余計な突っ込みした >>753 は今ごろ赤面ww
- 762 名前:名無しさん@お腹いっぱい。 [2008/04/28(月) 17:23:56 ]
- >>761
kannke-nexekedo お前のレスうざい
- 763 名前:名無しさん@お腹いっぱい。 [2008/04/29(火) 09:04:12 ]
- シェルで、拡張子の付いていないファイルを一発でワイルドカード指定するには
どうすればいいですか? あるいは、何かのオプション変更とかで、 * で、hogeとかだけにマッチして、 hoge.hog にはマッチしないようにして、 *.* とやった時だけ hoge.hogにマッチするようにしたいんです。
- 764 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 09:43:06 ]
- 一部シェル限定ならできる
一発でなくていいならできるようにはできる
- 765 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 11:18:22 ]
- >>764
kwsk
- 766 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:33:12 ]
- >>764 は、具体的な「やりかた」を書かない(書けない)知ったかの
>>680 と同一人物、に1俵。
- 767 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:39:25 ]
- >>765
シェルは何だ? ワイルドカード使うシチュエーションは?カレントディレクトリだけなのか? ファイルの表示ができればいいだけなのか?各ファイルに何かするのか? >>766 あいにく違うな 1俵よこせ
- 768 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:43:35 ]
- >>767
じゃなくて、逆にその「できるシェル」を教えて欲しい。 シチュエーション関係なしに、すべての場合において * が hoge.hogにはマッチしないようにしたい。
- 769 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:46:16 ]
- EXTENDED_GLOBつきのzshで*~*.*かな。
- 770 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:55:22 ]
- * 1個の動作を変えられるようなシェルはないかと思う
同じくzshで setopt EXTENDED_GLOB ls -d [^.]#
- 771 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 12:57:46 ]
- command.com
- 772 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:01:56 ]
- 少なくとも >>766 だけうざいな
- 773 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:50:40 ]
- シェルを秘密にしたいのだからエスパースレに行くべきだな。
全ての場合を見通して答えてくれるエスパー様(>>766)に任せよう。
- 774 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 13:58:03 ]
- できるシェルを教えてくれっていう質問だから、
シェルを秘密にしてるのとは違うかと
- 775 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 20:45:09 ]
- よく読まずに余計な突っ込みした >>773 は今ごろ赤面ww
- 776 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:08:40 ]
- >>775
お前のレスうざい
- 777 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:32:45 ]
- OSを秘密にしているのだから、エスパー様の出番だな。
余計な突っ込みした、知恵足らずの>>775は今ごろ赤面ww
- 778 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:41:31 ]
- シェルはOSには依存しないな。
余計な突っ込みした、知恵足らずの>>777 は今ごろ赤面ww
- 779 名前:名無しさん@お腹いっぱい。 [2008/04/29(火) 21:43:02 ]
- > シェルはOSには依存しないな。
> シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。
- 780 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 21:54:17 ]
- まあよくある願望とごっちゃにしたな
- 781 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:04:17 ]
- たとえば最近の例を引き合いに出すが、
>>757 の質問(OS不明)に >>758 が的確に回答してる。 どこにもOSに依存してるところはないな。 >>757 に対して「OSが秘密じゃ答えられない」なんていってる奴は 無知をさらけ出してる奴。OSがわかったところで答えられないだろう。
- 782 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:06:52 ]
- 全然関係ない事例を持ち出して
> シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 > シェルはOSには依存しないな。 を誤魔化そうとする>>778憐れ。
- 783 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:08:34 ]
- 本件事例の
>>769 の回答は、OSには依存しないな。
- 784 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:17:34 ]
- 糞みたいな雑談でスレを延ばすなよ
コードで語れ
- 785 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:22:29 ]
- G Em7 Am7 Am7/D D7 G
- 786 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:23:36 ]
- >>769は誤回答。お題は「* で、hogeとかだけにマッチして、hoge.hog にはマッチしない」
- 787 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:25:33 ]
- OSに依存しない誤回答ですね。
- 788 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/29(火) 22:45:17 ]
- 誤解答を例示して
> シェルはOSには依存しないな。 を誤魔化そうと必死の>>778憐れ。
- 789 名前:名無しさん@お腹いっぱい。 [2008/05/02(金) 11:38:05 ]
- $ls
test1.jpg test10.jpg test2.jpg test3.jpg test4.jpg test5.jpg test6.jpg test7.jpg test8.jpg test9.jpg と1桁の数字からなる連番ファイルがあるときに $ls test0001.jpg test0002.jpg test0003.jpg test0004.jpg test0005.jpg test0006.jpg test0007.jpg test0008.jpg test0009.jpg test0010.jpg というように4桁の連番ファイルにリネームしたいのですが、 ご教授お願いします。
- 790 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:40:37 ]
- >>789
mv sed printf for これだけ調べればできる
- 791 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:41:07 ]
- 書き忘れた、
test10.jpg これ 1桁の数字じゃないよな
- 792 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:43:03 ]
- >>789
環境依存かつ汎用性ナシだけど、 おれならこうやっちゃう。 $ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done $ mv test10.jpg test0010.jpg
- 793 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:49:01 ]
- >>789
#!/bin/sh for file in *.jpg do num=`expr $file : '[^0-9]*\([0-9]*\)'` base=`expr $file : '\([^0-9]*\)'` num=`printf %04d $num` echo mv $file $base$num.jpg done
- 794 名前:789 mailto:sage [2008/05/02(金) 11:52:46 ]
- >>791
最初1桁の例だけ書いてたんで、 2桁も混じっているということを書き忘れました。 >>792 $ for i in {1..9}; do mv test$i.jpg test000$i.jpg; done $ for i in {10..99}; do mv test$i.jpg test00$i.jpg; done ってかんじですかね。ありがとうございます。
- 795 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:52:51 ]
- >>790
具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。
- 796 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:53:29 ]
- >>794
>>793
- 797 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:55:18 ]
- 3桁のときは、0を一つ、2桁の時は、0を2つ
一桁のときは、0を3つってつけてけばいいねん sedだけでできる
- 798 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:56:45 ]
- >>797
そんなことをしなくても >>793 で一発。
- 799 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 11:57:56 ]
- でしたね^^
解決したようで
- 800 名前:793 mailto:sage [2008/05/02(金) 12:09:21 ]
- sedだけでやるならこうかな
↓ #!/bin/sh for file in *.jpg do new=`echo $file | sed 's/[0-9]/0000&/; s/[0-9]*\([0-9][0-9][0-9][0-9]\)/\1/'` mv $file $new done
- 801 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:11:08 ]
- ごちゃごちゃしてるなぁ
- 802 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:13:48 ]
- そう思うならprintfの方がすっきりする
- 803 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:16:28 ]
- カレントディレクトリ配下で自分が所有者のファイルを探してすべて消したいのですが、
どのように書けばいいですか?
- 804 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:17:35 ]
- find . -user `whoami` -exec rm -f {} \;
- 805 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 12:18:06 ]
- ありがとうございます
試してみます
- 806 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/02(金) 20:11:05 ]
- >>795
> >>790 > 具体例を示さない奴は黙ってろ。あと、sedよりexprの方がいいな。 お前が真っ先に黙れ。
- 807 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 12:08:46 ]
- 若干スレ違いですが、
シェルスクリプラーなみなさんが詳しそうなので質問させてください。 unix,linuxで、 カーネルの脆弱性なんかでrootに権限昇格の可能性があるのって 特定コマンドを利用不可にしていたら難しい、 なんてことあるでしょうか? また、特定コマンドを利用した回数、利用したユーザ、 とか調べる方法ってないでしょうか?
- 808 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 13:02:50 ]
- つ BSD acct & lastcomm
- 809 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 13:55:52 ]
- >>807-809
具体例を出さない書き込みは禁止。
- 810 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:43:33 ]
- 若干どころじゃなくスレ違い。
- 811 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:47:30 ]
- 「シェルスクリプロ」って何ですか?
- 812 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/05(月) 15:57:16 ]
- シェルスクリプる
- 813 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 08:56:10 ]
- a 5 9 2
b 7 3 6 c 5 3 2 d 8 3 7 e 4 4 4 のようなテキストファイルから a 5 9 2 16 b 7 3 6 16 c 5 3 2 10 d 8 3 7 18 e 4 4 4 12 のように行の値の合計を右端に出力したいのですがどうしたらできますか? awk '{print $1,$2,$3,$4,$1+$2+$3}' のようにではなく、列の値の数が3でなくても対応できるようにしたいです。
- 814 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:01:46 ]
- >>813
簡単だね。 #!/bin/sh while read line do set $line shift sum=0 for i in "$@" do sum=`expr $sum + $i` done echo "$line $sum" done < file
- 815 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:20:27 ]
- 適当にがんばってみたらできたました。
ありがとうございました。 awk '{sum=0;for(i=1;i<=NF;i++)sum+=$i; print $"$i",sum}' test.txt
- 816 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:38:50 ]
- >>815
ちゃんと「シェルで」答えてくれた >>814 に礼もなしで 自己解決かよ。 しかも、awkでやるならスレ違い。awkスクリプトはシェルスクリプトにあらず。
- 817 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 09:41:33 ]
- おいおい、 >>815 の awkだと間違ってるぞ。
1列目の文字がたまたま数値的に 0 と評価されたら 結果的に正しく動いてるように見えるけど、 1列目に数値と解釈される文字があったらアウト。 このスレ的には >>814 が正解。
- 818 名前:名無しさん@お腹いっぱい。 [2008/05/06(火) 20:45:33 ]
- unix初心者ですが、シェルについて教えてください。
if文で、if〜then〜else〜endif を使用しています。 if文の判定は、ファイル有無の判定です。 判定対象のファイルを正規表現で記述すると、elseまで辿り着きますが、 メタキャラ"?"で判定すると、elseまで辿り着かず、 「照合パターンに合いません」 と出力され終了してしまいます。 シェルの構文は下記の通りです。 #!/bin/csh if ( -f /tmp/a?a.log ) then echo "ファイルが見付かりました" else echo "ファイルが見付かりませんでした" endif メタキャラを使用して、ファイル判定をする方法を教えて頂けませんでしょうか。 宜しくお願い致します。
- 819 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 20:50:12 ]
- >>818
cshでスクリプトを作ってはいけません。 どうしてもcshが良いなら独学でどうぞ。
- 820 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:05:42 ]
- >>818
#!/bin/sh if [ -f /tmp/a?a.log ]; then echo 'ファイルが見付かりました' else echo 'ファイルが見付かりませんでした' fi
- 821 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:15:22 ]
- #!/bin/sh
[ -f /tmp/a?a.log ] && { echo 'ファイルが見付かりました' } || { echo 'ファイルが見付かりませんでした' }
- 822 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:19:42 ]
- #!/bin/sh
s=; [ -f /tmp/a?a.log ] || s='せんで'; echo 'ファイルが見付かりま'"$s"'した'
- 823 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 21:27:57 ]
- s=;(</tmp/a?a.log)2>/dev/null||s='せんで';echo 'ファイルが見付かりま'"$s"'した'
- 824 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/05/06(火) 22:16:35 ]
- ゴルファーがいるw
|

|