[表示 : 全て 最新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 ]
シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。 


331 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 22:56:47 ]
>>330
お前にはうかがい知れないすごい思想なのは分かった。


332 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 09:15:04 ]
sed -f henkan.txt input.txt のhenkan.txtの部分を
ヒアドキュメントで書く方法ないでしょうか。無いか。
たんにテキストファイル増やすのが面倒なだけなんですが…

333 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 11:13:36 ]
>>332
もしかして、sedスクリプトのコメントをスクリプトファイルに入れたいって話?
それともその行が書かれたシェルスクリプト内にコメントを入れたいって話?
シェルもsedもコメントは#で始まるから、どちらの場合も好きなところに書けばいいとおもうが。

334 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 00:07:14 ]
>>333
はぁ?

335 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 04:00:04 ]
>>332
複数処理なら、以下の何れかでいけると思う。

1) sed -e '処理1' -e '処理2' ... file

2) sed '
処理1
処理2
....
' file
※ 複数行をシングルか、ダブルの引用符で囲む
    囲みの中が複数行でも、sedには1つの引数として渡される

3) sed '処理1^J処理2^J...' file
※ ^J は vi で入力するなら ctrl+ESC 後に ctrl+J

OSの違いやsedのバージョンによっては駄目な方法もあるかも
シェルによって駄目とかはないと思うが、c系は自信ない

336 名前:335 mailto:sage [2006/08/01(火) 04:16:53 ]
>>332
追加でこんなんでもいいわけだが・・・

4) sed '処理1' file | sed '処理2' | sed ...

つうか、何がしたいの?
複数処理をしたいんじゃないならスレ汚し、すまんす



337 名前:335 mailto:sage [2006/08/01(火) 04:28:16 ]
ついでだからもう一つ、スレ汚しすまん
ヒアドキュメントに拘るなら、sedの代わりにedかex使え

ed file <<EOF
...
EOF


338 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 10:14:10 ]
332です。ありがとうございます。
これだけ方法があるのにsedのmanを見て何も思い付かなかった
頭の悪さに恥じ入るばかりでございます

339 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 06:38:49 ]
>>335
処理の中身にもよるが、こういう書き方でもたいていは動くはず。
一行でかけるし、プロセスを一つにまとめられるのでわりとお勧め。

$ sed '処理1; 処理2; 処理3; ...' file



340 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 08:28:05 ]
>>339 プロセスを一つにまとめられるので

それじゃまるで>>335はプロセスが一つじゃないと言ってるように聞こえる。

341 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 14:19:39 ]
>>340
そういやプロセスが複数なのは >>336 だけだったな。
レス番を間違えた


342 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 22:11:20 ]
>>339
みんなが4000行かかるプログラムをたった1行で書いてやるぜ!的な。

343 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 22:49:29 ]
よーし、俺がたった1行でコンソール埋め尽くしちゃる
echo *{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}


344 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 11:12:37 ]
毎月定期的に取得しているファイル名を、例えば、
filename_`date +%Y%m%d`.txt
などとして日付けを付けて保存しています。
これが先月のものと差がない場合、新しい方を破棄したくて、
date コマンドで先月の同じ日を吐き出すことができないかと思っているのですが、
date は現在の日付けを表示することしかできないのでしょうか?具体的には、
diff filename_20060801.txt filename_20060701.txt
で内容が完全に同じだったら、filename_20060801.txt を削除するようにしたいです。
環境は Linux、kernel-2.6.9-34 です。CentOS です。
どなたかアドバイスをお願いいたします。

345 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 11:53:21 ]
>>344
date -d "last month" +%Y%m%d

346 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 12:32:05 ]
うおお、それでいいんですか!
どうもありがとうございます。

347 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 13:22:13 ]
>>345
HPUXのdateはそんな便利な機能ないからうらやましいな。
前日とかならTZ変えればいいけど

348 名前:デフォルトの名無しさん [2006/10/12(木) 15:54:09 ]
申し訳ありません。
cshで@引数が、空であるかどうかと、A引数が、数字(何桁でも可)のみ受けとる
という条件文を書きたいのですが、
@は、if ( $# -eq )や if(x$name =x)とやってもうまくいきません。
Aは、ダイレクトにif(0<=#1<=9) というやりかた?しかわかりません。

もうしわけないのですが、ご教授願えませんか?
ヒントや参考文献でもかまいません。宜しくお願いします。

349 名前:デフォルトの名無しさん mailto:sage [2006/10/12(木) 23:34:19 ]
cshやめたらいいんじゃない



350 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 17:12:45 ]
>>348
1. 引数が空

if ( $#argv == 0 ) then
echo 空
else
echo なんかある。
endif

2. 数値かどうか

わかんねえ。こんな風にでもすれば?

set n = `echo "$argv[1]" | sed 's/[0-9][0-9]*//g'`
if ( '' == "$n" ) then
echo "$argv[1] は数値だ。"
else
echo "$argv[1] は数値ではない。"
endif


351 名前:デフォルトの名無しさん [2006/10/13(金) 18:56:57 ]
>>350
ありがとうございます。大変助かります。
やはり、sedコマンド使うんですね。
sedとawkを使うべきかなと思いながら、
あまりよく分かっていなかったんです。

これから試してみます。

352 名前:デフォルトの名無しさん mailto:sage [2006/10/13(金) 20:31:27 ]
>>351
本当は何か別の方法あるかも知れないけど、俺は知らない。

あと、その sed の使い方だとマイナス記号や小数点や数字と数字の途中にスペースが
あった場合とかが考慮されていないので、その辺は自分でなんとかして。


353 名前:デフォルトの名無しさん [2006/10/19(木) 10:01:09 ]
cshの環境で、アプリケーションログを
/backup/apl -mtime +6 -exec rm {} \;
上記のようい週次バックアップしています。

これを、直近のデータのみリストアする場合、
(最新のデータのみで、あとはいらない)
どのような表現を使えばいいのでしょうか?



354 名前:デフォルトの名無しさん mailto:sage [2006/10/19(木) 21:09:43 ]
日本語でおk

355 名前:デフォルトの名無しさん mailto: [2006/10/20(金) 22:47:35 ]
rshについて質問させて頂きます。
ある書籍に以下の記述がありました。

$ STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`

\マークが1個多いと思うのですが・・・。
正誤表には記載がありませんでした。
分かる方がいましたら是非回答をお願い致します。

356 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 00:09:39 ]
>>355
引数が二回展開されるから。

まず local のシェルが引数を展開して rsh に
(hostname) と (sh -c 'ls; echo \$?') を渡す。

で、rsh が hostname のシェルで (sh -c 'ls; echo \$?') を実行する。
この時にもう一度展開される。


357 名前:デフォルトの名無しさん mailto: [2006/10/21(土) 11:56:53 ]
>>356
早速のご回答ありがとうございます。

>で、rsh が hostname のシェルで (sh -c 'ls; echo \$?') を実行する。
>この時にもう一度展開される。
ダブルクォーテーションで囲まれた中の$は、
シェルによってメタキャラクタと認識されてしまうので
\マークでクォートしなくてはいけないのですが、
シングルクォーテーションで囲まれた$は
メタキャラクタとは認識されないので、
\マークでクォートする必要はない、
というのが私の認識です。

よって、hostnameのシェルで実行される
(sh -c 'ls; echo \$?')の$はメタキャラクタとは
認識されないので、\マークは不要であると
思っています。

ご指摘の程よろしくお願い致します。

ちなみに今回の質問は、
書籍「入門UNIXシェルプログラミング 改訂第2版」
のP.132についてです。

358 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 19:23:38 ]
>>357
csh 系や zsh の挙動は良く知らないが
bash のクォート除去はそこまで賢くない。

ダブルクォートの中にシングルクォートがあっても
その中身は保護されない。

例)
$ echo "$SHELL" '$SHELL' "'$SHELL'"
/bin/bash $SHELL '/bin/bash'



359 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 20:31:06 ]
cshなんですが、
ヒアドキュメントの内容を変数に格納するのはどうやったらいいんでしょうか



360 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 04:00:06 ]
負の遺産を量産するな。shか最悪kshで書き直せ。
(t)cshが許されるのはログインシェルまで。

361 名前:359 mailto:sage [2006/10/25(水) 13:13:03 ]
古いsoralisのメンテしてる上に周りがcshしか理解できないんで仕方なく・・・
本当はbash使いたいんですけどね



362 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 15:43:34 ]
別に仕方ないことないだろに。


363 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 18:22:40 ]
>>356
エスケープの処理はバッククォートとダブルクォートのときじゃないか?
rshが受け取る文字列は(sh -c 'ls; echo $?')だと思うんだけど。

(STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`)
ローカルのシェルが、バッククォートとして実行する文字を解釈 -> (rsh hostname "sh -c 'ls; echo \$?'")
バッククォートが、rshを呼び出す為に引数を展開 -> (hostname) (sh -c 'ls; echo $?')
rshがhostnameに入って、ホストのシェルで第二引数を実行 -> (sh -c 'ls; echo $?')
sh -c の処理 -> (ls; echo $?)

>ダブルクォートの中にシングルクォートがあっても
>その中身は保護されない。
ダブルクォートの中のシングルクォートは単なる文字なのでこれはこれで合ってるけど。



364 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 23:14:19 ]
>>363
bash の man を参照するとわかるがクォートの除去は
各種展開が終わってから行われる。
冗長に処理の流れを書くとこうなる。

1. コマンド実行 -> (STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`)
2. ローカルのシェルがコマンド置換(バッククォートの処理)を行う -> (rsh hostname "sh -c 'ls; echo \\$?'")
3. サブシェルが起動してバッククォートの中身を展開する -> (rsh) (hostname) (sh -c 'ls; echo \$?')
4. サブシェルが rsh に引数 (hostname) (sh -c 'ls; echo \$?') を渡す
5. rsh が hostname のシェルに (sh -c 'ls; echo \$?') を渡す
6. hostname のシェルが引数を展開する -> (sh) (-c) (ls; echo \$?)
7. hostname のシェルが sh に (-c) (ls; echo \$?) を渡す
8. sh が引数を展開、実行する -> (ls; echo $?)
9. sh -> hostname のシェル -> rsh -> サブシェルの順に返り値が渡り、コマンド置換が終了
10. STAT に返り値が代入される

365 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 02:27:55 ]
>>364
> bash の man を参照するとわかるがクォートの除去は
> 各種展開が終わってから行われる。
EXPANTIONSのとこにあるこれ?
The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and
command substitution (done in a left-to-right fashion), word splitting, and pathname expansion.

ここにあるのは、どの順で実行されていくかの説明で、クォートの解釈は別の段階だぞ。
Expansion is performed on the command line after it has been split into words.
ってあるとおり、(1)シェルが一行読み込まれる → (2)単語への分割 → (3)各要素を展開する
のうち(2)の話だ。(3)にある単語分割とは別物
#1行じゃない場合はちょっとおいといてくれ


> 2. ローカルのシェルがコマンド置換(バッククォートの処理)を行う -> (rsh hostname "sh -c 'ls; echo \\$?'")
これの前に単語への分割があって、バッククォートを使っているとバックスラッシュの前にあるバックスラッシュはエスケープとして扱われるから、
(STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`) -> (STAT) (=) (`rsh hostname "sh -c 'ls; echo \$?'"`)
この段階でバックスラッシュは一個になる。
(っていうか、そうじゃないと入れ子になったバッククォートの範囲を確定できないし)

コマンド置換の展開が実行されると、サブシェルがまた単語への分割を実施して、
今回はダブルクォートのルールに従ってバックスラッシュは$に対するエスケープ文字になる。
(rsh hostname "sh -c 'ls; echo \$?'") -> (rsh) (hostname) ("sh -c 'ls; echo $?'")


「bash -v -x」してから「echo `echo "'\\$abc'"`」ってやってみ。
読み込んだ文字と、展開結果が出てくる。
サブシェルが読み込んだ文字列は
echo "'\$abc'"
になってて、すでに一回バックスラッシュが処理されてる。

366 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 03:36:14 ]
>>365
ほー、そうだったのか。
やっぱりこういう事は自分で検証しないとダメだな。
的確な突っ込み感謝。

367 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 12:33:25 ]
>366
そういや、肝心の355はどこいったんだ?

368 名前:デフォルトの名無しさん mailto: [2006/11/02(木) 23:45:43 ]
355です。

はっ!、と思って只今本スレを確認しました。
しばらくの間に様々な回答を頂き、本当にありがとうございます。
これからじっくり読ませて頂きます!

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






[ 続きを読む ] / [ 携帯版 ]

前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