• ベストアンサー
  • すぐに回答を!

シェルスクリプト ファイルの読み取りとgrepのし

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 =========================

共感・応援の気持ちを伝えよう!

  • Linux系OS
  • 回答数4
  • 閲覧数2450
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.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)

  • 回答No.3

> 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で色々できるんですね。 参考になりました。

質問者からの補足

>grep '^[0-9]' test.nicdf > network.txt >grep -v '^[0-9]' test.nicdf > mount.txt 元の情報ファイル(test.nicdf)から上記のようにファイルで呼ぶのではなく 変数で出力する手段をご教授頂けないでしょうか? よろしくお願いします。

  • 回答No.2
  • 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で取得した情報と入力したネットワーク情報を比較する。 以上です。

  • 回答No.1
  • 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

関連するQ&A

  • シェルスクリプト外部からのデータ参照

    初心者で失礼があれば申し訳ございません。 お力を頂ければ幸いです。何卒よろしくお願いします。 以下に「hogehoge.nic」と「hogehoge.df」という外部ファイルがあります。 $ cat ./hogehoge.nic nic="210.175.250.212" $ cat ./hogehoge.df /dev/mapper/VolGroup00-LogVol00 /dev/hda1 tmpfs ====================================================================== 上記を呼び出したいシェルがあります。 $ cat ./hogehoge.sh #!/bin/sh NIC=/home/user/hogehoge.nic DF=/home/user/hogehoge.df echo ${NIC} echo ${DF} DF=`df -k` echo test df echo ${DF} ====================================================================== 実行結果 $ ./hogehoge.sh /home/user/hogehoge.nic /home/user/hogehoge.df test df Filesystem 1K-ブロック 使用 使用可 使用% マウント位置 /dev/mapper/VolGroup00-LogVol00 234410632 1869312 220441736 1% / /dev/hda1 101086 12004 83863 13% /boot tmpfs 516860 0 516860 0% /dev/shm ======================================================================= 上記実行結果ではなくて、hogehoge.shでhogehoge.nicとhogehoge.dfの中身を呼び出したい。 下記ファイルの中身を呼び出したいです。 $ cat ./hogehoge.nic nic="210.175.250.212" $ cat ./hogehoge.df /dev/mapper/VolGroup00-LogVol00 /dev/hda1 tmpfs

  • ディスク使用量監視スクリプトについて

    あるサイトから下記スクリプトを拾ってきました。 #!/bin/sh # 監視パーティション partition=/dev/mapper/VolGroup00-LogVol00 # ディスク使用率閾値(%) shikii=80 # 通知先メールアドレス mailaddress="hogehoge@hoge.jp" srvname=`hostname` subject="$srvname Disk space alert" maildata=`hostname && date && df -h` used=` df -h | grep $partition | awk '{ print $5 }' | sed -e '$s/.$//' ` if [ $used -lt $shikii ] then echo ok else mail -s "$subject" $mailaddress << MAILDATA $maildata MAILDATA fi 実行したところ[: -lt: unary operator expected と帰ってきて成功しません。 お分かりなる方教えてください。 よろしくお願いします。

  • シェルスクリプトのYes、Noの入力ロジックに関する質問

    こんにちは。 よろしくお願いします。 Linux(RHEL5)にて、以下のようなシェルスクリプトを作成しました。 ユーザにアンインストールを問い合わせるもので、 yesの時は処理が進み、noの時は処理が中断、 それ以外を入力した場合、再入力を促すようにしています。 echo "" echo "*** アンインストールを実行しますか? ***" read -p "  >>> 実行する場合「yes」、しない場合は「no」を入力してください <<< " YESNO while (test $YESNO != yes) && (test $YESNO != no) do echo "" read -p "  >>> 「yes」もしくは「no」を入力してください <<<  " YESNO done if (test $YESNO == yes) then continue else echo "****** アンインストールをキャンセルしました ******" && exit fi しかし、 何も入力せずに「Enter」を押した場合、 本来なら、再入力を促すように表示したいのですが、 以下のようにエラーが出て、終了してしまいます。 XXX.sh: line YYY: test; !=; unary operator expected XXX.sh: line ZZZ: test; ==; unary operator expected ****** アンインストールをキャンセルしました ****** 恐らくロジックのどこかに見落としがあると思うのですが、 原因がよく分かりません。 よろしくお願いします。

  • シェルスクリプトのYes、Noの入力ロジックに関する質問

    こんにちは。 よろしくお願いします。 Linux(RHEL5)にて、以下のようなシェルスクリプトを作成しました。 ユーザにアンインストールを問い合わせるもので、 yesの時は処理が進み、noの時は処理が中断、 それ以外を入力した場合、再入力を促すようにしています。 echo \"\" echo \"*** アンインストールを実行しますか? ***\" read -p \"  >>> 実行する場合「yes」、しない場合は「no」を入力してください <<< \" YESNO while (test $YESNO != yes) && (test $YESNO != no) do echo \"\" read -p \"  >>> 「yes」もしくは「no」を入力してください <<<  \" YESNO done if (test $YESNO == yes) then continue else echo \"****** アンインストールをキャンセルしました ******\" && exit fi しかし、 何も入力せずに「Enter」を押した場合、 本来なら、再入力を促すように表示したいのですが、 以下のようにエラーが出て、終了してしまいます。 XXX.sh: line YYY: test; !=; unary operator expected XXX.sh: line ZZZ: test; ==; unary operator expected ****** アンインストールをキャンセルしました ****** 恐らくロジックのどこかに見落としがあると思うのですが、 原因がよく分かりません。 よろしくお願いします。

  • シェルスクリプトエラーになります。

    はじめまして、初心者なので失礼な書き方でしたらご容赦願います。 下記のようなシェルスクリプトを書きました。 実行したところエラーになります。 何がいけなく、正しくはどう記述すればよろしいでしょうか? 何卒ご教授願します。 ===========================ここから=============================== #!/bin/sh test1=12345 test2=678 if ${test1} -eq ${test2} then echo "eq:数値1と数値2が等しい場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しい" fi if ${test1} -ne ${test2} then echo "en:数値1と数値2が等しくない場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しくない" fi echo "********* テスト完了 *********" ===========================ここまで============================== ======================実行結果エラーここから======================== $ ./testsh110204.sh ./testsh110204.sh: line 6: 12345: command not found ./testsh110204.sh: line 12: 12345: command not found ********* テスト完了 ********* ======================実行結果エラーここまで======================

  • シェルスクリプト 一つのふくすう変数から値を取る方

    いつもありがとうございます。 NICという変数にはネットワークアドレスが2つ入ってます。 NIC= 192.168.0.1 127.0.0.1 下記のスクリプトで上記2つのアドレスを取ろうと思ってます。 ==========test.sh================ while read LINE; do echo $LINE done < ${NIC} =============================== しかし下記のようなエラーになります。 変数の取り出し方が悪いのだと思います。 =============================== ./test.sh: 192.168.0.1 127.0.0.1: そのようなファイルやディレクトリはありません 恐れ入りますが正しいスクリプトをご教授くださいますようお願いします。

  • シェルスクリプト文字列の処理について

    はじめましてよろしくお願いします。 質問サイトもシェルも初心者なので至らない点がございましたら ご容赦の程よろしくお願いします。 下記シェルスクリプトを実行すると下記エラーが発生します。 「test2」変数に空白無しで「abc」と入力するとエラーは発生しません。 変数test2の値(a bc)を変更せずにエラーが発生しない方法はないでしょうか? 手段でもかまいませんので教えてください。 ========================= testsh110207.sh ====================================== #!/bin/sh test1="abc" test2="a bc" if [ ${test1} = ${test2} ] then echo "=:文字列1と文字列2が等しい場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しい" fi if [ ${test1} != ${test2} ] then echo "!=:数値1と数値2が等しくない場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しくない" fi echo "********* テスト完了 *********" ======================================================================= $ ./testsh110207.sh ./testsh110207.sh: line 6: [: too many arguments ./testsh110207.sh: line 13: [: too many arguments ********* テスト完了 *********

  • e2fsckの実行について

    環境:CentOS4.6 # e2fsck -f /dev/mapper/VolGroup00-LogVol00 を実行すると、ディスクにエラーがあるという結果がでました。 マウントしているので、修復できないと思うのですが、 マップされたディスクの修復はどのように行えばよいのでしょうか? よろしくお願いします。

  • パーティションを変更する方法を教えてください

    お世話になります。 一度設定したパーティションを変更したいです。 ▼環境 OS:RedHat ES4 Filesystem サイズ 使用 残り 使用% マウント位置 /dev/mapper/VolGroup_ID_20381-LogVol1 109G 314M 103G 1% / /dev/sda3 99M 13M 82M 13% /boot none 505M 0 505M 0% /dev/shm /dev/mapper/VolGroup_ID_20381-LogVol2 496M 11M 460M 3% /tmp /dev/mapper/VolGroup_ID_20381-LogVol5 78G 2.8G 71G 4% /usr /dev/mapper/VolGroup_ID_20381-LogVol4 496M 116M 356M 25% /var /dev/mapper/VolGroup_ID_20381-LogVolHome 41G 100M 38G 1% /home ここで /で割り当てた一部(10G)を /varに 割り当てたいのですがどのようにすれば可能でしょうか?  パーティションマジックなどの有償ソフトを使用せず行いたいです。 (再インストールしかないのでしょうかねぇ?) ちなみに vgdisplay は (一部抜粋) VG Size 232.69 GB PE Size 32.00 MB Total PE 7446 Alloc PE / Size 7442 / 232.56 GB Free PE / Size 4 / 128.00 MB です。 以上、よろしくお願いします。

  • ルートのパーティションのUse%が100%になった場合

    Redhat EnterPriseLinuxES4でdfコマンドを発行すると以下の結果が表示されます。 #df -H Filesystem Size Used Avail Use% マウント位置 /dev/mapper/VolGroup_ID_4409-LogVol1 1.1G 995M 8.5M 100% / /dev/sda3 104M 38M 61M 39% /boot none 1.1G 0 1.1G 0% /dev/shm /dev/mapper/VolGroup_ID_4409-LogVol2 520M 11M 483M 3% /tmp /dev/mapper/VolGroup_ID_4409-LogVol5 49G 2.8G 44G 6% /usr /dev/mapper/VolGroup_ID_4409-LogVol4 520M 297M 198M 61% /var /dev/mapper/VolGroup_ID_4409-LogVolHome 25G 110M 24G 1% /home 気になるのは[/]のUSE%が100%になっていることです。 ハード構成はDell製のPowerEdge840でハードRAID構成です。 基本的なアプリとしてApache,PHP,Vsftpd,MySQLぐらいです。 インストール手順についてはデフォルト設定で行いました。 この場合どのような方法で空き容量の確保を行えばいいのでしょうか? 調べた結果、KNOPPIXからCDブートを行ってQTPartedを試みたのですが、よく分からなかったので断念しました。 どなたかお分かりになる方おられましたら、ご教授の程宜しくお願いします。