- ベストアンサー
シェルスクリプトでファイルの読み取りとgrepのエラーを解決する方法
- シェルスクリプトでtest.nicdfファイルからネットワークアドレスとマウントポイントの情報を読み取りたいが、grepの書き方が間違っていてエラーが発生している。
- grepの書き方を修正してエラーを解決する方法を教えていただきたい。
- また、ネットワークアドレスとマウントポイントの2つの変数に格納する方法も教えていただきたい。
- みんなの回答 (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 だと複数行に一致する可能性もあるし、パスに空白文字が入るとまともに動かない。他にもなんかあるだろうけど、そういうことは実際やる本人が考える事と思いますので、通常あまりくどくど書きません。
その他の回答 (3)
- trapezium
- ベストアンサー率62% (276/442)
> 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 みたいな感じ?
- Tacosan
- ベストアンサー率23% (3656/15482)
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で取得した情報と入力したネットワーク情報を比較する。 以上です。
- Tacosan
- ベストアンサー率23% (3656/15482)
そりゃ 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
お礼
ありがとうございました。 grepで色々できるんですね。 参考になりました。
補足
>grep '^[0-9]' test.nicdf > network.txt >grep -v '^[0-9]' test.nicdf > mount.txt 元の情報ファイル(test.nicdf)から上記のようにファイルで呼ぶのではなく 変数で出力する手段をご教授頂けないでしょうか? よろしくお願いします。