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


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

シェルスクリプト相談室



1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ]
シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。 


369 名前:デフォルトの名無しさん [2006/11/04(土) 20:27:36 ]
微妙にスレ違いかもですが

あるファイルに対する処理をパイプで繋げて、
最終的に同名のファイルに書くのはアリなんでしょうか

cat hoge.txt | grep "foo" | uniq | sort > hoge.txt

現状動いてはいるんですが・・・

ちなみにbashです


370 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:33:13 ]
>>369
途中のコマンドがエラーを吐くと空になるが、いいのか?

期待通りに動いているのなら、アリではあるが
どこの環境でも動くという保証は無い。

俺ならいったん変数に入れてから書き出すかな。

a=`grep "foo" hoge.txt | sort -u`

if [ -n "$a" ] ; then
echo "$a" > hoge.txt
fi

371 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:35:18 ]
あ、よく考えたら uniq | sort と sort -u は違うな。
適当に読み替えてくれ。

372 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:37:33 ]
>>369
>最終的に同名のファイルに書くのはアリなんでしょうか
ダメ。


373 名前:デフォルトの名無しさん [2006/11/04(土) 23:26:40 ]
特定の時間帯のログだけ抽出したい場合ってどうしたらいいんでしょうか?


374 名前:デフォルトの名無しさん [2006/11/04(土) 23:29:03 ]
awk

375 名前:デフォルトの名無しさん [2006/11/05(日) 04:29:12 ]
PM18::00からAM1:00までの場合はどうすれば?

376 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:31:11 ]
ログファイルの仕様は?

377 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:34:07 ]
やりかたはログによる



378 名前:デフォルトの名無しさん [2006/11/05(日) 04:46:30 ]
2006/11/04,01:37:33,xxxxxxxxxxxxxxxxxxxxxxx
2006/11/04,02:37:33,xxxxxxxxxxxxxxxxxxxxxxx
2006/11/04,03:37:33,xxxxxxxxxxxxxxxxxxxxxxx
2006/11/04,04:37:33,xxxxxxxxxxxxxxxxxxxxxxx
2006/11/04,16:37:33,xxxxxxxxxxxxxxxxxxxxxxx
2006/11/04,21:37:33,xxxxxxxxxxxxxxxxxxxxxxx

こんなかんじ

379 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:52:32 ]
ぱっと思い付かないけど、俺ならperl使うかな。

ログをとる時間とタイミングが決まってるなら検討付けて
timeコマンドで1:00にtail -10とかでがばっと適当にログを切り出して保存する。

380 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:56:47 ]
>>378のフォーマットなら1行野郎でできる

awk -F '[,:]' '$2>=18||$2<1' logfile

381 名前:379 mailto:sage [2006/11/05(日) 05:24:52 ]
>>380
お前マジ頭いいな

382 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 10:47:41 ]
>>375
>PM18::00
それは一体何時なんだ?
もし、18時のことを書きたいなら6PMと書かないと意味が通じないわけだが。

383 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 10:48:59 ]
通じなくてよし

384 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:16:24 ]
なんか、awkの話になってるんで便乗で質問ですが

シェルスクリプトから

awk -f 手続きファイル 参照ファイル

とやって、-vでawkスクリプトに引数を渡してawk内で使用するのって具体的にはどうやればいいんですかね?



385 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:28:58 ]
・・・・・<dateAndTime>20061101130655</dateAndTime>・・・・・・・・・・・・・・・・・
・・<dateAndTime>20061101160213</dateAndTime>・・・・・・・・・・・・・・・・・
・・・・・・・・・<dateAndTime>20061101180159</dateAndTime>・・・・・・・・・・・・・・・・・
・・・<dateAndTime>20061102200159</dateAndTime>・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・<dateAndTime>20061103210159</dateAndTime>・・・・・・・・・・・・・・・・・
・・・・・・<dateAndTime>20061104220159</dateAndTime>・・・・・・・・・・・・・・・・・
・・・・・・・・・<dateAndTime>20061104131259</dateAndTime>・・・・・・・・・・・・・・・・・
・・<dateAndTime>20061104011359</dateAndTime>・・・・・・・・・・・・・・・・・
・・<dateAndTime>20061104052359</dateAndTime>・・・・・・・・・・・・・・・・・
・・・・・・・・・<dateAndTime>20061105062059</dateAndTime>・・・・・・・・・・・・・・・・・
・・・・<dateAndTime>20061106072159</dateAndTime>・・・・・・・・・・・・・・・・・
・・・<dateAndTime>20061106114359</dateAndTime>・・・・・・・・・・・・・・・・・
・・・<dateAndTime>20061107221359</dateAndTime>・・・・・・・・・・・・・・・・・
・・・・・・<dateAndTime>20061108230559</dateAndTime>・・・・・・・・・・・・・・・・・

ログがタグ形式で、こんな感じだったらawkではどうする?

386 名前:明日まで [2006/11/05(日) 14:36:03 ]

こういうシェルを私みたいな女の子にも理解できるように解説してよ


引数付(1〜5)で実行したshellが何を引数として入力
  したかを,switch文を使って表示させたい。。

【その1】引数無し、もしくは引数が1〜5以外の場合
% ./test.sh
Invalid number.
%

【その2】引数が1〜5の場合
(5を入力した場合)
% ./test.sh 5
You have imput 5.

387 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:52:33 ]
>>384
たぶん勉強すればどうにかなるんだろうけど、
awkで引数に関することでごにょごにょするのがめんどくなったのでPerlに移った。
awkは短い命令やパイプラインで使ったりはするけど、引数でごにょごにょするのは
Perlでやることにした。

>>



388 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:55:02 ]
>>386
case文でnull,$1〜$5までのケース書いて、その他は(*にでも書けば良いじゃん

389 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 15:30:16 ]
>>384
別にawkに限った話じゃないので、普通に引き数で渡せば宜しい。
後は、awkかnawkかgawkか、変数定義かARGVを使うかの違いがあるだけ。

>>385
外部プロセスでsedを呼んで処理するか、awkを呼び出すシェルスクリプト側でsedを呼んで処理する。

390 名前:デフォルトの名無しさん [2006/11/05(日) 20:52:42 ]
誰かこのシェル作って
今日中にやらないといけないんです、お願いします。

引数付(1〜5)で実行したshellが何を引数として入力
  したかを,switch文を使って表示させたい。。

【その1】引数無し、もしくは引数が1〜5以外の場合
% ./test.sh
Invalid number.
%

【その2】引数が1〜5の場合
(5を入力した場合)
% ./test.sh 5
You have imput 5.


391 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 22:22:18 ]
シェルスクリプトの中身↓

awk -f xxx.awk -v awkNoHensu=${shellNoHensu} aaa.txt


xxx.awkの中身↓

{
print ${awkNoHensu}
}

awkってよくわかんないけど引数ってこんなかんじでいけるのかな?
横レスですが、外部プロセスでsedを呼ぶってひょっとしてsystemコマンド(system関数)?

392 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 23:29:32 ]
awkはCのpopen()相当をかなり変態的かつシンプルな形で表現できる。
Ex.
--
#!awk -f
BEGIN {
if (ARGC > 1) {
cmd = "wc -l " ARGV[1];
cmd | getline fileLineCnt;
close(cmd);
}
}
{
if (fileLineCnt) {
printf("%d/%d %s\n", NR, fileLineCnt, $0);
}
}
--
sedで前処理するのも、これと同じ要領。

393 名前:392 mailto:sage [2006/11/05(日) 23:33:02 ]
おっと、折角だから最後のブロックを訂正。
--
{
if (fileLineCnt) {
printf("%d/%d:", NR, fileLineCnt);
}
print;
}
--
これでコマンドライン引き数がないときはただのフィルターになる。
#>392のは引き数がないと何もしなかった。

394 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 02:23:46 ]
>>391

awkスクリプトの中で参照するときに$つけなくてもよい。つかつけちゃダメ。
$つけたらフィールド参照になっちゃうから。

awk -v foo=ほげほげ ...

で渡したのなら、単に foo で参照できる。


395 名前:デフォルトの名無しさん [2006/11/06(月) 17:18:33 ]
grepでは1行が2048バイトの制限がありますが、
awkやsedの制限はどうなっているのかどなたか教えてください


396 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 20:23:22 ]
知らない。不安なら perl 使っとけ。メモリの続く限り無制限だから。


397 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 22:09:24 ]
2048バイト制限のあるgrepって、どのgrepのこと?




398 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 00:30:09 ]
>>392
それはawk -v で引数を渡せばいいですか?

399 名前:392 mailto:sage [2006/11/07(火) 03:18:46 ]
めんどくさい香具師だなぁ。
>393のスクリプトにfooとでも名づけて実行ビット立てたら foo foo とでもして味噌。

400 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 23:31:42 ]
>>395
sedにも制限あったはず。それでperlにしたことがある。
てか試せ

401 名前:デフォルトの名無しさん [2006/11/07(火) 23:49:35 ]
>>391
awkに-vでシェルの変数を引数で渡す場合、BEGIN内でしか参照できないからあんまり意味ないですよー
嘘言ってたらごめんなさい

402 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 00:30:45 ]
>>401
ぇ…(´Д`υ)
% awk -v foo=hello 'END { print foo }'
^Dhello
%

403 名前:デフォルトの名無しさん [2006/11/08(水) 01:25:16 ]
−−−−−−−−−−−−−−−
BEGIN{}

/○○/{

print$1



END{}
−−−−−−−−−−−−−−−


○○のところにシェルから持ってきた変数って使えますかね?
使えたら変数によって検索条件を変えられるんでawk最強って話になるんですが。

404 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 01:41:35 ]
例えば,↓のようにできる

% cat emp.data
Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
% awk -v name=Kathy '$1 ~ name { print $2 }' emp.data
4.00
%

405 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 01:50:47 ]
>>395

GNU sed とか gawkなら多分制限はない(メモリの許す限り)。
SUSv3をみたところ、OSごとに一行の最大の長さを定義している
LINE_MAX という定数があって、そこまでは使えることが保証
されているだけみたい。

で、FreeBSDとSolarisはこのLINE_MAXは2048バイトのようだ。


406 名前:403 [2006/11/08(水) 02:00:33 ]
テキストをawkでカンマ区切りなどに成型した後ならそれはかなり使えそう技ですね。
しばし感心してしまいました。

でも、仮に以下のような感じのデータだったらやっぱできないんでしょうかね?
行にある、特定の文字列だけにヒットするような感じで。
たとえば/○○/のところに、BOOという引数を与えて、BOOを含む行だけ検索して特定の処理をするみたいな?

TXT
−−−−−−−−−−−−−−−
AAAAADSLADLAS
UEJNDNKA
KDJSALJDLKSA
HHHHHBOOA+aDSA
DSKAJDKASL
DSKLA+KDAS
−−−−−−−−−−−−−−−

AWK
−−−−−−−−−−−−−−−
BEGIN{}

/○○/{

何かしらの処理



END{}
−−−−−−−−−−−−−−−




407 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 02:07:10 ]
>>406
awk -v pattern=BOO '$0 ~ pattern { print }'



408 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 13:59:33 ]
>>403
そんなもんこうやって無理矢理やってしまえばできる。

awk '/'"$x"'/{ ... }'


409 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 21:08:39 ]
つうかもうちょっとawkを勉強して、試した上で聞けよな・・

410 名前:デフォルトの名無しさん mailto:sage [2006/11/09(木) 22:19:29 ]
>>409
でも、Awk神がいるからか、
最近のこのスレの話の流れはなかなか為になってるよ。
まあ、シェルはある程度分かるが、
長年Awkを馬鹿にして敬遠してきた俺から言わせてもらえばだけどね。
んで、このスレ読んでAwkでも勉強してみようと思い立ち
オライリーの書籍を注文してしまったw
今思えば、俺が今まで仕事でやってきた案件なんぞ
PerlやRuby使うまでもないことばっかりってことが判明してちと鬱だがね・・・orz...

411 名前:デフォルトの名無しさん mailto:sage [2006/11/09(木) 22:25:23 ]
ファイル処理に便利だしね
シェルスクリプト作ってた筈なのに
気がつくとawkとsedの処理が8割だった事がある


412 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 00:34:43 ]
下手な文字列処理なんかだと、Cで書くよりよっぽど早いしメンテナンスしやすいからな。

413 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 13:50:16 ]
うちの高専で半年くらいawkばっかりやらせてた測量学の教官がいた

414 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 13:53:17 ]

授業で

415 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 15:36:22 ]
ときどきでいいのでawkスレのことも思い出してあげてください。

pc8.2ch.net/test/read.cgi/tech/1023556171/

416 名前:デフォルトの名無しさん mailto:sage [2006/11/12(日) 16:23:26 ]
>>410
「一寸、微笑ましい」という本心をコメントする。

417 名前:デフォルトの名無しさん [2006/11/13(月) 17:30:40 ]
>>380
23:15〜03:15とか
04:30〜9:30とか
分の単位がある場合でも
一行で簡潔にかけたりする?




418 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 19:14:24 ]
>>417
awk -F '[,:]' '$2$3>="2315"||$2$3<"0315"' logfile

awk -F '[,:]' '$2$3>="0430"&&$2$3<"0930"' logfile

419 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 21:42:59 ]
>>417
$2>=23&&$3>=15||$2<2||$2<3&&$3<15
こんな感じの書き方をすりゃいいんでないの?とアドバイスをしようと思ったら
>>418がなんかすごい技を繰り出してて…恥ずかしくなってきた罠。

420 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 21:59:53 ]
>>412
AWKの文字列処理ってCより速いの?

421 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:18:38 ]
>418
-F ×
-f ○


422 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:56:55 ]
>>421
been opened if it were a file name. The option -v followed by var=value is
an assignment to be done before prog is executed; any number of -v options
may be present. The -F fs option defines the input field separator to be
the regular expression fs.
/usr/share/man/cat1/awk.1 line 26/250 (11%)

423 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 23:05:47 ]
>>421
コマンドラインで FS の設定をしてるから間違っとらんよ。

424 名前:デフォルトの名無しさん [2006/11/13(月) 23:38:44 ]
リストファイルから一行ずつパターンを読み込ませて
テキストファイルを一行ずつパターン検索したいんですが
awkでファイルから入力する方法ってありますか?


425 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 23:51:26 ]
getline関数は現在の入力ファイルから次の入力レコードを $0 に代入する。
getline < file は file から次の入力レコードを $0 に代入する。
getline x は変数 x に代入する。
cmd | getline は cmd の出力を getline にパイプする。
getline は入力が成功すると1,ファイルの末尾で 0,エラーで -1 を返す。

426 名前:412 mailto:sage [2006/11/13(月) 23:56:23 ]
>>420
「速い」じゃなくて「早い」だ。つまり、どっちが早くプログラミングできるかってこと。

427 名前:デフォルトの名無しさん [2006/11/13(月) 23:57:53 ]
変数を受け取って、一連の処理を行うようにしたコマンドの羅列だろ。
ひとつずつコマンドを打ち込んで処理するのが面倒くさいから
判定とか分岐とか呼び出しとかを使って、処理自体を複雑・多様化するようにしたんだろ。
更に、ひとくくりの処理を名前を付けて登録できるから、コマンドはそれひとつで
自分で組んだ複数の処理をしてくれる。

基本的に古臭いものだし、フロントエンドを設けてGUI化したのを
使うのが最適だと思うのに、何故に今更ながらのコマンドシェルなんだ?

馬鹿?



428 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 00:08:47 ]

〃∩ ∧_∧
⊂⌒( ・ω・)
 `ヽ_っ⌒/⌒c   はいはいわろすわろす
    ⌒ ⌒

429 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 07:07:15 ]
>>424
同じファイルの次行レコードをgetlineで読めるはずだけど
処理中に別ファイルは読めないんじゃないかな
fopenとかないし引数とらせるとかなら方法あるかもな

430 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 07:37:30 ]
>>429
>425

431 名前:デフォルトの名無しさん [2006/11/14(火) 19:44:15 ]

パターンファイルに一致するレコードを削除したいのですが、どうやったら実現できるでしょうか?
シェルでもアークでも構いません。御指南下さい。

テキストファイル(テキスト.txt)
20061110,AAA
20061111,BBB
20061112,CCC
20061113,DDD







パターンファイル(パターン.ptn)
AAA
CCC
GGG

432 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 19:45:09 ]
>シェル
失せろ

>アーク
消えろ

433 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 20:35:18 ]
% cat foo.awk
BEGIN {
    while (getline < ptn == 1)
        pattern[n++] = $0
}

{
    for (i = 0; i < n; i++)
        if ($0 ~ pattern[i])
            break
    if (i == n)
        print
}
% awk -f foo.awk -v ptn=pattern.ptn text.txt
20061111,BBB
20061113,DDD
20061114,EEE
……

434 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 20:51:08 ]
grep -v -f パターン.ptn テキスト.txt

435 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 21:52:58 ]
>431
アークじゃないよ。
オークって読むよ。


>433
awkって何でもできるんだな。

436 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 22:07:46 ]
>>415にも書いてるけどawkスレも使ってやってください。
awkについて語るスレ
pc8.2ch.net/test/read.cgi/tech/1023556171/

437 名前:デフォルトの名無しさん [2006/11/14(火) 23:03:02 ]
>>433
オークってよむんですか。
ありがとうございます。



438 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:37:29 ]
bashなんですが、daemonの起動スクリプトとかで
変数にブレースがついてたり、ついてなかったりするのは
どういう意図があるの?

439 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:58:40 ]
>>438
1. 変数と文字列を明示的に区切りたいから
ex) ${foo}bar

2. ブレース展開を使っている
ex) ${foo%.*}

3. ただの気まぐれ

440 名前:デフォルトの名無しさん [2006/11/16(木) 00:52:32 ]
getline 変数 で、次のレコードを読んで変数に代入になると思いますが、
更にgetline 変数を使うと更に次の行が読み込まれるのでしょうか?
そのあとawk処理を終えて次のレコードをawkが読みに行ったとき、getlineの影響を受けて読んでいる行が進んでしまいますか?

AWKスクリプト

getline A
PRINT A
getline A
PRINT A


読み込みファイル
AAAAA
BBBBB
CCCCC
DDDDD

出力結果はこう?
AAAAA
BBBBB
CCCCC
DDDDD

出力結果はこう?
AAAAA
BBBBB
BBBBB
CCCCC
CCCCC
DDDDD

441 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 00:57:16 ]
やってみればいいじゃん。
つーか、シェルからの起動も絡まないawkの話はawkのスレでやれよ。

442 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:02:20 ]
スレ名変えればいいだろ、

【シェルって】サーバ用途のスクリプト【貝殻?】

443 名前:デフォルトの名無しさん [2006/11/16(木) 01:07:00 ]
sedなんかを使って特定のタグで囲まれたところを出力することって可能ですか?

sdak;dkslakdas;das<TAG>dkalkdlas;kdsla;kds;akdsal;dkslad;</TAG>dlaskldkalsfocmdcsdlc,ds



444 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:12:20 ]
行内に開始タグ終了タグが1セットだけあるなら、
sed -ne 's/<TAG>\(.*\)<\/TAG>/\1/p'

445 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:14:40 ]
>>441
たとえば>433のawkスクリプトでやってることをシェルスクリプトで実現したらどうなるかとかってのを
>441自身が率先してレスしてやるとかすればこのスレももっと進歩するんじゃないの?
絡まない話と切って捨てるのではなく絡める努力なんてこともしてみたらいかがか?

446 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:20:07 ]
AwkにはSYSTEM関数もあるし
UNIXのコマンドも使えちゃうので
必ずしも無関係とは言えないか

447 名前:デフォルトの名無しさん [2006/11/17(金) 00:46:21 ]
寂しいスレになったね。



448 名前:デフォルトの名無しさん [2006/11/28(火) 00:16:29 ]
あるファイルの一部(何行もある)を違うファイルに書き換えるのはどうやるの?
例えば、

aaa aaa aaa
aaa aaa aaa
abc 1 2
abc 3 4
bbb bbb bbb

というファイルを

abc 1 10
abc 3 20

と言うファイルを使って

aaa aaa aaa
aaa aaa aaa
abc 1 2 10
abc 3 4 20
bbb bbb bbb

にしたいんだけど。。
どえらく行があって普通にsedの置換する行を書かせて実行したら
一日で終わらないくらい時間がかかってしまって。。。
もしくは、行単位で置換じゃなくて、数行単位で置換は出来ないのでしょうか?

偉い人教えてください。

449 名前:デフォルトの名無しさん [2006/11/28(火) 02:05:01 ]
>>448
正直説明が分かりづらいです。
というか全くわかんない。
ちゃんと質問した方が良い。
その質問じゃ法則がいまいちわからない。

ファイルの一部を違うファイルに書き換える??
catとか使って結合したらいかが?

450 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 02:11:28 ]
マルチ乙

451 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 11:34:00 ]
>>448
それはスペース区切りで先頭の項目をキーにして残りのデータは重複なしで
マージするという処理をしたいということか? あれ? でも、 aaa とかは
元から重複してるな。

駄目だ。やっぱ法則が分からん。


452 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 14:02:55 ]
>>448

二つのファイルを第1フィールドと第2フィールドを“,”とかでくっつけて
(それぞれ test1.txt, test2.txt とする)、join(1) する:

 join -a1 test1.txt test2.txt

最後に“,”を削る。

それか、awk の連想配列を使って join する。

453 名前:デフォルトの名無しさん [2006/11/28(火) 23:56:25 ]
回答ありがとうございました。
分かりずらかったかと思いますので再度書き込ませてください。

一連の序列が混ざったファイルがあります。
例えば、
aaa bbb ccc ddd
.
ccc ddd eee fff
.
こんな感じの序列が続いた後に
linux 123 987 786 0
linux 123 903 673
linux 123 876 986 0
.
linux 234 983 934 0
linux 234 073 345 0
.
linux 345 093 945 0
linux 345 495 384
.
xyz abc def ghi
xyz ade dfe sdg
.
となっていて変えたいところはlinux〜です。

454 名前:デフォルトの名無しさん [2006/11/28(火) 23:57:11 ]
ここの行を
linux 123 987 786 22
linux 123 903 673 22
.
linux 234 983 934 85
linux 234 073 345 85
.
linux 345 093 945 45
linux 345 495 384 45

としたいのです。
最後の0はあったりなかったします。
最後の行に各々の22,85,45を追加(または0を置換)したいのです。
2列目は123,234,345のようにまとまりがあります。
あとはランダムです。
存在するファイルは
123 22
234 85
345 45
.
というファイルです。

455 名前:デフォルトの名無しさん [2006/11/28(火) 23:59:27 ]
自分は一行ずつ置換するためsedを作成するためのプログラムを作成しました。
ですが、数が一万行を超えるので、一日ではとても終わらないものになりました。
ファイルを分割してlinuxを含まない上下のファイルをとっておいて、
置換ではなくてlinux〜のファイルを作ってしまいcatで付けようとか考えていますが、
cutとかで分割する際にそんな指定って出来るんでしたっけ?
質問ばかりですいません。
宜しくお願いします。

456 名前:デフォルトの名無しさん [2006/11/29(水) 00:10:55 ]
追加ですが、
linux 123 987 786 22
linux 123 903 673 22
.
linux 234 983 934 85
linux 234 073 345 85
.
linux 345 093 945 45
linux 345 495 384 45
というファイルは作成出来るのですが、
これを元のファイルに反映させたいです。
手動でやるしかないですかね。。。

457 名前:デフォルトの名無しさん [2006/11/29(水) 00:21:19 ]
元ファイルをtest1.dat 参照ファイルをtest2.datとして
join -a1 -o 1.1 1.2 1.3 1.4 2.2 test1.dat test2.dat
とすればいいですかね。。。
joinは使ったことが無いので分かりませんが。。。



458 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:07:28 ]
例示ばかりで、肝心の変換のための法則について
何も書かれちゃいねぇ!

「変えたいところは」「ここの行を…としたい」
「あったりなかったりします」

場所と結果だけ示されてもねぇ。。

459 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:12:43 ]
ここはこうだから、これをこれと入れ換えます。
という説明はできないもんだろうか。

関係ないけど先日会社に面接に来た香具師。
「自己アピールは大切ですから」と言いつつ何ら具体的なことは何も言わないで帰った。
要は、客観視できていないし説明することもできないらしい。
#そのくせ、ランバ・ラルの台詞を語ってはいたのだが。

460 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:17:11 ]
何か耳が痛いな。

461 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 08:23:42 ]
言語機能の差が、スクリプト処理の決定的差ではないという事をおしえてやる

462 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 11:23:46 ]
1万行の処理なんて一瞬で終わると思うんだが……
仮に行数Lに対して実行時間が O(L^2) だとしてもちょっと待てば終わるくらいだと思

463 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 12:06:13 ]
すごい遅いマシン使ってるのかな?

464 名前:デフォルトの名無しさん mailto:sage [2006/11/29(水) 17:32:54 ]
シェルスクリプトじゃないけど。awkでやってみた。
BEGIN{
while(getline<ARGV[2]){
cv[$1]=$2;
}
ARGV[2]="";
}
$1=="linux"{
$5=cv[$2];
}
{
print;
}


465 名前:デフォルトの名無しさん [2006/12/05(火) 21:39:41 ]
csh で if($hoge == hoge) とかやったばあい、
$hoge が -f などの場合
ファイルに関する演算子の -f とみなされて
比較してくれません。
こういう場合、どうすればいいのでしょうか?

466 名前:デフォルトの名無しさん mailto:sage [2006/12/05(火) 22:17:11 ]
あ、適当な文字を両辺の先頭に付ければいけますね。
何か格好悪いので、もっといい解決法があればよろしくお願いします。

467 名前:デフォルトの名無しさん [2006/12/06(水) 22:42:36 ]
ファイル名の拡張子より前の名前を抽出するシェルを作っています。
例えばtest.shであれば

ls test.sh | awk -F '[.]' '{print $1}'
でtestと出力が得られるのですが、もしファイル名がtest_1.00.shの時は
test_1
のような出力になってしまいます。

awkの$NFで拡張子のshは得られるのですが、
$NF「以外全て」を出力を得るにはどのようにすればよいでしょうか?



468 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 22:48:02 ]
>>467
man basenameでだめなんか。
それから、シェルスクリプトのことをシェル呼ぶなってば。

469 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 22:49:51 ]
シェルスク?
シェクリ?
ルスクリ?

470 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:02:51 ]
>>468
できますた。
ありがとうございました。

471 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:13:44 ]
>>467
awkでやるなら
jgawk -F. "{print jsubstr($0,0,jlength($0)-jlength($NF)-1)}"
でどう?

472 名前:デフォルトの名無しさん mailto:sage [2006/12/06(水) 23:28:06 ]
>>471
試してみたのですが残念ながら、現在の環境ではjgawkというのが入ってないみたいです…
basenameはcaseで知ってる拡張子を洗いざらい場合分けするスクリプトかいて処理しました。
(txt f90 c c++ java shなど)

jgawkのインストールについて調べてみます

473 名前:デフォルトの名無しさん [2006/12/06(水) 23:29:05 ]
c++じゃなくてcppだった…

474 名前:デフォルトの名無しさん [2006/12/06(水) 23:34:47 ]
ちなみにローカルな目的は、
a2psを使ってpsファイルを作る事でした。

a2ps test1.00.sh -o test1.00.ps

拡張子を取り除いてpsの拡張子を付けるためのスクリプトを作る方法を考えていました。
basename&case文で対応はできたのですが、jgawkというのが使えるのであれば
より汎用性のあるスクリプトができそうですね。

475 名前:デフォルトの名無しさん [2006/12/06(水) 23:40:59 ]
ちなみに、gawkはありましたが
$ gawk -F. "{print jsubstr($0,0,jlength($0)-jlength($NF)-1)}" test1.00.sh
gawk: cmd. line:1: (FILENAME=test1.00.sh FNR=1) fatal: function `jsubstr' not defined
でした。

476 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:01:50 ]
>>475
jgawkのjはJapanese(日本語)のj、
jlengthやjsubstrのjも同じ。
データーに日本語が入ってないならjは除けていいよ。


477 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:27:39 ]
>>467
Solaris のawkみたいに腐ったやつだとわからないけど、gawkなら
NF--; print $0
で取れないか?




478 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 00:33:01 ]
>>477
jgawkでやったら
aaa.bbb.ccc.dddが
aaa bbb cccになった。

479 名前:デフォルトの名無しさん [2006/12/08(金) 01:05:00 ]
NFってなに?
Systemコマンドの使い方教えて

480 名前:477 mailto:sage [2006/12/08(金) 01:21:03 ]
>>478
スマソ。OFSを設定してクレイ。
gawk -F'[.]' -v OFS='.' '{NF--; print}
あたりでよろしこ。



481 名前:デフォルトの名無しさん [2006/12/13(水) 21:04:58 ]
shellってすごいね

482 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:27:33 ]
#!/bin/sh
dump -0f /path/to/hda1.dump /dev/hda1
dump -0f /path/to/hda2.dump /dev/hda2

このスクリプトを実行して、hda1の実行途中でCtrl+Cを押したら
hda1は終了するけど次行のhda2のバックアップが開始されます。
スクリプト自体を終了するにはどうしますか?

483 名前:デフォルトの名無しさん [2006/12/24(日) 10:47:11 ]
>>482
dump は使ったことないので、勘ですが
dump -0f /path/to/hda1.dump /dev/hda1
if [ $? -ne 0 ]
then
dump -0f /path/to/hda2.dump /dev/hda2
fi
じゃ、だめですか?

484 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 12:55:55 ]
#!/bin/sh -e
dump -0f /path/to/hda1.dump /dev/hda1
dump -0f /path/to/hda2.dump /dev/hda2


485 名前:デフォルトの名無しさん [2006/12/26(火) 23:54:08 ]
sedで-dオプションを使って、特定の文字列がヒットした時に、
その行を削除したいのですがうまくいきません。
manpageみても使い方がよくわからず、困り果てております。
どうやって使えばいいかご教授お願いします。

486 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 23:58:45 ]
>>485
-dオプション???

単純に行削除だけなら例えば以下のように。
--
sed -e '1,5d' #最初の5行を削除
sed -e '/pattern/d' #patternを含む業を削除

487 名前:デフォルトの名無しさん [2006/12/27(水) 06:42:35 ]
>>486

使い方思いっきり間違ってました
ありがとうございます
助かりました



488 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 17:11:03 ]
てか、パターンを含む行を削除したいだけなら grep -v でやれば良い。


489 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 01:09:04 ]
きっとgrepでは業(カルマ)を削除できないのだろう。

490 名前:デフォルトの名無しさん [2006/12/29(金) 16:00:50 ]
sedでレコードのor検索やand検索ってできますか?


491 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 16:12:11 ]
RDBでいうレコードの概念は、区切り文字とのパターンマッチでおおよそシミュレート可能。
その上で、パターン/X/と/Y/のandは/X/{/Y/}で、orは
/X/...
/Y/...
でシミュレート可能。

492 名前:デフォルトの名無しさん [2006/12/30(土) 12:08:44 ]
例えばレコードの100バイト目から105バイト目を置換したいんだけど、
全角・半角が不規則に混ざっているので、
s/(.{100,100})......)/\1abcdef/
とか正規表現でやってもうまくいかないんだよね。
良い方法あるかな?
ちなみにUNIX、sedでやるつもり。

493 名前:デフォルトの名無しさん mailto:sage [2006/12/30(土) 15:00:03 ]
>>492
多バイト文字を途中でぶった切ってもいいの?

$ LC_ALL=C sed -e 's/^\(.\{99\}\)\.\{6\}/\1abcdef/'
とか。LC_ALLは状況しだいでLANGとかLC_COLLATEあたりでもOK。
あとこの正規表現はGNU sed でないと多分食ってくれない。


494 名前:492 mailto:sage [2006/12/30(土) 23:40:41 ]
うちはcshなので
env LC_ALL=C sed 〜
って感じですね!
ありがd!
後いい忘れたけど固定長ファイルで置換部分は必ず1バイト文字なのでぶった切られることはないです。


495 名前:デフォルトの名無しさん mailto:sage [2007/01/02(火) 14:18:06 ]
RDB=ラーメンデータベース

496 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 00:18:43 ]
よく勘違いされてるんだけど、
ラーメン(Rahmen)というのはドイツ語で、
英語のframeに相当する単語なんだ。
だから「枠」とか「骨格」とか「軸組み」とかいうような
ニュアンスなんだよ、本来であれば。

497 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 09:39:49 ]
ラーメン違い。本来も糞もない。




498 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 12:33:20 ]
遅レス気味すまそ。
>>483
そういうの書くなら
dump -0f path/to/hda1.dump /dev/hda1 || exit 1
と || exit の方が、見やすくって良くないか。


499 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 01:26:49 ]
質問があります。
Vine4.0を使用していまして

#!/bin/sh
declare -i MAX
MAX=10
while[ $MAX -lt $1 ]
do
echo $MAX
MAX=$MAX+1
done

というスクリプトを書いたのですがいざ実行してみると下記のようなエラー?がでてしまします。
command not foundということは何かがたりないのでしょうか?
アドバイスお願いします。

. a05.sh 12
bash: while[ 10 -lt 12 ]: command not found
bash: a05.sh: line 5: syntax error near unexpected token `do'
bash: a05.sh: line 5: `do'


500 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 02:35:36 ]
whileの後ろに空白がないんじゃないか?>499

501 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 03:45:07 ]
>>499
空白入りの引数を渡すとエラーを吐くから
$1 の所をクォートしておくと吉

502 名前:499 mailto:sage [2007/01/06(土) 02:58:14 ]
>>500,501
whileの後ろに空白をいれたら無事に動作しました。
クォートとは''の事ですよね?参考になりました。
ありがとうございました。

新しい質問なんですけど

#!/bin/bash
while [ -f .count.lock ]; do
sleep 0.1
done
touch .count.lock
declare -i INTEG
INTEG='cat access_count.txt'
INTEG=$INTEG+1
echo $INTEG >| access_count.txt
echo "$INTEG"
rm -f .count.lock

を動作させると

bash: cat access_count.txt: syntax error in expression
(error token is "access_count.txt")
15 ←access_count.txtの内容を書き換えてもどんどんインデントされていきます。
の様に吐き出されてしまいます。
INTEG='cat access_count.txt'の部分が悪い様なのですがINTEGにcatを使って
ファイルの内容を代入することはできないのでしょうか?
access_count.txtの中身は 0 とだけ入っています。

よろしくお願いします。

503 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 03:33:25 ]
コーテーションの向きを確認すべきかと

504 名前:492 mailto:sage [2007/01/06(土) 11:02:47 ]
すいません、また来ました…

\{99\}使えんかったorz
.を99個書くしかないんかね〜


505 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 21:31:43 ]
>>504
sedを使わない方法
(dd bs=1 count=99;dd bs=6 count=1 of=/dev/null; echo -n abcdef; cat)

506 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 02:48:47 ]
>>504
使ってる sed がGNU sedでないとかない?

echo abcdefghijklmn | sed -e 's/^\(.\{5\}\).../\1XXX/'

abcdeXXXijklmn
になるよ(Fedora Core5)

あと、493は後ろのドットに余計な\がついてるからそれはとっておくんなまし。


507 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 15:39:41 ]
>>504
awk '{print substr(1, 99, $0) "12345" substr($0, 105)}' hoge.txt




508 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 23:38:53 ]
>>504
printf "%099d\n" |tr 0 \.

509 名前:504 mailto:sage [2007/01/16(火) 00:52:23 ]
やっぱawkじゃね〜
サンクスコ


510 名前:デフォルトの名無しさん mailto:sagw [2007/01/16(火) 17:35:01 ]
ちょいとawkスクリプトでお尋ねしたいんだが、
2つ以上のファイルから文字列の切り出しってできますかね?
色々試してみたのだけれど全然できなかったんで

hoge1.dat の$1,$3 と hoge2.dat の$5,$2 を 1行でhogehoge.datに出力という形

GMTっていうマイナーなツールで絵を描いてるんだけど、GMT内の計算スクリプトで出たデータのお尻に
別のデータを加えてそのまま描けないかなぁって試行錯誤してるんですが。

511 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 17:44:04 ]
できます。しかし、残念ながらスレ違いにつきawkスクリプトは割愛。

512 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:08:10 ]
>>511
スクリプトが複数行に渡らずにできるならなんとかサンプル探してやってみる

513 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 18:33:03 ]
>>512
なぜにワンライナーにこだわるん?

514 名前:512 mailto:sage [2007/01/16(火) 19:44:23 ]
スレ違いだけど一応
>>513
簡単に言えば頭の悪い素人だから。
マニュアルになりそうなもんは見たりするんだけど、大体そういうのって一行で処理終わらせるのが多くて。
専門用語がてんでダメだし、

何故処理できるのか?を理解してなくて、「こうやればこういうのができる」でしか認識してなく
自分自身、誰かが書いたソースの簡単な処理や変数を弄るだけしかできないって分かってる。
複数行に渡ると検索でHITしにくいし、「できる」て事さえ分かれば後は調べたらなんとかなるかな、と

スレ読んでたら組み合わせ次第でなんとかできそうだわ

515 名前:デフォルトの名無しさん mailto:sage [2007/01/16(火) 19:55:53 ]
カラム数が固定ならpasteとawkをパイプで繋ぐのが楽かな。

516 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 00:33:49 ]
一応、書いてみたんだがな…、1行ぢゃないから駄目か

#!/usr/bin/gawk -f
BEGIN{
    while( (getline line1 < "hoge1.dat" ) > 0 && \
           (getline line2 < "hoge2.dat" ) > 0 ){
        split(line1,col1)
        split(line2,col2)
        print col1[1],col1[3],col2[5],col2[2]
    }
}

517 名前:デフォルトの名無しさん mailto:sage [2007/01/17(水) 01:45:36 ]
>>510
bash 限定かも

$ paste <( awk '{print $1,$3}' hoge1.dat ) <( awk '{print $5,$2}' hoge2.dat )




518 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 10:59:01 ]
対話式のスクリプトを作っており、read で入力されたIPアドレスを
正規表現でIPアドレス規則が正しいかを判断さえたいのですが、
どうしたらいいですかね。

519 名前:デフォルトの名無しさん [2007/01/24(水) 11:51:57 ]
関数やサブシェルについての質問です。
まずサブルーチンの方ですが、以下のようにしました。
「Name_sub.sh」
#!/bin/sh

echo "What is your name and age ?"
read your_name your_age

CHECK_NAME () {
echo $1 $2
}

CHECK_NAME $your_name $your_age

これ単体で実行すると、正常に$your_name $your_ageが戻ってくることを確認しました。
これを他のmainスクリプトから呼び出して使おうとしました。

「Name_main.sh」
#!/bin/sh

var=(`./Name_sub.sh`)
echo '${var[@]} = ' ${var[@]}

ここで、Name_sub.shの戻り値を配列varに入れようとすると、
Name_sub.shの対話部分が表示されませんでした。
対話部分をプロンプトに表示して、関数のCHECK_NAMEの戻り値のみ
配列varに代入するにはどうすればよいのでしょうか?

520 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 12:29:27 ]
とりあえずtmp.txtファイルに値を保存して、その値をmainで読み込むことにしました。

521 名前:デフォルトの名無しさん mailto:sage [2007/01/24(水) 13:17:20 ]
source を使うケースじゃないのかな。


522 名前:デフォルトの名無しさん [2007/01/25(木) 15:51:10 ]
>>518
sh や bash の場合 (ksh もこうだったかも知れない)
IFS=.
とすると set で指定した変数は '.' で区切られて $n に入るようになる。
たとえば ipaddr に 172.24.1.2 と入っているときに

IFS=.
set $ipaddr

とやると $1 に 172, $2 に 24, $3 に 1, $4 に 2 が入り、更に $# が
4になる(4つに分割されたということ)。

なのでまずはこの直後に
if [ $# -ne 4 ]; then echo Error ; exit 1 ; fi
のようなことをして4つでなければエラー扱いにしてしまえば良いと思う。

更に $1 から $4 に入っているので for でループさせることもできる。
なのでここで数値が 0 〜 255 になっていなければエラーにすれば良い。

# n に 172, 24, 1, 2 の順で代入されてループする。
for n
do
 if [ 0 -gt "$n" -o 255 -lt "$n" ]; then echo Error ; exit 1 ; fi
done

テストで数を先に書いている理由は n には何が入ってくるか分からないから。
('-' で始まるオプションのようなものを入れられてしまうとテストコマンドの
動作が変わってしまうかも知れないため)


523 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 16:05:50 ]
どうしても正規表現を使わないと我慢ならんという場合はこんな感じかな。
なんか無理があるが。

if perl -e '$_='\'"$ipaddr"\'';if(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/){if($1>=0&&$1<=255&&$2>=0&&$2<=255&&$3>=0&&$3<=255&&$4>=0&&$4<=255){exit 0}}exit 1;'
then
 echo ok
else
 echo ng
fi


524 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 17:38:15 ]
正規表現の時は >=0 の判定はいらんと思う。
どちらにしろ面倒だけど。

525 名前:デフォルトの名無しさん mailto:sage [2007/01/25(木) 22:03:14 ]
あ、そうだね。いらないね。

526 名前:デフォルトの名無しさん [2007/02/07(水) 22:53:33 ]
[質問]
シェルスクリプト初心者です.

power 12.34 dBm
power 13.45 dBm
power 14.56 dBm

ある,power(電力) の変化を確認するのに

while true; do sleep 1 echo `command`; done

で 表示しているのですが

改行して新たな出力を出さないで,
前の出力を消し power 値 dBm の値のところだけが変わる

ようにしたいのですが,いい方法ありませんか?

clear は使わずにお願いします.

分かりにくい説明ですみませんがどうかよろしくお願いします.

527 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:09:16 ]
>>526
キャリッジリターンを使うと吉。
command が複数行出力しているとこれでは上手くいかないけど。

while true; do sleep 1; echo -en "`command`\r" ; done

詳細は man printf かな?



528 名前:デフォルトの名無しさん [2007/02/11(日) 11:20:30 ]
シェルスクリプトって例外処理できます?
例えば一つ上の行でエラーが発生したときはそのシェルスクリプトの処理を終了するとか。

529 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 12:14:42 ]
>>528
プロセスの終了ステータスを見て条件分岐することはできる。

530 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 13:13:06 ]
>>528
普通は>>529の終了ステータスを使う。エラー時に終了するだけならこれで十分。
シグナルが飛ぶならtrapでシグナルハンドラを書くのもあり。

try/catch/throwに直接対応するものは、Bourne shell、csh、bashにはない。


531 名前:デフォルトの名無しさん mailto:sage [2007/02/11(日) 20:02:45 ]
set -eしとけば、(検査されていない)終了ステータスが0以外の場合は
スクリプトが終了する。終了処理はtrap "..." 0

532 名前:デフォルトの名無しさん mailto:sage [2007/02/12(月) 08:56:55 ]
どもですm(_ _)m

533 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 19:47:34 ]
リダイレクトのことで質問なんですが
echo hoge > test
ls -l < test
とやるとlsは標準入力(つまりtest)の内容を読み込むのなら
普通にls -lとした場合はキーボードからの入力を読み込もうとすると思うんですが、
そうはならないのは何故なんでしょうか?

534 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:19:42 ]
>>533
入力がリダイレクトされても、lsは何も読むわけではない。
つまり、ls -l < test と書いても ls -l と書いても同じ事。

535 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:42:01 ]
たしかにls -l < testとやっても変わらないみたいです。
今、入門UNIXシェルプログラミングという本で勉強しているのですが、
その本の89ページには
echo abc nnn > xyz
ls -l < xyz
とするとls -l abc nnnとしたときと同じ結果になる。書いてあったのですが、
この本が書かれた時と今ではlsの動作が異なるということなんでしょうか?


536 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 21:55:46 ]
いつの時代か知らんが、lsが標準入力から引数を貰うような作りになってる
という話は聞いたことがないな。

ls -l `cat xyz`とか xargs ls -l < xyz ならありえる。

xargsは、はしょって言うと、標準入力から受け取ったものを、自分に与えられ
た引数につなげたて、その全体を実行するコマンド。、


537 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:01:14 ]
うーんサンプルコードを見ても特にxargsを使っているわけではないようです。
本のタイトル名で検索したらサポートページがあったので、後で
この件に関してメールを送ってみようかと思います。ありがとうございました。



538 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:12:21 ]
>>537
物はこれか?
ttp://shop.sbcr.jp/isbn/shell/index.htm
ここには載っていないようだな。
ttp://shop.sbcr.jp/isbn/shell/errata.htm

539 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:17:38 ]
この本か。
会社に置きっぱなしだから明日確認してみる。

540 名前:デフォルトの名無しさん mailto:sage [2007/04/04(水) 22:22:57 ]
著者名のつづりのミスもみつけられんとこ信用するな

541 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 01:49:29 ]
>>535
ls -l `< xyz` なら期待通りの結果になるよ。

bash 依存の記法だったと記憶しているけど。


542 名前:539 mailto:sage [2007/04/05(木) 10:21:44 ]
入門UNIXシェルプログラミング(ソフトバンク株式会社、Bruce Blinn、初版)
の87ページに確かに載っているな

----------
$ cat xyz # xyzファイルの中身を確認
abc nnn
$ ls -l < xyz # xyzファイルを「標準入力」としてリダイレクトする
----------

ls (GNU coreutils) 5.97では動きませんでしたがええ。

543 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 12:53:34 ]
リダイレクトのことで質問なんですが
中身がスペース一つのファイルsampleを
cat test | sed -e 's/ / /' > test2
とするとtest2にスペース10個が出力されるので
cat test | sed -e 's/ / /' > test
とするとtestの中にはスペースが10個入っていると思うんですが、
中身を見てみると空になってしまいます。
一つのコマンドの中で同じファイルに対して入出力のリダイレクトを行うと
空になってしまうのはわかるんですが、今回の場合はどうしてうまくいかないのでしょうか?

544 名前:543 mailto:sage [2007/04/05(木) 12:55:16 ]
すいません、上の例でのtestはsampleの間違いですorz

545 名前:543 mailto:sage [2007/04/05(木) 12:57:52 ]
何度もすいませんorz
どうやら連続した半角スペースは一つにまとめられてしまうみたいで、
上の例のs/ / /はs/スペース1個/スペース10個/ってことです。

546 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 13:50:57 ]
>>545
一部のOSのようにパイプラインを非同期にしか実装してない環境ならいざ知らず、
まともなOSではパイプラインの前後のプロセスは同時に実行されるので、
パイプラインに接続する一つのファイルを読み書きしようとすれば当然そうなる。


547 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 14:50:40 ]
つまり上の例だと
・最初に書き込み用にファイルを開く、当然ファイルの中身は空になる。
・catは空のファイルの中身を出力する
・空がsedに渡されるので当然空をファイルに書き込む
という順番で処理が行われるんでしょうか?



548 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:14:56 ]
ちょっと違うな。
cat test | sed -e 's/ / /' > test
の場合、
シェルがtestを"w"で開いてからcatとsedを起動する筈だから、
catが起動された時点でtestは既に空の筈だ。
空の入力に対してcatは何も出力しないし、sedも同じように何も出力しない。
従って、空になるのはcatやsedが起動される前と言うことだ。

ちなみに、どうしても同じファイルに読み書きしたいなら
sed -e 's/ / /' < test | tee test
のようにしてしまえばいい。
これなら、シェルがtestを開いてからteeがtestを開こうとするので
(unixの開きっ放しのファイルは削除できたように見えてもそれは見掛けだけ仕様に基づき)
無事に処理される筈だ。

549 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 15:27:54 ]
まず最優先でリダイレクトのための処理が行われて、それから
コマンドの処理が行われるんですね。わかりました。ありがとうございます。

550 名前:デフォルトの名無しさん mailto:sage [2007/04/05(木) 17:02:21 ]
なんか今一判っていない悪寒。

551 名前:デフォルトの名無しさん mailto:sage [2007/04/06(金) 02:40:06 ]
>>549
GNU sed 使ってるなら -i オプションつけとけ


552 名前:デフォルトの名無しさん [2007/04/07(土) 19:35:57 ]
シェルを初めて組みます。
Cシェルで、自分のグローバルIPを取得して、そのIPをメールで送信するようなプログラムを
組みたいと思っております。

で、グローバルIPの取得の仕方が分からないのですが、
どのようにかけばよいのでしょうか?

OSはRedHat10です。

553 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:07:14 ]
シェルスクリプトのことをシェルゆーな。
Cシェルで書くな。

プライベートアドレス
10.x.x.x
172. {16-32} .x.x
192.168.x.x

割り当てられているIPアドレスは

LANG=C
/sbin/ifconfig |sed -n 's/inet addr:¥([^ ][^ ]*¥) .*/¥1/p'
で取れるから、あとはawkでも使って該当しないものを除外すれば
いいんじゃないか?

と書いてから気づいたが、家のダイアルアップルータに繋がっている
LinuxからグローバルIPアドレスを取ろうとするなら、Linuxにはプライ
ベートIPアドレスしか割り当てられてない。取るべきはルータに付いてる
グローバルIPアドレスになるから別の方法が必要だぞ。


554 名前:デフォルトの名無しさん [2007/04/07(土) 22:25:30 ]
>>553
すいません、ありがとうございます。
何もわかってないんで^^;
ずばり、そのとおりで、取得したいのはルータについてるグローバルIPです。。

555 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 22:42:16 ]
>>554
ダイアルアップルータやモデムにはtelnetサーバが内蔵されていることがある。
叩くコマンドが分かれば、expectを使って取得できるかもしれない。

httpサーバを内蔵していることもあるが、こっちはずばりIPアドレスを確認する
ページを持ってるかもね。


556 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 23:00:35 ]
>>554
誰もおまいのルータの仕様を知っているやつはいないからな・・・

うちのFLASHWAVE 2040 M1ならID:PASS@ルータのIP/doKeeping.htmlを
wgetで取得してvar sIpAddress="*.*.*.*";の場所を取得すればわかる。

557 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 00:37:43 ]
何も考えずにメール出せば、大抵はReceived:にIPアドレスが自動的に書かれる。
書かれないならば、書いてくれるメールサーバを提供しているISPに乗り換える。




558 名前:537 mailto:sage [2007/04/11(水) 10:24:46 ]
ソフトバンクさんからメールの返事が届きました。
正誤表も更新したみたいです。

559 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:36:15 ]
alias定義で改行の前に入れる\にはどのような作用があるのでしょうか?
csh でいろいろと試してみたところ、下のようにwhile文などが使えるようになりますが、
一方で、引数を扱ったりwhile文のネストをしたりすると正常に動作しなくなってしまいます。

alias loop '\
set count = 1\
while ( $count <= 5 )\
echo hoge\
@ count++\
end\
'


560 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:45:23 ]
未だだね。

561 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 12:46:29 ]
あーいけね、>560は>558の話ね。

>>559
行末のバックスラッシュは改行文字をエスケープする。

562 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 13:19:26 ]
>>561
「改行文字をエスケープする」の意味を具体的に教えて欲しいのです。
>>559のコードで\+改行を空白に置き換えると動かなくなります。
妙な副作用がなぜ出るのかも謎です。

563 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:34:26 ]
>>552
診断君とかにアクセスしてIP抜いてもらって
それをパースするのはだめなんか?

564 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 22:36:33 ]
ワンクリ詐欺サイトにアクセスすればIPアドレス教えてくれそうだな。



565 名前:デフォルトの名無しさん mailto:sage [2007/04/11(水) 23:29:53 ]
>>563
頻度にもよるけどあんま他人様のとこに頼るのもいかんと思う。
自前で取れるんならそうした方が優しいし確実。一応
ttp://info.ddo.jp/remote_addr.php
とか使うとワンライナーでやれるけど。

566 名前:デフォルトの名無しさん mailto:sage [2007/04/12(木) 12:59:30 ]
>>562
シェルスクリプトにおける改行の意味を調べてみると良いよ。

alias loop 'set count = 1;while ( $count <= 5 );echo hoge;@ count++;end;'


567 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 05:02:58 ]
>>566
while?



568 名前:デフォルトの名無しさん [2007/04/13(金) 21:22:17 ]
質問させてください。
以下のように、test-serverへ接続し、
date;hostname;whoamiを実行するスクリプトを書いてます。
date;hostname;whoamiの結果をリダイレクトし、
スクリプト本体があるサーバに保存したいのですが、
その場合、どう記述すれば良いでしょうか。

#/bin/bash
HOST=test-server
UNAME=root
PASSWD=***

expect -c "
set timeout 20
spawn telnet $HOST
expect login:\ ; send \"$UNAME\r\"
expect sword:\ ; send \"$PASSWD\r\"
expect \"$\" ; send \"ls\r\"
expect \"$\" ; send \"date;hostname;whoami\r\"
expect \"$\" ; send \"exit\r\"

569 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 11:40:37 ]
そのスクリプトの出力をリダイレクトすればいいのではなくて?

570 名前:568 mailto:sage [2007/04/17(火) 21:48:16 ]
その方法が分からないのです。expect内部でリダイレクトすると
接続先にファイルが出来てしまうんじゃ無いでしょうか

571 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:45:47 ]
>>570
にほんごよめますか?

572 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:08:52 ]
ラッパー側のスクリプトの出力をリダイレクトしようとしても、
expectの中で起動したプロセスの出力はexpectが全部食っちゃうん
じゃないの?


573 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:39:33 ]
あるプログラムをバックグラウンド実行して、
そのプログラムが一定時間後に終了していなかったら終了させる、みたいなことはできますか?

こんなイメージです。

#!/bin/sh

/bin/hoge & # 数十分かかる。途中で固まるかもしれない。

sleep 3600 # 念のため一時間待ってみる

[ hoge が終了していなかったら hogeをkillする。終了していたら無視 ]

exit

574 名前:デフォルトの名無しさん mailto:age [2007/04/21(土) 18:41:17 ]
あげ

575 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:50:35 ]
>>573
こういう事?

#!/bin/sh -x
DURATION=3600

hoge &
PID=$!

echo ${PID}
sleep ${DURATION}

kill ${PID}
exit

576 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:51:49 ]
>>573
pid控えておいて、atコマンドで終了スクリプトを仕込むとか。


577 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:30:31 ]
一時間の間にpidが再利用されない保証があるなら。



578 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:44:35 ]
kill する前に親プロセスの PID を確認すれば。

579 名前:デフォルトの名無しさん [2007/04/21(土) 20:11:19 ]
データを 1バイトだけ 読み込むコマンドってなんだっけ?

580 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:21:18 ]
>>579
head -c 1 ?

581 名前:573 mailto:age [2007/04/21(土) 22:39:07 ]
>>575
こういうことです!ありがとうございます。

>>576
atd動いていないッス。。。

>>577
>>578
pidが再利用されない補償はもちろん無いです。
ググっていますがPPIDを確認をするコマンドが見あたらないorz
$!や$$でPIDが取れるようなのでpsコマンドの結果から何とかしてみます。


582 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 17:22:43 ]
waitか何かで子プロセスの終了待てなかったっけ?

583 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:14:45 ]
>>573

pid=$!
count=0
while [ $count -lt 60 ]; do
sleep 60
kill -0 $pid || break
count=`expr $count + 1`
done
[ $count -lt 60 ] || kill $pid

584 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:15:16 ]
待つよ。

585 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:16:01 ]
むぅ、30秒差で…

>>582
waitで待つよ。

586 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 11:19:01 ]
>>583
kill -0 $pid
ってどういう意味?

587 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:32:55 ]
kill -0 $pid 2>/dev/null || break
の方がベターだな。

>>586
man 2 kill
The kill() system call sends the signal given by sig to pid, a process or
a group of processes. The sig argument may be one of the signals speci-
fied in sigaction(2) or it may be 0, in which case error checking is per-
formed but no signal is actually sent. This can be used to check the
validity of pid.

プロセスが存在してそのプロセスにシグナルを送る権限があれば正常終了。
それ以外はエラー。つまり、プロセスの生存確認に使用できる。



588 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:58:56 ]
>>587
なるほど。
日本語man読んでも意味がわかんなかったんだ

ありがとう

589 名前:デフォルトの名無しさん [2007/04/27(金) 13:30:22 ]
シェルブリッド

590 名前:デフォルトの名無しさん [2007/04/28(土) 16:07:15 ]

♪ア・ソ〜レ

ア・チョン! ア・チョン!

ア・チョン! チョン! チョン! バカ!

591 名前:デフォルトの名無しさん [2007/05/04(金) 00:27:06 ]
a.txt
2
4
23
87
483
3
b.txt
89
34
111
8
3
97
とある場合
program a.txt b.txt
と打てば
以下のようにに表示されるシェルスクリプトってできませぬか?

2+89=91
4+34=38
23+111=134
87+8=95
483+3=486
3+97=100

592 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:35:51 ]
>>591
スクリプトにするまでもないが、

#!/bin/sh
paste a.txt b.txt | awk '{ print $1 "+" $2 "=" $1 + $2}'


593 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:36:40 ]
あああ、paste $* | awk 以下略

594 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 22:00:14 ]
ああpasteって知らなんだサンキュー

595 名前:デフォルトの名無しさん [2007/05/10(木) 19:24:42 ]
自演さらしあげ

596 名前:デフォルトの名無しさん [2007/06/18(月) 22:07:54 ]
既存ファイルの一部のみ書き換える事ってできますか?
(ファイル名変えずに)

NHK,1
NTV,4
TBS,6
FTV,8
ANB,10

というテキストがあったとして
sed 's/N/X/g' という操作をして

XHK,1
XTV,4
TBS,6
FTV,8
AXB,10

としたいです。

597 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:23:39 ]
別のファイルに出力した後で、mvかcp



598 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:34:19 ]
-i オプションあるならそれ使え

599 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:36:31 ]
(mv file file.bak&& sed -e 's/N/X/g' >file) <file

600 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:47:14 ]
sed -i 's/N/X/g' file

601 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:04:16 ]
sed -i ってどんな機能??

602 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:23:41 ]
手元のsedにはないオプションだ。

603 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 10:47:04 ]
なら perl 使っとけ。
perl -i -pe 's/N/X/g' file

604 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:36:49 ]
edでいいんじゃね?

605 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:30:13 ]
ファイルのある文字列を含む行と行の間を取得するにはどうしたらいいのでしょうか?
例えば「abc」「def」を含む行の間、2・3・4行目を取得をしたいです。
grepでやろうとしたのですが、どうしてもうまくいきません。。

abcaa
aaaaa
bbbbb
ccccc
defbb

606 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:36:36 ]
>>605
sed -n '/abc/,/def/p' < text | sed '1d;$d'

なんか冗長なのと、該当箇所が複数あると駄目だな。


607 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:37:59 ]
パイプの後段を sed '/abc/d;/def/d' にすれば該当箇所が複数あってもOKかも。




608 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:47:05 ]
>>605
sed -n '1,/abc/b; /def/q; p'

609 名前:605 mailto:sage [2007/06/27(水) 01:12:46 ]
レスありがとうございます。

無理やりawkで冗長なものを作ろうとしてました。
もっと修行して出直します。

610 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:37:53 ]
>>609
別にawkでいいんじゃね。ラクだし
↓複数箇所でも大丈夫
awk '/aaa/{f=1;next} /bbb/{f=0} f{print}'

611 名前:デフォルトの名無しさん mailto:sage [2007/06/29(金) 23:03:01 ]
つーかやり無理一行で作らんでも、perlとかで普通に作ればいいんじゃね。
冗長だろうがなんだろうが。

612 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:04:28 ]
awkでがんばって一行で作ったのの速度と
perlでシコシコださく書いたのの速度は
どっちが速いですかね

613 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:11:24 ]
別に全然頑張ってない

614 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 12:19:38 ]
awkで一行で書けるものがperlで一行で書けない理由は無い。

615 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:09:13 ]
一行に納める必要はないです。
バックリファレンスなどの特殊な機能を使わなければ
遅延評価DFAで動くawkは行数が増えても遅くなりません。
逆に頑張って一行で書いてもあんまり高速化しません。

616 名前:デフォルトの名無しさん [2007/07/04(水) 23:12:58 ]
九九の表を作るスクリプトなんですけど
cshで@を使わないで書き直したらどうなりますか?

#!/bin/csh -f

echo " | 1 2 3 4 5 6 7 8 9"
echo "--|------------------"

foreach i (1 2 3 4 5 6 7 8 9)
eaco -n " $i|"
foreach j (1 2 3 4 5 6 7 8 9)
@ seki = $i
@ seki *= $j
printf "%3d" $seki
end
echo ""
end
echo "--|------------------"


617 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:21:45 ]
@を使わないならBourne Shellでやるようにexprを使えば?




618 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:25:05 ]
>>617
Borne shellで書き換えは出来るんですけど
課題としてcshで@を使わないで書き直すように指示されてるんです

619 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:35:33 ]
ばか?

620 名前:デフォルトの名無しさん [2007/07/05(木) 00:28:33 ]
しつもん

スイッチのポートとその先のPCのMACをSNMPで対応付けたいのですが、

#!/bin/bash
while [MACアドレスがある限り];do

snmpwalk -c コミュ IP .1.3.6.1.2.1.17.4.3.1.1 >aa
snmpwalk -c コミュ IP .1.3.6.1.2.1.17.4.3.1.2 >bb
snmpwalk -c コミュ IP .1.3.6.1.2.1.17.1.4.1.2 >cc
snmpwalk -c コミュ IP .1.3.6.1.2.1.31.1.1.1.1 >dd

grep MAC aa > mib
grep mibの右側 bb >bridge
grep bridgeの右側 cc >ifindex
grep ifindexの右側 dd >port

paste MAC,port >output.txt
done <mac.txt

みたいなたらい回ししか出来ないんですか?


関係ないけどどうして演算結果を変数に入れるのがあんなに変な形式なんだろう?


621 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:40:18 ]
>>618
#!/bin/csh -f

echo '
@を使わないことに何の意味があるの?'
echo 'あんた馬鹿じゃねーの?'

622 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:02:45 ]
>>618
Bourne Shellでやる「ように」と書いたのが見えませんでしたか?
・cshでも``記法は使えるでしょ?
・exprはBourne Shellの内部コマンドじゃないでしょ?


623 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:37:06 ]
>>620
コマンド置換を山ほどネストすれば一時ファイルはもっと減るんじゃね?
つかこの程度のことにbash使うな
で、変な形式って?


624 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:53:44 ]
文字列+数値(たまに数値の無い行がある)の並んだファイルを置換したいです
○○○1
××××200
△△
□□66

とか並んでるのを、
○○○2
××××201
△△
□□67

みたいに。
sedで左 >file1
sedで右 | sed -e "s/\([0-9][0-9]*\)/&+1/" | bc >file2
paste file1 file2 > file3
で解決かと思ったら、△△の行がbcで勝手に詰められて結果がずれてしまう…
私の頭ではこれ以上思いつきませんでした。助けて


625 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:56:27 ]
awkでいいじゃん。

626 名前:赤帽勉強中 mailto:sage [2007/08/02(木) 21:45:16 ]
・lftpを使用してファイルアップロードと削除を行う(mirrorは使わない)
・アップロードと削除の対象ファイルはリストから読み込ませる

って機能のスクリプトを作ろうとしているんですけど、
ファイル名をリストから読み込ませてのアップロードと削除がどうやれば良いのか。。。
どなたかlftpに詳しい方、アドバイスを下さいませ。(-∧-;) ナムナム

627 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:19:08 ]
lftp使ったことないのでmanを見てみたが、manの範囲でできる。

実行するコマンドをテキストファイルに羅列して
lftp -f そのファイル

標準出力からコマンドを食わせることができればきれいなんだけどな。

cat <<EOF > commands
user hoge pass
cd hoge
EOF
sed 's!^!put !' < put_file_names >> commands
sed 's!^!del !' < del_file_names >> commands
lftp -f commands

とかそんな感じじゃね?




628 名前:赤帽勉強中 mailto:sage [2007/08/02(木) 23:10:38 ]
>>627
レスありがとうございます♪おかげで何とかなりそうですよ。
実はmanを見たりググったりしていたんですが何じゃこりゃ?って感じで理解できていませんでした(汗
まだまだ全然勉強が足りませんですね。。。ヾ(´▽`;)ゝアセアセ

629 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:52:33 ]
ふつうrsync

630 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 12:59:17 ]
ついでなので、ワタシの使っているコマンドライン公開
lftp -u USER,PASS HOST -e 'set ftp:passive-mode 0;set ftp:ssl-allow 0;mirror -Rev' 2>&1

>>629
ftp しか使えない環境でも、rsync って使えますか?


631 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:37:12 ]
>>630
使えません

632 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:49:39 ]
sshオーバーで耐えろ

633 名前:デフォルトの名無しさん [2007/08/13(月) 00:26:07 ]
シェルスクリプトでURLのリンク先を開くにはどうしたらいいでしょうか?

634 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 01:06:27 ]
>>633
汎用的なのは telnet + expect
SSL や TLS を使用しているなら openssl
接続先が http なら wget とか curl とか
ftp なら ftp コマンド

635 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 04:04:17 ]
UNIXパワーツールの92Pに
PS1='`date "+%D %T"` $PWD $ '
というカスタマイズが紹介されていたんですが
+%D %Tをダブルクォートで囲むのは何故なんでしょうか?

636 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 08:04:47 ]
>>635
そのPS1への代入の段階で展開させず、PS1に%Dを引き渡すため。
勿論それは、プロンプト表示の段階で展開されることを期待している。

637 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:05:22 ]
>>636
シングルクォートで囲んでいるので、ダブルクォートで囲まなくても
代入の時点ではdateコマンドは実行されないのではないでしょうか?



638 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 16:19:05 ]
>>637
date +%D %T
と実行してみろ。話はそれからだ。

>>636
それでは"が必要な理由の説明になっていない。

639 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 22:55:46 ]
>>635
論点とは違うが、

PS1='\d \t \w \$ '

これと大差ない気がする。

640 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 08:41:29 ]
>>639
それ移植性ある?(PS1に移植性も何もないが、移植性のある.profileとか
一時期凝ってたんで)


641 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 01:16:48 ]
>>640
移植性というか、依存するのはシェルのバージョンだから、

ttp://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbBZ

bash なら上の「プロンプト」の項に載っている奴は
少なくとも bash 2.05b 以降で使えるはず。

ついでに bash 3.2.17 の info を確認したら、二つ新しいのがあった。
これには移植性が無いって事だな。w

`\D{FORMAT}'
The FORMAT is passed to `strftime'(3) and the result is inserted
into the prompt string; an empty FORMAT results in a
locale-specific time representation. The braces are required.

`\A'
The time, in 24-hour HH:MM format.

642 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 01:59:47 ]
echo $
とすると$が出力されるのに
echo $"" や echo $''
とするとなにも出力されなくなるのはどうしてなんでしょうか?

643 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:15:52 ]
>>642
後者は$が変数参照の一部と見做されるから。
抑止するには$を''で囲むか\でエスケープすればいい。

644 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:31:25 ]
>>643
>>後者は$が変数参照の一部と見做されるから。

変数名が空の文字列の変数を参照しようとするってことなんでしょうか?

645 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 11:25:41 ]
そんなようなもんじゃない?
その割には、そんな変数は定義できないと思ったけど。

646 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 15:26:44 ]
bash の話だと、 $"" と $'' は特殊な quoting の構文になってる。
zsh にも $'' はあるみたいだね。

647 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 19:47:15 ]
man hogeの結果に対してgrepをしたい場合、どのように書けばいいのでしょうか?



648 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 21:41:37 ]
うちのMacではそのまま man man | grep -i optionとかできるんだけど、
これって特殊?


649 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 21:51:12 ]
>>647
PAGERをcatにしたらどう?

650 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:04:53 ]
>>648
いやそんなことはないと思う
linuxとかでもそうでしょ

んでも、grep前にcol -bとかはさんだほうがモアベターだと思う

651 名前:647 mailto:sage [2007/08/28(火) 22:18:05 ]
今の環境はUbuntuなんですが
デフォルトの状態でman hoge | grep "文字"
をやるとエラーか文字化けか再フォーマットしてます〜というメッセージが出て止まってしまう
みたいです。
言われたとおりPAGERをcatにしてみたら普通の文字はgrepできるようになったんですが、
man ls | grep -i
のように-iの行を見ようとすると

man: コマンドはステータス 13 で終了しました: /usr/bin/zsoelim /tmp/zman9mAoS0 | iconv -c -f EUC-JP -t UTF-8 | /usr/bin/tbl | /usr/bin/nroff -mandoc -Tutf8 | /usr/bin/col -b -p -x | /usr/bin/pager -s

このようなメッセージが出て終了してしまいます。

652 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:47:15 ]
nroff -man manページのtroffソース | grep ...
はどう?


653 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 23:51:44 ]
grep -e -i

654 名前:647 mailto:sage [2007/08/29(水) 09:18:30 ]
>>652
実行してみると↓のようなエラーが出てきました。
普通にmanを実行するときちんと表示されるのに、それをリダイレクトしたりすると
文字化けするあたり、どこかがおかしいのだと思います。

653さんのようにやってみたところ日本語の部分が文字化けしてることを
除けばmanの情報をgrepできるようになりました。


655 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 10:30:44 ]
>>654
grepで、オプション文字列と誤解されそうなキーワード(具体的には-で始まる)を検索する場合は、
-eなどでガードする必要があります。
なんてのは、シェルスクリプトと何にも関係ないマニュアルページを読めば済むことじゃないか。
鼬害だ、このすっとこどっこい。

656 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 12:51:20 ]
おまいの選択している文字コードがmanファイルの文字コードと
違うんだから最初に LANG= で指定すると幸せになれるかもな。

657 名前:647 mailto:sage [2007/08/29(水) 15:05:01 ]
>>655
すいません、すっとこどっこいでしたorz

>>656
ja_JP.UTF-8以外に設定するとmanが英語で表示されてしまうみたいです。
この際、英語中心で読むようにしていこうかと思います。





658 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 17:48:29 ]
そうか。
ちなみに俺は euc.jp の文字コードを使っているので
普通にman manすると文字が化けるが
man -P cat man | grep man
で日本語の所もgrepでけたぞ。

659 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 21:33:33 ]
bash並にファイル操作が簡単で普通に数値計算できる言語はないものかねえ

660 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 22:36:05 ]
>>659
具体的にどんなものをイメージしている?
計算部分は別プログラムを呼ぶのじゃダメ?
awkでもperlでも、寧ろいっそ、octaveでも。

661 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 10:56:27 ]
もう死にそうだからダメ元で助けてくれるえろい人頼ってみる

YYYYMMDDNNNN.hogeというバイナリファイルが山ほどあり、NNNN部分は連番ではなくばらばら
その中身を表示させるコマンドがある。表示内容が

--内容ここから
ヘッダ(ファイルにより行数ランダム)

1 : YYMMDD hhmm filesize
2 : YYMMDD hhmm filesize
--ここまで

YYYYMMDDNNNN.hogeのファイル名をYYMMDD.hhmmにリネームする
awkで頑張ってみたけどヘッダの行数が統一されてないせいでお手上げ
一つ一つ表示させてはcpでリネームしてるんだが死にそう。
空白行の次の行だけをテキストか何かに出力する方法というか書き方って無い?

662 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:20:04 ]
>>661
sed -e '1,/^$d' -e q YYYYMMDDNNNN.hoge

663 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:20:56 ]
訂正

sed -e '1,/^$/d' -e q YYYYMMDDNNNN.hoge

664 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:23:07 ]
>>662-663
thx、やってみる

665 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:10:59 ]
A="a\ta"
echo $A ってすると次のようにメタキャラクタが展開されちゃうんだけど
a[タブ]a
これをecho $A |コマンド で展開せずに使いたいの。

ノーミソたりなくてやり方がさっぱり!おしえてエロい人!
kshつかってます。

666 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:29:17 ]
>>665
echo '$A' | こまんど
ってことか? シェルスクリプト以前の問題だと思うが。

667 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:39:13 ]
>>665
板違い。エロイ人に聞きたいなら。
sakura01.bbspink.com/hneta/



668 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:14:51 ]
>>665
sed 's/<tab>/\\t/g'
っていうことをしたいのだろうか


669 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:29:15 ]
echo "${A}"

670 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 23:56:37 ]
>>668
どうもありがとう!それです!
Winのディレクトリ表記が全部タブに変換されてこまってました。

671 名前:デフォルトの名無しさん [2007/09/21(金) 16:39:07 ]
とあるお気に入りのウェブサイトで、アドレスは一定のまま、
不定期に交換される画像(例えば www.example.com/cover.jpg ) を
毎日定時にチェックし、変更があったらそれをダウンロードし、
ファイル名にその日の日付を加えて保存する、という処理をさせたいです。
どのように書けばいいんでしょうか?

672 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 17:06:57 ]
>>671
curl -I --header 'If-Modified-Since: Fri, 21 Sep 2007 09:00:00 GMT' URL

とかやって、HTTPステータスが 304 Not Modified かどうかを見る。



673 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:40:26 ]
欧米エロサイトのサンプル画像取得か?

674 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:49:05 ]
NASAのImage of the Dayとか。


675 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:02:35 ]
>>672
別にHEADする必要なくね?更新確認と取得はHTTPならワンアクションで
できるわけで。

676 名前:デフォルトの名無しさん [2007/10/18(木) 22:26:18 ]
質問させてください。
main.shというシェルスクリプトがあり、
main.shの中で、sub.shを実行させています。
sub.shは、5秒くらいで処理が完了します。
その後に、last.shというシェルを実行させたいのですが、
シェルコマンドで、"○○秒待つ"といったコマンドはありますでしょうか。
環境はbashになります。よろしくお願いします。




677 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:33:10 ]
sleep ミリ秒



678 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:35:13 ]
そもそもsub.shは非同期なの?
終わるのを待てばいいだけの話だったりはしないんだよね?


679 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:37:01 ]
>>676
sleep 5

あと、『シェルブリッド』 じゃなくて 『シェルブリット』 だから。
そこは絶対間違えないように。

680 名前:675 mailto:sage [2007/10/18(木) 22:44:34 ]
>>677-679
ありがとうございます!
>>678
cronに登録したかったので
待つコマンドが無いかと思ってました。



681 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 22:47:19 ]
ふと思ったんですが、sleepコマンド使うと、
PCのリソースを全て停止してしまうとかあるんでしょうか

682 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 23:29:41 ]
ない

683 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 00:19:22 ]
ふと思ったんですが、この方は自分で調べるとかないんでしょうか

sleepなんて基本中の基本じゃん。


684 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 01:02:09 ]
main.sh
------------
#!/bin/bash
bash sub.sh
bash last.sh
------------

で、いいのではないかと思うのは気のせいか。


685 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 01:19:02 ]
>>684
たぶん>>678も同じ疑問を持って書いたんだと思う。


686 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 09:31:43 ]
>>683
sleep というコマンドを知らなかったとき、
この情報に辿り着くために必要な検索単語ってなんだ?

687 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 13:52:26 ]
シェル 秒 待つ
www.google.co.jp/search?q=%E3%82%B7%E3%82%A7%E3%83%AB+%E7%A7%92+%E5%BE%85%E3%81%A4




688 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 00:00:31 ]
シェルスクリプトの本くらい立ち読みでいいから流し読みしろよ。

流し読みで覚えられないなら買え。

それやった上でsleepなんぞ知らないって言うなら諦めろ。


689 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 08:04:10 ]
usleep

690 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 12:16:49 ]
usleepなんて無いだろw

691 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 17:44:38 ]
何怒ってんのかね
気に入らなけりゃスルーすればいいのに


692 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 19:20:58 ]
>>691
オマエモナーw


693 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 19:52:12 ]
usleepのuがμのつもりだったと理解したときASCIIの世界に生きる人に同情した。


694 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 20:17:49 ]
おいおい
そこまで意地張ったのになんでnanosleepなんだよ!!
かなり天邪鬼だ

695 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 22:04:14 ]
>>693
マイクロは uC という表記方法もあるよ

696 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 23:15:22 ]
>>695
結局それも「字形が似てるから代用」には違いないんでしょ?

697 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 23:46:50 ]
μなんてDBCSローカルな文字つかって喜んでる椰子キモイ



698 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 23:50:13 ]
μ(greek small letter mu)ならいいのか

699 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 10:48:43 ]
技術系だと割と当たり前に使うけどなぁ。usecとかum、uFとか。或いは組み合わせでug/lとかも。

700 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 14:35:50 ]
それだってu(ユー)にマイクロの意味があるわけじゃないだろ?
あくまでμの代用であることには違いないと思うが。



701 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 17:57:36 ]
不毛だ

702 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:38:48 ]
習慣

703 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:39:35 ]
bashスクリプト中で
cmd echo "foo-san"
ってやると
echo "foo-san"
foo-san
って感じに、実行されるコマンドの内容が先に表示される関数って、定番なのありますか?
cmd() を echo $*;eval $* にしてみたけど、" とか ' とかの処理が旨くいかない。
DOS の echo on モードみたいのでもいいかも。

704 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:47:46 ]
>>703
set -x

705 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:49:12 ]
echo "." |xargs -t

706 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:52:26 ]
>704
おーなるほど、そういうコマンドがあるのかー。勉強になりました。

>705
ありがとうございます。
でも echo つかうと、ダブルクォーテーションが表示されないのが、ちょっとかな、と。

707 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 11:10:16 ]
>>706
set -v



708 名前:デフォルトの名無しさん [2007/10/24(水) 21:03:29 ]
親フォルダ内でシェルスクリプトを開いて、
Folder1に移動し、ABCを実行する。
1時間おきにプロセスABCがあるかチェックする。
終了したら、親フォルダに移動しFolder2でも同じことをする
というスクリプトを書いたんですけど、
whileのdoで文法エラーが出て困ってます。

#!/bin/sh

for i in 1 2
do
cd Folder$i
nohup ./ABC &

while[$isAlive -eq 1]
do 
sleep 1h
isAlive='ps -ef | grep " ABC " |\
grep -v grep | wc - |'
done

cd ..
done

709 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:18:40 ]
while[$isAlive -eq 1]

while文の文法の一部ではない。
[というコマンドの最後に ] いう引数があるコマンド行(リスト)。
よって空白が必須。



710 名前:708 [2007/10/24(水) 21:31:41 ]
>>709
whileのところはできました。
ありがとうございます。

今度は、forのdoがおかしいって出ました。
forのなかでwhile制御することってできないんでしょうか?


711 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 21:41:40 ]
エラーメッセージ書いてー。

'(単一引用符)は`(逆向き単一引用符)の間違いだよな?
wc - |(マイナス、スペース、縦棒) は wc -l(マイナス、エル) の間違い?


712 名前:708 [2007/10/24(水) 22:21:55 ]
10行目、doが、syntax error
です。って表示されました。

逆向き単一引用符で、wc -lエルです。
失礼しました。

713 名前:708 [2007/10/24(水) 22:24:03 ]
連投すいません。
エラーは、forじゃなかったです。
whileのところでした。

714 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 23:01:32 ]
もっかいきっちりコピペしろ

715 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 00:23:06 ]
俺が同じマシン使ってたらABCという名前で永久に終了しないプログラムを動かしてやる。

716 名前:708 [2007/10/25(木) 03:03:38 ]
>>714
ごめんなさい。もいっかい書き直します。
これの、whileのdoで文法エラーがでます。

>>715
永久に終了しない・・・作ってほしい

#!/bin/sh


for i in 1 2

do

cd Folder$i

nohup ./ppln &


while[ $isAlive -eq 1 ]

do

sleep 1h

isAlive=`ps -ef | grep " ppln " | grep -v grep | wc -l`

done

cd ..

done

717 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 04:58:38 ]
>>716
while と [ の間にスペースが足りないのはコピペミスだよね?

最初の while のチェックの時に $isAlive が未定義。
で、 [ コマンドが引数が足りないってエラーを吐く。
だから [ コマンドに与える変数はクォートで括っておくが基本。

while [ "$isAlive" -eq 1 ]

あと pgrep があれば while の処理はもっと簡単に書けるよ。



718 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 08:21:46 ]
ただ、>>715 がいうように、
既に誰かが同じ名前の無関係なプロセスを走らせていたらどうする?
「永久に」っていう細かいところでただの煽りとか思わずに、本質読み取らなきゃ。

719 名前:708 [2007/10/25(木) 16:02:00 ]
>>717
ご指摘通りに作り直したら動きました。修正したものを張っときます。

>>718
おっしゃるとおりです。全然見えてませんでした。
実際に、スクリプトの名前を”ABC-sc.sh”としたら、
プロセスの出力が”2”とされてしまい、うまくいきませんでした。
もうちょっと改良について考えたいと思います。
プログラミングとかLinuxは初心者で、まだまだ勉強しないといけないって感じてます。


#!/bin/sh
for i in 1 2
do
cd Folder$i
nohup ./ABC &

sleep 20
isAlive=`ps -ef | grep "ABC" | grep -v grep | wc -l`

echo "$isAlive"
while [ "$isAlive" -eq 1 ]

do
sleep 1h
isAlive=`ps -ef | grep "ABC" | grep -v grep | wc -l`
echo "$isAlive"
done
cd ..
done

720 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 01:12:26 ]
>>719
$! という変数は知ってる?

nohup ./ABC &
echo "$!" # ← ABC の PID が表示される

これなら >>718 の罠にはかからないよ

721 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 09:35:42 ]
バックグラウンドで動かす意味なくね?

722 名前:デフォルトの名無しさん [2007/10/28(日) 21:40:09 ]
引数に対応した干支を表示するシェルスクリプトを
Bshellで作成したいのですが、作成方法を教えて頂けないでしょうか?

723 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:31:24 ]
eto=`expr ¥( $1 + 8 ¥) % 12`
年は西暦。子年を0にしたかったので8を加えてある。


724 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 12:33:07 ]
>>719
ps -efではなく、psのフォーマット指定を使えば混乱が減らせると思う。
# >720も手だけど。
ps -efだと、例えば引き数が"ABC"なプロセスでも混乱してしまうよ。

725 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:21:20 ]
>>716
初心者のくせに我輩を煽るとはいい度胸してるな。おととい来やがれ。
度胸に免じて、厨房どもに一つテクを授けてやろう。

kill -0で生存確認しろ。

726 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 08:34:30 ]
質問お願いします!
適当なファイルを作ってその中には数字を記述しておいて、キーボードからそのファイルを読み込んで、その記述してある数字に+2を行った結果を画面上に出力するというシェルを作りたいのですが、どのようにすればよいか教えていただけませんでしょうか?

readとループ文を使って作りたいんですが自分で調べてもあんまりわかったんでみなさんのお力をお貸しいただけないでしょうか?

727 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 10:07:29 ]
#!/bin/sh

read num
while `test $num`
do
echo `expr $num + 2`
read num
done

ちょっと違うか。



728 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 11:34:29 ]
awk使っていいなら凋落。
awk '{print $1 + 2;}' 適当なファイル

729 名前:c mailto:sage [2007/12/04(火) 13:14:06 ]
% cat x
100
% cat add2
#!/bin/sh
num=`cat $1`
expr $num + 2
% ./add2 x
102



730 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 13:18:06 ]
ん? こっちか?
% cat x
100
200
500
% cat add2
#!/bin/sh
exec < "$1"
while read num
do
  expr $num + 2
done
% ./add2 x
102
202
502



731 名前:>>726 mailto:sage [2007/12/04(火) 14:04:57 ]
>>727 >>728 >>729 >>730
回答サンクスです!
いろいろな考え方ができるのですね。勉強になりました。
ぜんぶやってみたいと思います。助かりました!ありがとうございます。

732 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 00:36:45 ]
シェルってゆうな。クズ。

733 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 20:46:08 ]
>>732
やっぱりフルネームで言わなきゃ駄目なのか?

734 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 21:02:25 ]
まあそれ抜きにしてもアレだろ

735 名前:login:Penguin [2007/12/07(金) 18:11:42 ]
午前2時まで、pingを10秒ごとに打ちたいのですが
きれいな書き方おしえてください

736 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 18:29:03 ]
# crontab
*/10 0-1 * * * ping toTarget

737 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 18:32:54 ]
いけね、10分ごとにしちまったw おまけにpingが無期限実行だぜ。

つーことで訂正。
# crontab
0 0 * * * ping -i 10 -c 720 toTarget



738 名前:735 [2007/12/07(金) 18:35:34 ]
>>737さま
ありがとう!

739 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 10:55:42 ]
既にシェルスクリプトじゃなくてUNIXよろず相談室だな(w

740 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 18:52:32 ]
Linuxのpasswdみたいにコマンドを打った後に出てくる質問に答えていく場合は
#!/bin/sh

passwd aaaa
pass
pass
とかじゃ無理みたいなのですが、どうすればいいのでしょうか?

741 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:04:22 ]
ホントによろず相談室だなぁ……

>>740
リダイレクトでもしてみたら? passwdコマンドがリダイレクトを受け付けるとも思えないけど知っておいて損はないし。

742 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:19:44 ]
>>740
対話的処理をしたいときは expect

743 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 21:11:49 ]
>>740
Tclに嫌気が差したら Expect.pm (Perl)

744 名前:740 mailto:sage [2007/12/23(日) 00:02:58 ]
>>742
で以下のようにしてみたのですが
#!/bin/sh

passwd testid
expect \"*:\"
send "test\n"
expect \"*:\"
send "test\n"

cronのメールで
useradd: user testid exists
New UNIX password: New UNIX password: New UNIX password: passwd: Authentication information cannot be recovered
Changing password for user testid.
aaaa: line 6: expect: command not found
aaaa: line 7: send: command not found
aaaa: line 8: expect: command not found
aaaa: line 9: send: command not found
といわれました。
expectが見つからない・・?何か入れる必要あるんでしょうか?

745 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:32:51 ]
cronから起動されるときのPATHがどうなるかmanで勉強する。

which expectしてみる。
$PATHの値を見てみる。
locate expectしてみる。
パッケージ管理システムを使ってるならそれを使ってインストールされてるか見てみる。(rpm系Linuxのrpm -q expectみたく)
/usr/localや/optなどのそれっぽいディレクトリの下のどこかにあるのかもしれない。

あと、expectの使い方って

expect -c "
...
spawn passwd #パスワードコマンド起動
expect ログイン要求を待つ
send ログイン名
云々
"

じゃなかったっけ?


746 名前:740 mailto:sage [2007/12/23(日) 14:11:46 ]
>>745
ズバリですね。yum install expectとしたらインストールされていないらしく入れますか?と。
expect -c "
spawn passwd id
expect \":\" ; send 〜でできました。
大変参考になりました、ありがとうございます。

747 名前:デフォルトの名無しさん [2007/12/29(土) 11:20:36 ]
初心者的な質問で,申し訳ないです。
ヒアドキュメントで変数に代入する方法がわからなくて。

list=<<EOT
A
B
C
EOT
echo $list

としても$listには何も代入されなくって。



748 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 11:33:39 ]
ヒアドキュメントは、PerlやらRubyやらでは変数への代入に使うけど、
シェルスクリプトでは、コマンドの標準入力をすげ替えるモノじゃないかな。


749 名前:747 mailto:sage [2007/12/29(土) 12:23:18 ]
>>748
なるほど,標準入力のかわりだったのですか。
ということで

read list <<EOT #--> A

としたらという結果。あともう一歩というところまできました。


750 名前:747 mailto:sage [2007/12/29(土) 12:38:15 ]
とりあえず
while read line; do list="$list $line";done <<EOS
A
B
C
EOS
echo $list


ん〜,改行がなくなってしまう...

751 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:21:26 ]
そりゃぁ、echoすれば改行は消えるね。

752 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:26:09 ]
>>750
ダブルクォートをつけてみな。

echo "$list"


見た目がいまいちかもしれんが、こうやって代入する事もできるよ

list='A
B
C'


753 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:50:43 ]
zshとbashじゃそこの挙動違うんだな

754 名前:デフォルトの名無しさん [2008/01/02(水) 15:16:56 ]
シェル初心者ですが
pingして反応が無かったらまたAにGOTOして
というのを書いているつもりなんですが
これをcronで実行させると
A:: not found となります。
GOTOさせる場合の正しい書き方を教えてください

#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
HOST=192.168.1.6
TIMEOUT=5

A:;
/sbin/ping -t $TIMEOUT -o $HOST
if [ $? != 0 ]; then
goto A;
else
/bin/echo "$HOST is Alive!"
fi


755 名前:デフォルトの名無しさん [2008/01/02(水) 16:35:27 ]
あっ、gotoでなくてもいいのか
こうすればいいてことですね

while [ $? != 0 ]
do
/sbin/ping -t $TIMEOUT -o $HOST
done


756 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 05:20:05 ]
>>755
すでに解決しているようだが、こんな書き方もできる。

until /sbin/ping -t $TIMEOUT -o $HOST
do
:
done

757 名前:デフォルトの名無しさん [2008/02/09(土) 17:00:30 ]
自分に渡されたコマンドオプションをそのままほかのコマンドに渡したいのですが
うまくいきません

runruby.shに
cmd=ruby
${cmd}" $@"
と書いて
./runruby -e 'puts "Hello"'を実行すると
ruby: No such file or directory --  -e (LoadError)と言われてしまいます




758 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:11:50 ]
>runruby.shに


>./runruby -e 'puts "Hello"'を実行すると
runruby.shはどこに行った?
それと、そのrunruby.shによるとrubyに" -e"を渡すことになるぞ。

759 名前:757 mailto:sage [2008/02/09(土) 17:18:29 ]
>>758 申し訳ございません 間違いました
./runruby.sh -e 'puts "Hello"'でした

runruby.shの内容を
cmd=ruby
${cmd} ${@}
にしてみたらエラーメッセージはでなくなったのですがHelloも表示されず終了しましたorz

760 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:22:54 ]
なんで"$@"にしないの?

761 名前:757 mailto:sage [2008/02/09(土) 17:31:24 ]
>>760
できました!!
ありがとうございます

762 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:33:10 ]
つまり、rubyコマンドはコマンドライン引き数の先頭が空白だとファイル名と看做すってことか。

763 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:39:39 ]
bashでしか試してないけど、、、
${cmd}" $@" -> "ruby\ -e" "puts \"Hello\""
$cmd "$@" -> "ruby" "-e" "puts \"Hello\""
"${cmd} $@" -> "ruby -e" "puts \"Hello\""
"${cmd}" "$@" -> "ruby" "-e" "puts \"Hello\""

"$@" -> "$1" "$2" ...
"str$@" -> "str$1" "$2" ...
"str $@" -> "str $1" "$2" ...
って感じで展開されているのかな?

764 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:42:01 ]
3つ目、
x "${cmd} $@" -> "ruby -e" "puts \"Hello\""
o "${cmd} $@" -> "ruby\ -e" "puts \"Hello\""

765 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:59:05 ]
よく見たら、 "$@" じゃなくて " $@" なのかよ。


766 名前:デフォルトの名無しさん [2008/02/11(月) 18:09:03 ]
configureでif test x"$enable_shared" = xyes; thenっていうふうに
xを付け加えて比較してるのをよく見るのですがxはなんのためですか?

767 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:12:40 ]
空文字列のときも大丈夫にするためかな
xつけないとtestで構文エラー出ちゃうでしょ?



768 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:13:32 ]
$enable_sharedがマイナスで始まってる場合を考慮……はconfigureでは不要か。


769 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:38:48 ]
変数をクォートしないとこうなるけど、この場合は関係ないか

$ x='-n 3 -o 1'
$ if test $x = 1; then echo ok; fi
ok


770 名前:デフォルトの名無しさん [2008/02/15(金) 18:24:02 ]
echo `df`
だと1行で出力されて
echo "`df`"
だと複数行出力になるのはなんででしょうか?

771 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 19:00:26 ]
>>770
echo "foo
bar"
のようにダブルクォートの中では、改行が区切り文字にならなくなるから

772 名前:デフォルトの名無しさん [2008/02/15(金) 19:44:39 ]
>>771
ああ、そうか。改行って""の中だと改行として有効なのか。
ふむ、""がないと、単なる区切りになっちゃうわけですね。


773 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:27:13 ]
>>767-768
configure普通autoconfで自動生成するから、
ハイフンで始まっていたり=だったりするのを考慮したコードが
不必要な部分でも出てくるだけ。

774 名前:デフォルトの名無しさん [2008/02/16(土) 02:22:13 ]
自分が所持している映画のDVDのリストを整理しているのですが、
CSV形式で、例えば次のようになっている時に、

"jean-luc godard","1967 week end"
"jean-luc godard","1965 pierrot le fou"
"jean-luc godard","1960 a bout de souffle"



"Jean-Luc Godard","1967","Week End"
"Jean-Luc Godard","1965","Pierrot Le Fou"
"Jean-Luc Godard","1960","A Bout De Souffle"

と一括変換したいのですが、どのようにすればいいのでしょうか?
やりたいことは、
1). まず、2番目のフィールドが"制作年 タイトル"となっているのを"制作年","タイトル"に分けたいのと、
2). 次に、総ての単語の頭文字を大文字にしたい、
ということなんです。

1). は sed で何とかなりそうなのですが、2). が分かりません。

どなたかお助け下さい。
あるいは他に正しいスレがあるようでしたら誘導をお願いします。

775 名前:デフォルトの名無しさん [2008/02/16(土) 02:24:27 ]
すみません。やはり 1). もよく分かりません。
どなたか助けてください。お願いします。

776 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 02:34:45 ]
手抜きですが
perl -pe 's/\b(\w+)/\u$1/g; s/"(\d+)\s*/"$1","/'

777 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 03:11:07 ]
ただシェルじゃないんだよなそれだと。。。
俺もPerlとかでしか思いつかないけど



778 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 03:14:45 ]
>>774
シェルスクリプトだけでは無理でも(1)も(2)もawkでできますね。
取り敢えず(1)はこんな感じ。
awk -F, '{$2 = substr($2, 1, 5) "\",\"" substr($2, 6);} {print;}'

779 名前:デフォルトの名無しさん [2008/02/18(月) 01:45:59 ]
[root@hoge admin]# ls -l | grep forward
-rwsr-xr-x 1 root admin 300 2月 18 01:16 setforward.sh
[root@ibm admin]# cat setforward.sh
#!/bin/bash
# set variable
PATH=/home/
USER=$1
ADDRESS=$2

cd $PATH$1

cat << EOF > .forward
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1"
EOF

cat << EOF > .procmailrc
:0 c
! $ADDRESS
EOF

[root@hoge admin]# ./setforward.sh admin test@example.jp
./setforward.sh: line 14: cat: command not found
./setforward.sh: line 20: cat: command not found

CentOS5.0です。
一般ユーザに、他のユーザの転送設定をさせたいと考えています。
こんな感じでcatコマンドが無いと言われてしまいます。
そのくせ、空っぽの.forwardと.procmailrcファイルが作成されます。
なぜcommand not foundになってしまうんでしょうか?

780 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:51:29 ]
PATHは使っちゃだめよ

781 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:05:32 ]
環境変数PATHはコマンド(実行ファイル)を検索するためのものだから、
違う変数名にしないと駄目よ。


782 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 02:13:29 ]
>>779
大文字の変数は環境変数で使われる事が多いから
小文字を使った方がいいよ。

783 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 08:42:13 ]
>>779
自分で勝手にサーチパスを潰しておいて、見つけてくれないと文句を言うとはなんてぇゆとりだ。

784 名前:779 [2008/02/18(月) 13:10:40 ]
>780-783
ありがとうございます。 m(_ _)m

続けてもう一つ・・・
-rwsr-xr-x 1 root root 300 2月 18 01:16 setforward.sh

このシェルを動かして、一般ユーザで
他の一般ユーザの転送設定をしようとすると、
「cd」のところで"/home/user: 許可がありません"と
弾かれてしまいます。
SUIDをつけてあるのに、何がいけないんでしょうか?

またまたよろしくお願いします。


785 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:26:00 ]
mount nosuid されてるとか。

786 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:38:28 ]
>>784
別に cd する必要ないんじゃないか?

#!/bin/bash
# set variable
path=/home/
user=$1
address=$2

cat << EOF > "$path/$user/.forward"
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1"
EOF

cat << EOF > "$path/$user/.procmailrc"
:0 c
! $address
EOF

787 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 21:46:42 ]
OSによってはスクリプトのsuidを意図的に無視するモノがある。
Linuxとか。




788 名前:779,784 mailto:age [2008/02/19(火) 01:49:15 ]
>785-787
ありがとうございます。

/etc/fstabのマウントオプションは、「defaults」でした。
明示的に「async、auto、dev、exec、nouser、rw、suid」
としてみましたが、ダメです。

そして>786氏のスクリプトもダメでした。
最初のcatで弾かれます。

しかも786氏スクリプトは、ユーザ自身の転送設定を
しようとすると、.forwardファイルが
「"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1"
EOF

cat << EOF > "$path/$user/.procmailrc"
:0 c
! $address
EOF」となってしまい、 .procmailrcファイルは作成されませんでした。

引き続きよろしくお願いします。

789 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 04:03:08 ]
>>788
最初の EOF の前後にごみが入ったんじゃないか?
まあ、見栄えを気にしないのなら echo でもいいけどな。

echo > "$path/$user/.forward" "\"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1\""
echo > "$path/$user/.procmailrc" ":0 c
! $address"

> 最初のcatで弾かれます。
原因は多分 >>787

790 名前:779,784 [2008/02/20(水) 04:11:45 ]
さっき本屋で分かっちゃいました。

CentOS徹底入門 第2版
www.amazon.co.jp/dp/4798114626/
に書いてありました。
>787さんの通りでした。

なんとかならんものか、CentOSスレッドででも
質問してみます。
ありがとうございました。


791 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:25:28 ]
>>790
sudo を(きちんと設定して)使えば。

ていうか、一般ユーザに他のユーザの転送設定をさせる理由がわからん。

792 名前:779,784 [2008/02/20(水) 14:07:08 ]
>791
ありがとうございます。

自社でちっさいデータセンタを持っています。
で、その中に他の会社のドメインと同居してるんです。

複数ドメインを管理するGUIのソフトが未熟で、
会社に届いたメールを携帯に転送する場合があるんですが、
転送すると全部そっちに転送されちゃうんです。
それを回避するには、今のところCUIで手書きして
あげるしかないんです。

私は情シス部隊所属、DCは開発部隊のもの。
与えられたドメインごとの管理者ユーザは、CUIだと
他のユーザの$HOMEに入れないんですよ。
それで、SUIDつけたスクリプトならイケるんじゃないかと
考えた次第です。

なんか表現が未熟ですがご理解いただけましたでしょうか?


793 名前:デフォルトの名無しさん [2008/02/27(水) 12:09:36 ]
教えてください
日付の切り出しかたわかりません
data.txt
2/1 XXXXXXXX
2/2〜2/5 XXXXXXXXX
2/7〜2/8 XXXXXXX
2/12 XXXXXXXXXX
2/20〜2/28 XXXXXXXXX

と書かれた行があり 今日より以前の日付の行を削除するにはどうすればいいですか

正規表現板で聞いたのですが正規表現の問題と言うよりプログラムの方でたずねる
みたいナノデ
日付に〜が入っているためなおさら難しくさっぱりわかりません

794 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 13:02:15 ]
シェルスクリプトで実装するのか?そうでないならスレ違いだが

795 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:19:20 ]
>>792
今日より以前を削除とは?

今日が2/27で
2/5〜2/28 xxxxxx
というデータを

2/27〜2/28 xxxx
にしちゃうのか、そのまま生かすのか?

796 名前:デフォルトの名無しさん [2008/02/27(水) 16:57:32 ]
初心者な質問ですみません。
あるディレクトリの中に数百のファイルがあり、
AAA_01.txt
AAA_02.txt
...
のようなファイル名になっています。

それを、下記のように、AAAの箇所をDATE関数で日付を取得したいのです。
20080226_01.txt
20080226_02.txt
...

どのようにすればよろしいでしょうか。


797 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 17:15:22 ]
>>796
日本語で



798 名前:デフォルトの名無しさん [2008/02/27(水) 17:27:00 ]
>>795
今日が2/27だと
2/20〜2/28 XXXXXXXXX
の行を残してそれ以前の日付の行を削除したいのです。

799 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:02:38 ]
あーなるほど、PIMのスケジューラみたいなものを考えているってことか。
シェルスクリプトだけでどうこうできるフォーマットじゃないし、チルダの所為で
awkかなんかの一行野郎で済ませることも難しそうだ。

800 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:11:01 ]
バカみたいにawk使えばいけそうじゃない?
実行して試してないけど下みたいな感じで。

DATE=`date +"%m/%d"`

M=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $1}' `
D=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $2}' `

while read LINE;do

if [[ `echo ${LINE} | awk '{print $1}'` = [*][〜][*] ]] ;then
MM=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $1}'`
DD=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $2}'`
else
MM=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $1}'`
DD=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $2}'`
fi

if [[ ${M}=<${MM} && ${D}=<${DD} ]] ;then
echo ${LINE} >> ${OUT_FILE}
fi

done < ${IN_FILE}

みたいな。



801 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:14:11 ]
あ、dateコマンドで出てきた数値の頭に0がついてたらだめかも。
そのへんは0区切りで$2を取るとか適当にやってください。

802 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:51:41 ]
bashで数値を10桁程の数値をカンマ区切りにしたいのですが、どのような書き方をしたらできるでしょうか?

803 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:57:06 ]
>>800
それはOneLinerとは言えないんじゃ……と突っ込もうと思ったら
OneLinerを腐るほど呼んでたのねw

804 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 05:18:51 ]
>>802
標準のコマンドで何かありそうなきもするし、
awk とか sed とか perl とかなら OneLiner で済みそうだが
あえて bash 限定で書いてみたぞ。
expr 使えば bourne sh でも動くようになると思う。

#! /usr/bin/env bash
num=$1
result=''
figure=$[ ${#num} % 3 ]
(( figure > 0 )) && read -n "$figure" result <<< "$num"
while read -n 3 i ; do
 [[ -n "$i" ]] && result="${result},${i}"
done <<< "${num:$figure}"
echo "${result#,}

805 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:41:18 ]
expr使っていいんだったらexpr $num : '.*\(...\)'で済んじゃうだろ。
以下1行に詰め込めないこともないawk解。
{
    out=""
    for (l=length(src=$0) - 3; l>0; l-=3) {
        out="," substr(src,l+1,3) out;
        src=substr(src,0,l);
    }
    print src out;
}

806 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 21:28:47 ]
>>804
>>805
なるほど、さまざまな方法があるんですね。
とても参考になりました、ありがとうございました。

807 名前:デフォルトの名無しさん [2008/03/04(火) 17:15:40 ]
cシェルについて質問させてください。
/(スラッシュ)一文字にマッチさせるには
どのように記述すれば良いでしょうか。
以下のようにやりましたが、うまくいきません。
よろしくお願い致します。


#!/bin/csh -f

set etc = /
echo $etc

if ($etc =~ ^/$) then
echo ok
else
echo ng
endif




808 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:24:54 ]
sh系みたいにtestコマンドを使って、if [ -$etc == -/ ] then としたらどうだろう。

809 名前:デフォルトの名無しさん [2008/03/04(火) 17:36:26 ]
>>808
即レスありがとうございます!
出来ました<(_ _)>

810 名前:デフォルトの名無しさん [2008/03/10(月) 15:02:33 ]
while read lineでファイルを読み込んで
その行にABCと言う文字があるかないか判定して
あれば 処理1
なければ 処理2という if文での書き方教えてください

811 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:33:37 ]
case $line in
*ABC*)
処理1
;;
*)
処理2
;;
esac

ってif文でかよ!



812 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:20:20 ]
grepと組み合わせないと無理か。
1行ごとにgrepなんか起動したくないが。

813 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:24:46 ]
line2=${line%%ABC*}${line##*ABC}
# で削って
if [ ${line} = ${line2} ]; then
# 処理1
else
# 処理2
fi
# とか?

814 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:49:58 ]
if [[ $line =~ ABC ]]; then
echo matched
else
echo did not match
fi
こういうこと?

815 名前:デフォルトの名無しさん [2008/03/12(水) 23:35:10 ]
1レコードのXMLを、シェルを使って字下げなどを自動で行って表示させたいのですが、
なにかうまい方法はないでしょうか?

---------------------------
<all><a>123</a><b><c>456</c><d>789</d></b></all>



<all>
<a>123</a>
<b>
<c>456</c>
<d>789</d>
</b>
</all>
------------------------

というような感じで・・・

816 名前:デフォルトの名無しさん [2008/03/12(水) 23:37:16 ]

すいません、4タブで字下げされてると思ってください。


817 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:48:55 ]
整形式XML全般を扱うというのは、かなり難しいんじゃないか?
perlとかrubyとか使うべき。
よほど単純化されてるんなら、まずはタグ1個が1行になるように改行して、
開始タグなら字下げを増やして、終了タグなら字下げを減らして、って感じか。
ただこれでは <c>456</c> とか無理だが。



818 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:26:53 ]
>>815
おおざっぱに手順を考えてみた。
めんどくさそうなので実装はまかせた。

1. 行の最初にあるタグとその閉じタグの間に他のタグがあれば、タグの頭で改行する。
  この時にインデントの深さをタブ幅文プラスしてタグ名を記録する。
2. インデントの深さが 0 以上ならインデントする
3. タグの間にタグが無いなら閉じタグで改行
4. 記録したタグの閉じタグを見つけたらインデントの深さを減らして記録から削除。
5. 1-4 繰り返し

819 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:29:03 ]
xmllint --format に食わせればおk

820 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:13:44 ]
cron などによってある時刻に自動的に起動させるプロセスで、
実行開始から xxxx秒 とか経過してもまだ終了しない場合
強制的に終了させる方法にはどんな方法があるでしょうか?

そして、その方法で注意しておかなければならない
点とかあれば教えてください


821 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:00:29 ]
起動したいプロセスをバックグランドで起動して、
必要な秒数sleepしたら問答無用でkillするとか。
そのプロセスが、適切な後処理のために特殊なシグナルを利用できるのなら、
killでそのシグナルを指定すればいい。

822 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:33:55 ]
>>820
ロックファイルを作るタイプはプロセスだけ殺しちゃうと
困った事になるかもしれない。

823 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:44:02 ]
だからそういうプロセスは適切なシグナルハンドラを用意するべきなんだよね。

824 名前:デフォルトの名無しさん [2008/03/25(火) 22:12:46 ]
Cシェル(ソラリス)について教えてください。
test.txtに、helloが入っていたら、OK、
無ければ、NGと判定させたいのですが、
以下のようにしてもIF文が不正ですと言われます。
Bシェルでは、うまくいくのですが、Cシェル用の記述方法等
ありましたらアドバイスください。

if ( cat test.txt | grep "hello" ) then
    echo OK
else
    echo NG
endif

825 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:14:58 ]
$status

826 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 00:19:08 ]
>cat test.txt | grep "hello"
なんでgrep "hello" test.txtにしないんだ?

827 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 08:23:26 ]
B shell 使えばいいじゃん。



828 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:06:37 ]
ファイル 1.txt 2.txt 3.txt test.bash が存在するディレクトリで以下の
内容を実行するとなぜ1が返ってきますか?4になぜならないのかわかりません。

--test.bash--
#!/bin/bash
current_files=$(ls)
echo ${#current_files[@]}

829 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:32:48 ]
for で current_files の中身を見てみると分かるかと。

for file in "${current_files[@]}"; do echo "[[[$file]]]"; done

830 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:59:01 ]
>>828
× current_files=$(ls)
○ current_files=( $(ls) )

空白入りのファイル名があると期待通り動かないから気をつけろ

831 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:19:09 ]
いつもそこで悩むんだけど、
空白入りのファイル名があっても大丈夫な方法ってないの?

832 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:46:20 ]
>>831
つperl
つruby
つpython


833 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:49:45 ]
つzsh

834 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:54:25 ]
>>831
あるにはあるが、正直面倒。

1) 一時的 IFS 変更
IFS=$'\n' current_files=( $(ls) )

2) for + ワイルドカード
for file in * ; do
current_files[${#current_files[@]}]=$file
done

3) while + read + here strings (パイプは不可)
while read file ; do
current_files[${#current_files[@]}]=$file
done <<< "$(ls -1)"

835 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:18:29 ]
>>834
ほうほう・・・。3 とか凄いですな。

836 名前:828 mailto:sage [2008/03/28(金) 09:29:29 ]
うぉぉ・・!激しく助かりました。
シェルなんて初めてなんでw奥が深いな。

837 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 23:14:01 ]
ファイルから読んだ文字列をfindに引数として渡して、
ファイル一覧を取得するスクリプトを作りたいのですが、うまくいきません。
以下の内容でおかしな部分があったら指摘をお願いします。

ディレクトリ構成
dir
+---nkf_args
+---filelist.sh
+---a.cpp
+---b.cpp
+---a.h
+---b.h

----------------------------
nkf_argsファイル
-name "*.cpp" -or -name "*.h"
----------------------------
filelist.shファイル
#!/bin/sh

#nkf_argsファイルから引数文字列取得
nkf_args=`cat nkf_args`

#findで条件に一致したファイルリスト取得
files=`find ./ $nkf_args`
for filename in files
do
echo "$filename"
done




838 名前:837 mailto:sage [2008/03/30(日) 23:16:40 ]
続き

スクリプト実行結果

予想値
a.cpp
a.h
b.cpp
b.h

結果
出力無し

ここまで
--------------------------------



839 名前:837 mailto:sage [2008/03/30(日) 23:19:28 ]
ちなみに引数ファイルに書かれているものの
ダブルクォーテーションを外すことで
*.cppに関する結果は得られましたが、
*.hに関する結果は得られませんでした。

840 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:03:22 ]
取り敢えず、filelist.shの1行目を#!/bin/sh -xにして実行してみたら?

841 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:32:52 ]
そのfindでのORって-oだったりしませんか?

842 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 00:35:38 ]
>>841
POSIXのfindなら、-orは-oと同じ(とmanに書かれている)だから大丈夫。

843 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:12:40 ]
>>839
そのやり方を試してみました。
--------------------------------------
出力
++ cat nkf_args
+ nkf_args='-name "*.c" -or -name "*.cpp"'
++ find ./ -name '"*.c"' -or -name '"*.cpp"'
+ files=
--------------------------------------

出力結果を見るとダブルクォーテーション部分が、
さらにシングルクォーテーションで囲まれるから駄目なのかと思い、
ダブルクォーテーションを外してやってみました。
--------------------------------------
出力
++ cat nkf_args
+ nkf_args='-name *.cpp -or -name *.h'
++ find ./ -name a.cpp b.cpp -or -name a.h b.h
find: paths must precede expression
Usage: find [path...] [expression]
+ files=
--------------------------------------
ダブルクォーテーションを外した結果は
作業ディレクトリにあったファイル名に置き換えられて
無効な引数になってしまいました。

以上の結果を踏まえて、条件に合うファイルがないディレクトリから
スクリプトを実行した結果、想定していた結果が得られました。
ただ、根本的な解決になっていない(どういう動作をするか分かっていないと、正しい結果が得られない)ので、
これをディレクトリ状態に依存しないようにしたいのですが、どういう方法があるのでしょうか?
よろしくお願いします。

844 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:42:39 ]
files=`find ./ $nkf_args`

files=`eval find ./ $nkf_args`
としたらうちでは上手くいったよ。

845 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:56:20 ]
>>844
試してみたところ、想定している結果が得られました。
皆さんありがとうございました。


846 名前:デフォルトの名無しさん [2008/04/02(水) 09:40:50 ]
Cシェルで、以下のようなテキストファイルに保存した内容と
コマンドを組み合わせた処理をしたいと考えています。

・command.txtの内容
 grep httpd

/bin/csh -f
set command = `cat command.txt`
ps -ef | "command" > kekka.txt

上記のように試したのですが、書式が不正の為、
エラーとなります。
ps -ef | grep httpdの実行結果を、kekka.txtに保存したのですが、
どのようにすれば良いでしょうか。アドバイスお願いいたします。



847 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 09:51:35 ]
"command" → $command



848 名前:デフォルトの名無しさん [2008/04/02(水) 10:44:30 ]
>>847
即レスありがとうございます。
ps -ef | "$command" > kekka.txt としても
grep httpd: コマンドが見つかりません。という
エラーが発生します。
ps -ef | grep httpdの実行は可能です。
何が問題となっていますでしょうか。


849 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 10:52:50 ]
アホ

850 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 11:38:28 ]
847のすべての文字を100回音読しなさい

851 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 11:38:37 ]
>>848
#!/bin/sh
command=`cat command.txt`
ps -ef | $command > kekka.txt


852 名前:848 [2008/04/02(水) 16:06:20 ]

すみません。よく読んでダブルクォーテーションを外したところ、
正常に実行できました。ありがとうございます。
恥の書き捨てでもう一つ質問させてください。
コマンドにパイプ繋ぎで複数の指定をしたいと思ってます。
command.txtの内容が、grep httpdであれば実行できるのですが、
grep httpd | grep -v grepとすると、以下のようなエラーになります。

> grep httpd | grep -v grep
> grep: | をオープンできません。
> grep: grep をオープンできません。
> grep: -v をオープンできません。
> grep: grep をオープンできません。

これを防ぐ方法は無いでしょうか。
もしくは、command.txtに「ps -ef | grep httpd | grep -v grep > kekka.txt」と
書いてあって、それをそのまま、Cシェルで実行する方法は無いでしょうか。

853 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 16:13:03 ]
csh -f command.txt
csh -fc "$command"
csh -fc "`cat command.txt`"


854 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 16:14:04 ]
>>852
ttp://www.kiso.tsukuba.ac.jp/~makimura/text/node239.html

855 名前:848 [2008/04/02(水) 17:07:37 ]
>>853
ありがとうございます。<(_ _)>

856 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:08:25 ]
>>848
source command.txt

857 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 23:56:01 ]
シェルでroot権限で実行してるのに、
ファイルが作れないとか、パーミッションエラーが出る
場合があるんだけどどうしてなの?
OSが同じ他のマシンじゃ正常に実行できる
細かいところでマシンの仕様がちがってるんだろうけど
なんでなんだよ。root権限なのに。。。



858 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 00:29:17 ]
>>857
情報が少ないな。少なくとも
# ls -ld .
位は欲しい。

859 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 00:36:06 ]
root でも root の書き込み属性がないと書き込めないよ

860 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 02:18:59 ]
BSD系ならchflagsあたりが関係してるかもしれん

861 名前:デフォルトの名無しさん [2008/04/29(火) 22:02:37 ]
bashなのですが
$ tgts=`find . -name \*.\[hc\]`
$ for tgt in $tgts; do
cp ${tgt} ${tgt}.orig
done

cp: `ここにファイル名ずらずら` にアクセス中: File name too long
と言われてしまいます。

tgts=`find . -name \*.\[hc\] -printf "%p "`としてIFS=" "でも同じでした。
tgts=`find . -name \*.\[ch\] -print0`だと
cp: `./aaa.h' と `./aaa.h' は同じファイルですとか言われてしまいます><

862 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 22:08:13 ]
エラーの原因はよくわからないけど、パイプするかfind -execするかしたらどう

863 名前:861 mailto:sage [2008/04/29(火) 22:27:15 ]
すみません
bashでなくてzshでした
bashだとちゃんと動きました

864 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 22:29:44 ]
zshなら$tgtsが単語に分割されないから。${=tgts}だといい

865 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 19:00:56 ]
シェルスクリプト修正の工数見積もりにあたって、修正対象のスクリプトのステップ数を出したいのですが、みなさんはどのような方法で行っているのでしょうか?
よろしくお願いいたします。

866 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 20:17:06 ]
>>865
先に(こっそり)スクリプトを書いて、実績を「工数見積」として出す。

シェルスクリプトを「ステップ数」で見積もるなど馬鹿馬鹿しくてやってられない。
ステップ数換算で、ど〜の・こ〜の言うのは太古のCOBOLの悪習。

867 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 06:24:34 ]
>>865
そういう話はマ板向きじゃないのだろうか。

まあそれはそれとして、シェルスクリプトなんてやってることは
一般のアプリケーションプログラムに比べて小さくて特定されてるんだから
修正するのは新しく作り直すのと同義だろ。
新規作成と同額でいいんじゃね?

/etc/rc.d/並みの複雑怪奇なスクリプトだったらこの話はあてはまらないが、
そういうのはperl,python,rubyで書かないのが間違い。




868 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:10:59 ]
echo "hoge" | read Hage
echo $Hage

これって読み込んでくれないの?

869 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:57:12 ]
>>868
echo "hoge" | (read Hage)
の状態になって、サブシェルの変数をセットして終わる。
echo "hoge" | (read Hage; echo $hage)

zshなら大丈夫。


870 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:00:26 ]
読み込むよ。これ試して味噌。
--
echo foo | (read; echo $REPLY)
--
って書くために検証してたら先を越されたw

871 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:37:59 ]
>>869,>>870
thx.
でもよくわからない。

#!/bin/sh
alert --info "Whitch Resolution" "1600x1200" "1280x1024" "1024x768" >RES
read Res <RES && rm RES
echo "Resolusion is "$Res
case "$Res" in
"1024x768" ) echo "mode 1024 768 32" >/boot/home/config/settings/kernel/drivers/vesa ;;
"1280x1024" ) echo "mode 1280 1024 32" >/boot/home/config/settings/kernel/drivers/vesa ;;
"1600x1200" ) echo "mode 1600 1200 32" >/boot/home/config/settings/kernel/drivers/vesa ;;
esac
#shutdown

これの$Resを得たいんだが、パイプで取得できないのかと思ってのですが。

872 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 00:04:03 ]
できないからファイルに入れてるってことでしょ。
ただ、
Res=`alert ...`
とすりゃいいのにとは思う。

873 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 00:25:29 ]
>>872
Res=`alert --info ・・・・`でいきます。
Res= `じゃダメなのか、なるほど。

874 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 06:03:17 ]
bashで乱数を用いてで数値3桁(000〜999)を表示させるにはどうしたらいいでしょうか?
hoge=`${RANDOM} | cut -c 2-4 `
echo $hoge
としてるんですがこれだと表示が2桁や1桁のときに桁数が揃わなくて困っております。

875 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:33:30 ]
pりんtf

876 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:39:08 ]
”パーセントさんエスバックスラシュn” $ほげ

877 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:46:34 ]
あっ、間違った、>>875,876は忘れてくれ。



878 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:51:46 ]
あってんじゃん。
printf "%03d\n" $hoge

879 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:32:18 ]
おっ、惜しかった、0が必要なんですね。勉強になった。

880 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:39:35 ]
質問した本人はどこに消えたんだろう?

881 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:08:31 ]
/dev/nullの闇に呑まれたのだった・・・


882 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:26:59 ]
歓呼工面でなかってよかったのう。

883 名前:デフォルトの名無しさん [2008/05/22(木) 20:42:02 ]
今、プロセス監視ツールについて調べてまして
プロセスに常駐するシェルを作りたいと思ってます。
ps -ef | grep sh を実行して、常時起動しているシェルというのは、
どうやって書けばいいのでしょうか。
また、この際に表示されるPIDは、常時同じ値にしたいと思ってます。
アドバイスお願いいたします。

884 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:58:01 ]
シェルをつくるのですか。
jubilo.cis.ibaraki.ac.jp/~isemba/PROGRAM/CPROG/611.pdf
ここいら辺を参考に頑張ってください。

885 名前:デフォルトの名無しさん [2008/05/22(木) 21:24:52 ]
すみません。プロセスが常駐するシェルスクリプトを
作りたいのです。

886 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:33:17 ]
#!/bin/sh
while :; do :; done

887 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:43:42 ]
OSによってはwatchというコマンドがあるかもしれない。
watch ps -ef

なければ>>886のdoの中身の:をps -ef ; sleep 10とかにすればいいんじゃね。




888 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:05:10 ]
>>886-887
ありがとうございます
今すぐ試せないんですが、Watchやってみます。
sleepはやってみたんですが、シェルスクリプトが
プロセスとして残るのではなく、sleepコマンド自体の
プロセスとして残ってしまいました。
>>886は無限ループというのは分かるんですが、
負荷が上昇したりしないでしょうか。

889 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:18:08 ]
sleepは当然残るけど、親プロセスであるshも残ってないか?

890 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:24:06 ]
#!/bin/sh
kill -19 $$


891 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:36:54 ]
>>889
それが残らなかったんです。linuxなんですが・・・。
ディストリビューションは多分centosです。
SOLARISはshが出てたんですが・・

892 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:46:28 ]
つか、常駐して、何させたいのよ

893 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:11:31 ]
プロセス監視ツールの検証をしたいんです

894 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:36:36 ]
シェルスクリプトは監視される側?
多少負荷あがっても無駄にループしてりゃいいじゃん
気になるなら、: を sleep 1 にでも変えて

895 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:37:20 ]
DOSのTSRみたいなのを作りたいってことかと思ったら違うのか。
もしかしてcronで定期実行させる方が目的にかなってたりしないか?

896 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:39:00 ]
sleepしている間に食うリソースってプロセステーブル1エントリと、
コードが常駐する分のメモリ?


897 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:46:18 ]
あと標準入出力&エラー出力のファイルデスクリプタとPTYのマスター&スレイブ (閉じてなければだが)



898 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:54:29 ]
>>895 私もそう(TSR)思ってた上で冗談のつもりで>>890
を書いたんだが実はそういうのが欲しかったとは。
だまされた気分だぜ。


899 名前:デフォルトの名無しさん [2008/05/24(土) 01:44:25 ]
エロイ人教えて
$1が a b
$2が c d

出力結果
a c
a d
b c
b d

どうやるの?




900 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 03:42:38 ]
>>899
まず出力結果に至るルールを書かんかい
求めたいものが直積とは限らんからな

901 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 07:53:29 ]
A="a b"
B="c d"
for a in $A; do for b in $B; do echo $a $b; done; done

902 名前:899 [2008/05/24(土) 12:08:55 ]
>>900
やりたいことは"シェルをテストする"ためのシェルを考えてる。
テストしたいシェルに引数を与えて出力結果を別ファイルに出力する。
シェルはkシェル。
OK?

>>901
サンク
あと、引数にスペース(空白)も含めたいんだけど
A=a b スペース(空白)
A=c d スペース(空白)

出力結果
a c
a d
a
b c
b d
b
c
d

よろしくです

903 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 12:14:32 ]
A="a:b::"
B="c:d::"

OLDIFS=$IFS
IFS=:
for a in $A; do for b in $B; do echo $a $b; done; done
IFS=$OLDIFS

頭に蛆でもわいてるのか

904 名前:899 [2008/05/24(土) 12:37:21 ]
>>903
おぉーはぇー
サンク!
おめ〜口は悪いけど面倒見の良いエロイ椰子だな
ありがと!

905 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 07:32:25 ]
scriptの中から呼び出されたprogramの処理が終了していることを
知るにはどうしたらいいですか?

906 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 08:09:45 ]
kill -0 $! && echo alive

907 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 08:55:38 ]
thx!



908 名前:デフォルトの名無しさん [2008/05/25(日) 23:52:01 ]
root以外で動かすスプリクト内で特定のファイルをchownで所有者を
変更したいんだけsudoもexpectも使わずにできる?

909 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:07:45 ]
Linuxのようにスクリプトのsetuidを無視する環境なら、
スクリプトを呼ぶだけの実行ファイルを作ってそっちをsetuidする。


910 名前:デフォルトの名無しさん [2008/05/29(木) 23:13:02 ]
tarファイル内のデレクトリとかファイルをリネームできる?
あるいはリネームしながら展開できる?

911 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:05:16 ]
>>910
スレ違い。アーカイバ関連のスレで訊くべし

912 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:17:12 ]
この板的には、tarのフォーマットを調べて、
リネームするツールを作ろうという趣旨かも。
しかしスレ違いか。

913 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:42:54 ]
特定の名前対応付けファイルにしたがって、
一旦目的のファイル/ディレクトリを展開して
mvで目的の場所にリネーム移動させるものを
つくるというスクリプトならかろうじて・・・


そこまでの意図はないと思うが。

914 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:51:43 ]
ヘッダー情報だけ書き換えて展開は本物のtarにやらせれば良い。
前の勤務先で作ったときは50行(perl)くらいで出来たような気がする。

915 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 20:04:48 ]
文字列中のスペースをエスケープシーケンス付けて"\ "に変換する
スクリプトを作りたいのですが、どうしたら良いでしょう?
sed を使うと連続スペースを
1つのスペースとして扱われてしまい上手く行きません。

"sample sample"(スペース2以上) っていう文字列を "sample\ \ sample"にしたい。

916 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:28:33 ]
~$ echo "sample sample" | sed -e 's/ /\\ /g'
sample\ \ sample


917 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:44:45 ]
>916
あれ、それで行きます?ってか家のCygwin上でも出来てるな
これでも出来なくて、2〜3時間いろいろ試して、うんうん唸ってたんですが、
バージョンや処理系で動作がちがうとかないですよね・・・
月曜にリトライします。なんか馬鹿やったかな?



918 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:51:54 ]
>>917
gが付いてなかったんじゃないのか?

919 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 23:25:04 ]
いや、そういうのではなく、記憶が確かなら

echo "sample     sample" | sed -e 's/ /:/g'
(sampleの間は連続半角スペースね)
ってやったら、

"sample:sample" スペースを一つとして扱われた
みたいな結果しか帰ってこなかったんだけど。
何かを間違えたんだろうね多分。なにを間違えたやら。

920 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:59:01 ]
ubuntu@ubuntu-desktop:~$ echo "sample sample" | sed -e 's/ */:/g'
sample:sample

921 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 03:01:29 ]
勘違いす。>>920は消去。

922 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 03:30:54 ]
#!/usr/bin/fontforge

仲間に入れてもらえますか?

923 名前:デフォルトの名無しさん [2008/06/04(水) 22:42:10 ]
相談に乗ってちゃぶ台!

任意のディレクトリ下の全てのファイルの更新日時を
フルパスで1行づつ取得したい。また更新日時をyyyymmdddHHMMSSで
取得したい。

例)
/home/usr01/aaa/bbb.txt 20080101125525
/home/usr01/aaa/ccc.tar 20080123195530
/home/usr02/ddd.txt 20070811210121
/home/usr03/eee/fff/ggg/hhh/jjj.cfg 20060301042133

よろしくお願いします、みなさん

924 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:14:40 ]
簡単すぐるからパス

925 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 23:59:00 ]
OSによっては簡単すぐるけど、一般にはそうでもないし、perlが最適だったりもする

>>923
OSを明かした方が適切な回答があるかもよ

926 名前:デフォルトの名無しさん [2008/06/05(木) 00:09:17 ]
> 924,925
レス、さんく
とりあえず find でフルパスは取得できよ。
あと、タイムスタンプなんだよね。
OSはAIXでkshでつ

927 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 01:22:49 ]
AIXは、statもないし、lsに-Tもないんじゃないかな。
テキストファイルだけなら diff -c で /dev/null と比較して、
先頭の行を加工すれば何とか取得できるかもしれない。

けど、perl をすすめる。



928 名前:デフォルトの名無しさん [2008/06/05(木) 01:39:28 ]
>927
ありがと
よく似たコマンドでistatってのがあったけど
月表示が英語なのよ・・・

$ istat bbb
デバイス 10/8 上の Inode 89 ファイル
保護 : rw-r--r--
所有者 : 8(*****) グループ : 0(system)
リンク・カウント : 1 長さ 4 バイト

最後の更新: Thu Jun 5 01:35:24 JST 2008
最後の修正: Thu Jun 5 01:35:24 JST 2008
最後のアクセス: Thu Jun 5 01:35:24 JST 2008

929 名前:デフォルトの名無しさん [2008/06/05(木) 02:12:17 ]
ひとつ教えてください。
ファイルからデータを収集して
txtファイルに出力するようなシェルを作成しているのですが
整形がうまくいきません。

touch test.txt
echo "ABCDEF 1_0_2_3" >> test.txt
echo "LMN 3_2_4_5" >> test.txt

当然中身は
ABCDEF 1_0_2_3
LMN 3_2_4_5
となるんですが

ABCDEF 1_0_2_3
LMN 3_2_4_5
としたいんです。

何かいい方法ありませんか?
tabのような整形方法を考えたんですがうまく揃わないので
文字数指定する方法あれば教えていただきたいんですが。。。
(C言語のprint文での %10s のようなのができれば理想ですが)

930 名前:デフォルトの名無しさん [2008/06/05(木) 02:12:56 ]
ずれーたorz
番号のところが揃うようにしたいです。
ご教授ください。

931 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:14:20 ]
なら、12種類しかないんだから、caseで分岐して、
一致した月の数字を返すっていう関数書けばいいんじゃ?


932 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:20:01 ]
>>929
OSによっては、まさにprintfがあるけどな。

933 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:24:10 ]
# echo "ABCDEF 1_0_2_3" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" > test.txt
# echo "LMN 3_2_4_5" | gawk "{printf(\"%10s %s\n\",\$1,\$2);}" >> test.txt
# cat test.txt
  ABCDEF 1_0_2_3
    LMN 3_2_4_5



934 名前:デフォルトの名無しさん [2008/06/05(木) 02:24:20 ]
ファイルの比較するシェルを作りたいのですが、
うまくいきません。

file_list.txt
-- 内容 --
ABC
DEF
GHI


このファイルとフォルダ内の内容が一致するかチェックしたいのですが
何かいい方法ありませんか?

ls -Rをtxtファイルに吐き出してcmpを使う方法と
read line使った後ls -Rとgrepをつかって比較する方法を思いついたのですが、
もっと綺麗な方法ってあるでしょうか?


935 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:25:25 ]
busyboxにprintfあったよ・・・・・orz

936 名前:デフォルトの名無しさん [2008/06/05(木) 02:28:49 ]
>>932
マジですかorz
調べたりなさ杉。ありがとうございます。

>>933
今現在確認できないので研究室についたら試してみます
ありがとうございました。


937 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 02:35:12 ]
おまえら、いいかがんシェルを作るな。シェルスクリプトを作れ。



938 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 04:38:56 ]
Cに似たシェルスクリプト言語ってある?

939 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:29:08 ]
cshでスクリプトは書くな

940 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:41:31 ]
外部コマンド呼ぶのにいちいちsystem()とか、それさえなくて
fork()とexecve()を駆使しなきゃいけないようなスクリプト言語だとしたら、
かなりいや。

941 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:05:21 ]
while read Filenm
do
if [ -e $Filenm ] ; then
echo $Filenm" ○"
else
echo $Filenm" ×"
fi
done <file_list.txt

942 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:45:57 ]
cat file_list.txt | group { Test-Path $_ }

943 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 09:47:16 ]
>>940
どうして?

944 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 19:28:20 ]
インタープリタ言語はスレ違いでしたね
スレタイがシェルスクリプトだもんな
すっかり勘違いしてた

945 名前:デフォルトの名無しさん [2008/06/07(土) 18:48:20 ]
cpioのマルチボリューム保存で1本目が終わると
2本目の前にデバイス名の入力を施すメッセージが表示されます。
その際、そのメッセージ(多分、標準エラー出力)を表示させないで
自前の処理で「2本目の保存を行いますか?(y/n)」みたいに行いたいのです。

標準エラー出力をどう扱うかが肝だと思うのですが、良いアイデアが浮かびません。

何か良いヒントはありませんでしょうか?(Bシェル(OS:Solaris))


946 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:35:53 ]
つ expect

947 名前:デフォルトの名無しさん [2008/06/16(月) 11:34:15 ]
#!/bin/csh -f

set s=$1
set t=$2
set f=$3

cat $f | tail +$s | head -$t

exit 0
echo ------------------

以上を改良しろ、と言われました。みなさんならどうしますか?教えて下さい。



948 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 11:47:55 ]
#!/bin/csh -f
tail +$1 $3 | head -$2

949 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:01:05 ]
rm -f /bin/csh

950 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:49:14 ]
>>949
Permission denied

951 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:14:52 ]
以下のスクリプトで
echo をした時に
AAAeo kakikukeko sasisuseso
AAAituteto naninuneno hahihuheho
と表示されるのですが
どうすれば
tatituteto naninuneno hahihuhehoAAA
と表示できるのでしょう?
環境は実行シェルはbashです


FUGA="'AAA'"
awk '{print;}' hoge.txt | while read LINE; do
    MOGE=`echo "$LINE" | cut -d , -f 2-`
    echo "$MOGE""$FUGA"
done

hoge.txt
a,aiueo kakikukeko sasisuseso
b,tatituteto naninuneno hahihuheho



952 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:55:37 ]
>>951
やりたいことが判らん。awkを使う理由が判らん。手元で再現できん。
つーか、折角awkを使うならawk -F, '{print $2 "AAA";}'じゃいかんの?

953 名前:951 mailto:sage [2008/06/16(月) 15:09:30 ]
>>952
レスありがとうございます

やりたい事としては
ファイルから1行読み込んで1行をパースし
FUGAと連結した文字列を別のコマンドを実行させたい

です

1行の内容としては
aaaaa,hogehoge mogemoge aiueo

という風に書きましたが実際には
aaaa,SQL文
という感じで半角スペースやカンマが入ります



954 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:16:15 ]
>>953
他人の話をよく聞きなさいって言われたことないか?
>952をよく読んで、為すべきことを為してから出直せ。
それから、自分の書いた文章を読み返す癖をつけた方がいい。
とてもじゃないが、他人に読んでもらう文章になっていないぞ。

955 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 15:48:40 ]
>>954
>>952に書いてある内容は理解しています

    MOGE=`echo "$LINE" | cut -d , -f 2-`

の代わりとなる部分だと言うことは解っているのですが
>>953にも書いてある通りカンマ等が入ってしまう為記述が簡単な
    MOGE=`echo "$LINE" | cut -d , -f 2-`
を選びました

951にカンマ等が複数入る可能性があるという事を
書かなかったのはすみませんでした


956 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:11:07 ]
cut -d',' -f2-

957 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 16:18:10 ]
~> L="123,uio poi"
~> LB=`echo $L | cut -d',' -f2-`
~> echo $LB
uio poi
~>



958 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:05:34 ]
違ったか・・・

959 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:03:53 ]
tr -d '\015' < hoge.txt | awk ...


960 名前:デフォルトの名無しさん [2008/06/17(火) 11:26:10 ]
#!/bin/csh -f

set com=$0

if ($#argv < 1 || $#argv > 3) then
echo Usage:$com start_line total_lines '[file_name]'
exit 1
endif
if ($#argv == 2) then
set s=$1
set t=$2
tail +$s | head -$t
else
set s=$1
set t=$2
set f=$3
cat $f | tail +$s | head -$t
endif

exit 0
echo ------------------

これだとエラーがでます。どなたか改良してください。お願いします。


961 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 11:27:38 ]
酷いマルチ

962 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:28:46 ]
bashで
while read LINE; do
echo $LINE
done < ファイル

とするとファイルに含まれてるタブ文字が
半角スペースに変換されて表示されるのですが
そのまま取り出したい場合どうすればいいのでしょう?

cat ファイル | whileやfor LINE in `cat ファイル`等はやってみました


963 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 13:57:10 ]
echo "$LINE"


964 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 14:05:16 ]
>>963
うまくいきました
ありがとう

そんな単純な事に気づかなかったとはorz


965 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:30:18 ]
KORNシェルの質問です。よろしくお願いします。

テキストファイル

id=tanaka age=25
id=takahashi age=2           
id=suzuki age=44



id age
---------------------
id=tanaka age=25
id=takahashi age=2          
id=suzuki age=44

にしたい(体裁を整えたい)です。$@を使ってできますか?
変数wkにabc=e があったとして、=があるかどうかわかりますか?
grepやcutコマンドは変数を対象に使えませんよね・・?

966 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 21:42:13 ]
訂正です。体裁が整ってない。
idなら10文字以下でもスペースで10文字にして(これはtypedef使いました)
=の前を見出しに出力して、=の後を----の下に書きたいんです。

id age
---------------------
tanaka    25
takahashi   2          
suzuki    44

よろしくお願いします

967 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:25:03 ]
IFS="=$IFS"
FIRST=t

while read line
do
    set -- $line
    if [ "$FIRST" ]
    then
        printf "%-10s %s\n" "$1" "$3"
        echo "---------------------"
        FIRST=
    fi
    printf "%-10s %2d\n" "$2" "$4"
done



968 名前:デフォルトの名無しさん [2008/06/30(月) 23:38:57 ]
>>967san
有難うございます!今試せないので明日、速攻でやってみます!



969 名前:デフォルトの名無しさん [2008/07/04(金) 23:36:23 ]
質問させてください。
diffの結果を見易く整形するツール等はありますでしょうか。
環境はCENTOSです。よろしくお願いします。

970 名前:969 mailto:sage [2008/07/04(金) 23:37:57 ]
すいません。追記します。
シェルスクリプト内で使いたいので、
ツールでもコマンド的なものだとありがたいです。

971 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 00:17:24 ]
diff -u


972 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 00:19:45 ]
>>969
> diffの結果を見易く整形

kwsk



973 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 01:23:42 ]
>972
このファイルだけサイズが違いますよとか
このファイルはこっちにありませんよとかが希望です。
ls -Rlaの結果をファイルにリダイレクトしてます

974 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 07:42:01 ]
ファイルの差分はいらないのね

find dirA -exec wc -c {}; > /tmp/A
find dirB -exec wc -c {}; > /tmp/B
diff /tmp/A /tmp/B

あるいは単純に
diff -r --brief dirA dirB 2>&1


975 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 14:20:19 ]
私はこんなスクリプト作ってる。
--
#!/bin/sh -f
DIFF="/bin/diff -u"

lsd()
{
find $1 -type f -ls | awk '{printf("%10d %s %2s %5s %s\n", $7, $8, $9, $10, $11);}' | sort +4
}

lsd $1 | sed -e "s- $1- $2-" > /tmp/$$
lsd $2 | $DIFF /tmp/$$ -
rm /tmp/$$
--
これで一応ファイルサイズとタイムスタンプも比較できる。

976 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:59:08 ]
>>975
・空白のあるファイル名の扱い
・日付の出力形式の仮定
に問題。








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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