- ベストアンサー
行の中のある文字列の抜出し方
よろしくお願いいたします。 ある行があった時に inet 192.168.11.3 netmask 0xffffff00 broadcast 192.168.11.255 IPだけ(ここでは192.168.11.3) 抜き出したいのです。 また default 192.168.11.1 UGSc 17 5 en0 の時も同様で、 (これはデフォゲなのですが、192.168.11.1だけ) 抜き出したいのです。 次も同じで domain odn.ne.jp で、ドメイン名(odn.ne.jpのみ)抜き出したいのです。 また nameserver 192.168.11.1 nameserver 192.168.11.1 のように2行がヒットした時に 先頭行のアドレス(192.168.11.1)のみを抜き出したいのです。 以上のような 1行の中の特定の部分、複数行ある時の指定行の特定の部分を 抜き出す関数やシェルスクリプトを 教えて下さい。 環境はFreeBSDでbashです。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>ifconfig rl0 >cut -d" " -f 2 OS Xは使用していないので分かりませんが、普通UNIX系OSだと「man コマンド名」(man ifconfig とか man cut)でコマンドの説明が表示されるのですが表示されませんか? >ifconfig rl0 ifconfigコマンドを引数なしで実行すると存在する全てのインタフェースについて表示されます。 例 %ifconfig bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=1b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING> inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255 inet 192.168.1.2 netmask 0xffffffff broadcast 192.168.1.2 ether --:--:--:--:--:-- media: Ethernet autoselect (1000baseTX <full-duplex>) status: active rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=8<VLAN_MTU> inet XXX.XXX.XXX.XXX netmask 0xfffffc00 broadcast YYY.YYYY.YYY.YYY ether --:--:--:--:--:-- media: Ethernet autoselect (100baseTX <full-duplex>) status: active lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask 0xff000000 上記だとインタフェースのbge0、rl0、lo0が表示されています。 ifconfigコマンドの引数にインタフェースを指定するとその指定したインタフェースの情報のみ出力されます。 例 %ifconfig rl0 rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=8<VLAN_MTU> inet XXX.XXX.XXX.XXX netmask 0xfffffc00 broadcast YYY.YYYY.YYY.YYY ether --:--:--:--:--:-- media: Ethernet autoselect (100baseTX <full-duplex>) status: active >ifconfig rl0| grep "inet " | cut -d" " -f 2 rl0のインタフェースが存在しない場合、「ifconfig rl0」では何も表示されないので、その場合には上記の通り実行しても何も表示されません。 rl0の部分をご自分の環境にあるインタフェースに置き換えて実行しないと駄目です。 >cut -d" " -f 2 上記の場合、入力された文字列を" "(スペース/空白)で分割し、2番目の内容を用事すると言うことです。 入力が >inet 192.168.3.64 netmask 0xffffff00 broadcast 192.168.3.255 だと、" "で区切った場合の1番目が「inet」、2番目「192.168.3.64」、3番目が... になるので、「192.168.3.64」が表示されると言うことです。
その他の回答 (3)
- Lean
- ベストアンサー率72% (435/603)
訂正しておきます。 >rl0のインタフェースが存在しない場合、「ifconfig rl0」では何も表示されないので、その場合には上記の通り実行しても何も表示されません。 「「ifconfig rl0」では何も表示されない」と書いてますが、エラーメッセージが出力されます。 あと、何か書店に行って本なり見てUNIXのコマンドの使い方が書かれたものとか買うとかされた方がいいと思いますよ。 ○FreeBSD 日本語マニュアル検索 (jman/japropos/jwhatis) http://www.jp.freebsd.org/man-jp/search.html ifconfig(8)コマンド http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ifconfig&dir=jpman-6.0.0%2Fman§=0 cut(1)コマンド http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=cut&dir=jpman-6.0.0%2Fman§=0
お礼
早速のご返答ありがとうございます。 MacOSXでのBSDと、本物のUnixではパラメータの書式が かなり違うんですね。 ありがとうございました。リンクして頂いた本で調べて見ます。
- qaaq
- ベストアンサー率36% (146/404)
単純に cut コマンドを使ってみてはどうでしょうか。 % ifconfig rl0| grep "inet " | cut -d" " -f 2 192.168.0.6 手元のFreeBSD5.5ではこんな結果になります。 解はたくさんあると思います。
お礼
ご返答まことにありがとうございます。 BSD5.5では上手くいくのですね。わたしの環境(MacOSX)では 上手く行きませんでした。Macと言いましても中身はFreeBSDですので 上手く行くと思って、そのまま打ち込んだのですが・・ 補足を書かせて頂きました。 何度もすみませんが、初心者なのでよく分からずご教授願えましら ありがたいです。
補足
ご返信ありがとうございます。 最近スクリプトを始めたのでよく分かっていないのですが、 ifconfig rl0| grep "inet " | cut -d" " -f 2 のままでは上手く行きませんでした。 BSDでも書き方の違いがあるのですね。 ちなみに上のコマンドですが、ご解説願えませんでしょうか。 分かるのはgrepの所だけです。恥ずかしい話ですが・・・ ifconfig rl0 と cut -d" " -f 2 の意味や使い方をご教授いただけましたら幸いです。 何度もしつこいようですが、周りにスクリプト(と言いますか UnixやBSDやシェル)が分かる人が居ないので・・ よろしくお願い申し上げます。
- agharta
- ベストアンサー率52% (54/103)
cat file | grep ... | head -1 | awk '{print $2}' 見たいにやれば、いいのですかね。 cat fileの部分は、何かコマンドに置き換えても大丈夫でしょう。 grep でできるだけ、ヒット件数が少なくなるような行を探し、 head -1で、最初の行だけ取り出す。 で、awk '{ print $2 }'で二番目の項目を取得する。 だいぶ、アホなやりかたかも知れませんが、参考になれば幸いです。
お礼
ご返答のほどありがとうございます。 コマンドラインではうまく特定箇所のみ表示されました。 これをスクリプト化する場合になぜかエラーが出て うまくいかないのです。 awk の使い方がよく分かっていないからでしょうか? 補足に書かせて頂きました。 よろしければご教授願えませんでしょうか? よろしくお願いいたします。
補足
ご返答ありがとうございます。 補足よろしいでしょうか。 スクリプト化しようとするとawkでエラーが出てしまいます。 コマンドラインからは、 >ifconfig |grep inet |grep -v 127 |grep -v inet6 で、 inet 192.168.3.64 netmask 0xffffff00 broadcast 192.168.3.255 が表示されます。 >ifconfig |grep inet |grep -v 127 |grep -v inet6 |awk '{print $2}' からは、欲しい情報(ここではIPです) 192.168.3.64 のみ表示されます。 これをスクリプト化しようとして、 ***** ppp.pl ***** #!/usr/bin/perl #!/usr/bin/awk -f print(`ifconfig |grep inet |grep -v 127 |grep -v inet6 |awk '{print $2}'`); ********** として、パーミッションを実行可能にして実行すると awk '{print $2}' の箇所に対してエラーが出てスクリプト化出来ません。 これは何故でしょうか? 何度も申し訳ありませんが、教えていただけませんでしょうか?
お礼
ご返答ありがとうございます。 ~|cut -d" " -f 2 で正しく表示出来ました。 ありがとうございました。