dポイントプレゼントキャンペーン実施中!

test.nicdfにはネットワークアドレスとマウントポイント(df)の情報が格納されてます。

行いたいこととしては、
test.nicdfファイルから一行づつ読み取り、
ネットワークアドレスとマウントポイントの2つの情報を読取ます。
マウントポイントは複数行あるため分り易いネットワークアドレスを
grepで抽出して、他の行はマウントポイントとして認識させようと思いました。

===========================

$ cat test.nicdf
210.175.250.212
/dev/mapper/VolGroup00-LogVol00
/dev/hda1
tmpfs

==========================

$ test.sh
#!/bin/sh

while read LINE; do
echo $LINE

if [ ${LINE} grep "192" ]
then echo "network"
else echo "NEXT"
fi

done < test.nicdf
==========================

しかし下記のエラーが発生します。
grepの書き方が悪いようです。

このエラーを解決する方法をご教授願います。
また、ネットワークアドレスとマウントポイントの2つの変数に格納する方法も
あわせてご教授頂けませんでしょうか?

よろしくお願いします。


=========================
$ ./test.sh
192.168.0.250
./testnakano.sh: line 6: [: grep: binary operator expected
NEXT
/dev/mapper/VolGroup00-LogVol00
./testnakano.sh: line 6: [: grep: binary operator expected
NEXT
/dev/hda1
./testnakano.sh: line 6: [: grep: binary operator expected
NEXT
tmpfs
./testnakano.sh: line 6: [: grep: binary operator expected
NEXT

=========================

A 回答 (4件)

>grep '^[0-9]' test.nicdf > network.txt


>grep -v '^[0-9]' test.nicdf > mount.txt

> 元の情報ファイル(test.nicdf)から上記のようにファイルで呼ぶのではなく
> 変数で出力する手段をご教授頂けないでしょうか?

`command` や $(command)
$() は方言か。

それに一時ファイルに毎回適当な名前を付けるようにすれば、そんなに毛嫌いする必要もないと思います。例えば mktemp 使って、

networks=`grep '^[0-9]' test.nicdf`
mounts=`grep -v '^[0-9]' test.nicdf`

tmp=`mktemp /tmp/df.txt.XXXXXX` || exit 1
df > $tmp
for a in $mounts; do
fgrep "$a" $tmp || echo $a no mounted
done
rm -f $tmp
exit 0

あと注意点ですが、fgrep $a だと複数行に一致する可能性もあるし、パスに空白文字が入るとまともに動かない。他にもなんかあるだろうけど、そういうことは実際やる本人が考える事と思いますので、通常あまりくどくど書きません。
    • good
    • 0

> grepで抽出して、他の行はマウントポイントとして認識させようと思いました。


> /dev/mapper/VolGroup00-LogVol00
> /dev/hda1

どう見てもマウントポイントじゃないんですけど?

> 2,取り出したデータをマウント情報とネットワーク情報に振り分ける

この二種類のデータの関連性が不明ですが、とりあえず無関係とすると

grep '^[0-9]' test.nicdf > network.txt
grep -v '^[0-9]' test.nicdf > mount.txt

grep '^/' test.nicdf > mount.txt

でいい気がする。

5,dfで取得したマウント情報と入力したマウント情報を比較する。

df > df.txt
grep '^/' test.nicdf | while read a; do fgrep $a df.txt || echo $a no mouted; done

みたいな感じ?

この回答への補足

>grep '^[0-9]' test.nicdf > network.txt
>grep -v '^[0-9]' test.nicdf > mount.txt

元の情報ファイル(test.nicdf)から上記のようにファイルで呼ぶのではなく
変数で出力する手段をご教授頂けないでしょうか?
よろしくお願いします。

補足日時:2011/02/09 10:25
    • good
    • 0
この回答へのお礼

ありがとうございました。
grepで色々できるんですね。
参考になりました。

お礼日時:2011/02/09 10:17

if の条件に書くのは「普通のコマンド」です. で, そのコマンドの返り値が 0 か 0 でないかによって then の方を実行するか else の方を実行するかが決まります.


だから
if ${LINE} grep "192"
と書くということは, あなたは
${LINE} grep "192"
のようなコマンドを実行しているということを意味しちゃうよ. grep をこんな風に実行したこと, ありますか?

いずれにしても
・それは何を意図したものなの?
・究極的には何をしたいの?
があった方が答えやすい気がする. 後者はつまり「それぞれ変数に入れて何をしたいの?」ってことだけど.

この回答への補足

アドバイスありがとうございます。
以下のようなフローを考えております。

1,test.nicdfからマウント情報とネットワーク情報を取り出す
2,取り出したデータをマウント情報とネットワーク情報に振り分ける
3,192、127で始まる文字をネットワーク情報とする。
4,それ以外の文字列をマウント情報とする。
5,dfで取得したマウント情報と入力したマウント情報を比較する。
6,ifconfigで取得した情報と入力したネットワーク情報を比較する。

以上です。

補足日時:2011/02/08 19:03
    • good
    • 0

そりゃ test に grep なんて演算子はないからエラーになるだろうよ.


で, それは何を意図したものなの?
あと, 究極的には何をしたいの?

この回答への補足

ご指摘の箇所を、
if [ ${LINE} grep "192" ]
から
if ${LINE} grep "192"
に変更してみましたが、下記エラーが発生します。

大変申し訳ありませんが、私、超初心者なため
失礼な返答で申し訳ありません。

何卒ご教授の程よろしくお願いします。

$ ./test.sh
210.175.250.212
./test.sh: line 6: 210.175.250.212: command not found
NEXT
/dev/mapper/VolGroup00-LogVol00
./test.sh: line 6: /dev/mapper/VolGroup00-LogVol00: 許可がありません
NEXT
/dev/hda1
./test.sh: line 6: /dev/hda1: 許可がありません
NEXT
tmpfs
./test.sh: line 6: tmpfs: command not found
NEXT

補足日時:2011/02/08 17:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!