- - PR -
シェルで行単位に扱う
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-09-13 09:53
こんにちは。
早速ですが、シェルスクリプトで質問があります。 繰返しの文ですと for が使えますが、空白を含んでいる場合 別トークンとして扱われます。 > for i in `date`; do echo $i; done Mon Sep 13 09:44:33 JST 2004 と、言う風に空白で区切られてしまいます。これを普通に Mon Sep 13 09:45:31 JST 2004 と、1行として扱うことは出来ないでしょうか? ログファイルを tail -n30 /var/log/message として取り出したり grepの結果を取出してその件数分処理したいのです。 かなり基本的な事と思いますが、取出した件数分だけ 件数を意識せずに簡単に記述する方法は無いでしょうか? 宜しくお願いします。 | ||||
|
投稿日時: 2004-09-13 10:00
> for i in "`date`"; do echo $i; done | ||||
|
投稿日時: 2004-09-13 22:57
早速の返信ありがとうございます。
分かりにくい文章で申し訳ありません。 確かに1行返すだけの分ですとMattunさんの仰る通りです。 ただ、dateの文は、forの動きを示しただけで こちらがやりたい事は、ログなど空白を含み複数の行を 返してくる文に対してどうすれば良いかです。 先に書いたtailの文だとどうすれば良いでしょうか? for i in `tail -n30 /var/log/message`; do 行毎の処理; done 宜しくお願いします。 | ||||
|
投稿日時: 2004-09-13 23:52
えーと、「行」と言われたらふつうはLFで区切られた単位を指すわけで。
やりたいことは「複数の行で構成されるデータのかたまり」(レコード とでも言えばまだ通じたかも)を処理することのようですが... 一般論として方法を述べることはできません。 私だったら、無理にシェルで書くことはせず、awk を使います。 awk でなくても、Perl でも Python でも ruby でも、好みのものを 使えばよいですが。 | ||||
|
投稿日時: 2004-09-14 10:28
bashなら、IFSの値を書き換えることで簡単に実現できます。
( IFS=$'\n'; for i in `tail -n30 /var/log/message`; do 行毎の処理; done ) ログインシェルのIFSが書き換えられてしまわないように、 shellスクリプトにしておくか、()でくくるかした方が良いでしょう。 | ||||
|
投稿日時: 2004-09-14 21:13
ぽんすさん、coasmさんありがとうございます。
LFで区切られていると思ったのですがTab区切りですか? レコードと言う単位がどうも曖昧さが大きいように思えて あえて『行』と言う単語を使わせて頂きました。 返って分かり辛くしてしまった様で申し訳ありません。 私も最初awkを組合わせて作ろうかと思ったのですが awkも中途半端に知っている程度なのでシェルで簡単に出来る 部分までawkに記述する技量も無くまたシェルだけで簡単に出来そうで 出来ない所で痛し痒しな状態でした。 皆さんのお力をお借り出来て良かったです。ありがとうございます。 |
1