- PR -

シェルで行単位に扱う

1
投稿者投稿内容
狼おやぢ
会議室デビュー日: 2002/03/03
投稿数: 15
投稿日時: 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の結果を取出してその件数分処理したいのです。

かなり基本的な事と思いますが、取出した件数分だけ
件数を意識せずに簡単に記述する方法は無いでしょうか?

宜しくお願いします。
Mattun
ぬし
会議室デビュー日: 2004/08/10
投稿数: 1391
投稿日時: 2004-09-13 10:00
引用:

> for i in `date`; do echo $i; done



> for i in "`date`"; do echo $i; done
狼おやぢ
会議室デビュー日: 2002/03/03
投稿数: 15
投稿日時: 2004-09-13 22:57
早速の返信ありがとうございます。

分かりにくい文章で申し訳ありません。
確かに1行返すだけの分ですとMattunさんの仰る通りです。
ただ、dateの文は、forの動きを示しただけで
こちらがやりたい事は、ログなど空白を含み複数の行を
返してくる文に対してどうすれば良いかです。
先に書いたtailの文だとどうすれば良いでしょうか?
for i in `tail -n30 /var/log/message`; do 行毎の処理; done

宜しくお願いします。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-09-13 23:52
えーと、「行」と言われたらふつうはLFで区切られた単位を指すわけで。
やりたいことは「複数の行で構成されるデータのかたまり」(レコード
とでも言えばまだ通じたかも)を処理することのようですが...

一般論として方法を述べることはできません。
私だったら、無理にシェルで書くことはせず、awk を使います。
awk でなくても、Perl でも Python でも ruby でも、好みのものを
使えばよいですが。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-09-14 10:28
bashなら、IFSの値を書き換えることで簡単に実現できます。

( IFS=$'\n'; for i in `tail -n30 /var/log/message`; do 行毎の処理; done )

ログインシェルのIFSが書き換えられてしまわないように、
shellスクリプトにしておくか、()でくくるかした方が良いでしょう。
狼おやぢ
会議室デビュー日: 2002/03/03
投稿数: 15
投稿日時: 2004-09-14 21:13
ぽんすさん、coasmさんありがとうございます。

LFで区切られていると思ったのですがTab区切りですか?
レコードと言う単位がどうも曖昧さが大きいように思えて
あえて『行』と言う単語を使わせて頂きました。
返って分かり辛くしてしまった様で申し訳ありません。

私も最初awkを組合わせて作ろうかと思ったのですが
awkも中途半端に知っている程度なのでシェルで簡単に出来る
部分までawkに記述する技量も無くまたシェルだけで簡単に出来そうで
出来ない所で痛し痒しな状態でした。
皆さんのお力をお借り出来て良かったです。ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)