• ベストアンサー

行の中のある文字列の抜出し方

よろしくお願いいたします。 ある行があった時に 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です。 よろしくお願いいたします。

  • aopoma
  • お礼率95% (123/129)

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

  • ベストアンサー
  • Lean
  • ベストアンサー率72% (435/603)
回答No.3

>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」が表示されると言うことです。

aopoma
質問者

お礼

ご返答ありがとうございます。 ~|cut -d" " -f 2 で正しく表示出来ました。 ありがとうございました。

その他の回答 (3)

  • Lean
  • ベストアンサー率72% (435/603)
回答No.4

訂正しておきます。 >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

aopoma
質問者

お礼

早速のご返答ありがとうございます。 MacOSXでのBSDと、本物のUnixではパラメータの書式が かなり違うんですね。 ありがとうございました。リンクして頂いた本で調べて見ます。

  • qaaq
  • ベストアンサー率36% (146/404)
回答No.2

単純に cut コマンドを使ってみてはどうでしょうか。 % ifconfig rl0| grep "inet " | cut -d" " -f 2 192.168.0.6 手元のFreeBSD5.5ではこんな結果になります。 解はたくさんあると思います。

aopoma
質問者

お礼

ご返答まことにありがとうございます。 BSD5.5では上手くいくのですね。わたしの環境(MacOSX)では 上手く行きませんでした。Macと言いましても中身はFreeBSDですので 上手く行くと思って、そのまま打ち込んだのですが・・ 補足を書かせて頂きました。 何度もすみませんが、初心者なのでよく分からずご教授願えましら ありがたいです。

aopoma
質問者

補足

ご返信ありがとうございます。 最近スクリプトを始めたのでよく分かっていないのですが、 ifconfig rl0| grep "inet " | cut -d" " -f 2 のままでは上手く行きませんでした。 BSDでも書き方の違いがあるのですね。 ちなみに上のコマンドですが、ご解説願えませんでしょうか。 分かるのはgrepの所だけです。恥ずかしい話ですが・・・ ifconfig rl0 と cut -d" " -f 2 の意味や使い方をご教授いただけましたら幸いです。 何度もしつこいようですが、周りにスクリプト(と言いますか UnixやBSDやシェル)が分かる人が居ないので・・ よろしくお願い申し上げます。

  • agharta
  • ベストアンサー率52% (54/103)
回答No.1

cat file | grep ... | head -1 | awk '{print $2}' 見たいにやれば、いいのですかね。 cat fileの部分は、何かコマンドに置き換えても大丈夫でしょう。 grep でできるだけ、ヒット件数が少なくなるような行を探し、 head -1で、最初の行だけ取り出す。 で、awk '{ print $2 }'で二番目の項目を取得する。 だいぶ、アホなやりかたかも知れませんが、参考になれば幸いです。

aopoma
質問者

お礼

ご返答のほどありがとうございます。 コマンドラインではうまく特定箇所のみ表示されました。 これをスクリプト化する場合になぜかエラーが出て うまくいかないのです。 awk の使い方がよく分かっていないからでしょうか? 補足に書かせて頂きました。 よろしければご教授願えませんでしょうか? よろしくお願いいたします。

aopoma
質問者

補足

ご返答ありがとうございます。 補足よろしいでしょうか。 スクリプト化しようとすると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}' の箇所に対してエラーが出てスクリプト化出来ません。 これは何故でしょうか? 何度も申し訳ありませんが、教えていただけませんでしょうか?

関連するQ&A

  • 行の中の文字列の取出し方

    よろしくお願いいたします。 ある行があった時に 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です。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • IPアドレス@FreeBSD

    サーバーを立てなければならなくなりました。 まず、FreeBSDの入ったマシンのIPアドレスを調べたいのですが、いわゆるipconfigにあたるコマンドって何ですか? ifconfigだと思うんですよね。 ただ、これでIPアドレスの見方がわかりません。 inet 192.168.1.20 network 0xffffff00 broadcast 192.168.1.255 と出ているので、192.168.1.20 がIPアドレスですかね。

  • FreeBSDのネットワーク接続

    今FreeBSD6.1を使ってますが(超初心者)、インターネット接続ができなくて困っています。DHCPによる接続を試みていますが、/sysinstallでDHCPどんな情報を入力(host,domain,IPv4gateway,NameServer,IPv4adress,Netmask等)すればよいのかわかりません。ODNを使っているのですが、よくわかりません。BSDのftpを使ってダウンロードしたいのですが・・・。 だれか、知っておられる方、ご教授おねがいします。

  • アクティブなインターフェースのシステム情報の取得方法につきまして

    FreeBSD(MacOS X)を使用しています。 >netstat -rnf inet を実行します。結果は次のようになります。 ******************************** Routing tables Internet: Destination  Gateway  Flags  Refs  Use  Netif  Expire default 11.33.55.7 UGSc 38 469 en0 11.22.33/44 link#4 UCS 1 0 en0 11.22.33.4 0:0:11:22:33:44 UHLW 30 0 en0 「Netif」が「en0」か「en1」になっていたら、 アクティブと判定し、この全体を配列に入れます。 => my @NS=`netstat -rnf inet`; 次に、 $NS[0]=Routing tables $NS[1]=空白 $NS[2]=Internet: $NS[3]=Destination  Gateway  Flags  Refs ・・・ $NS[4]=default 11.33.55.7 UGSc ・・・ $NS[5]=11.22.33/44 link#4 UCS ・・・ ・・・ と別々の配列か変数に入れて散らばっている文字列をキチンと 格納したいのですが、その仕方がまず分かりません。 格納したら、 分岐で「en0」があればそれに対する情報を引出したいのです。 やっかいなのが、ipはnetstatでは無くifconfigなのです。 >ifconfig -aで、 ********************** en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> inet 11.22.33.44 netmask 0xffffff00 broadcast 11.22.255.255 ether 00:11:22:33:44:55 と表示されるのですが、,や:や;とバラバラの文字列群を どう処理したら良いのかも分からないのです。 いったん全部を配列に入れて、各行を別々の配列に入れて、 ソートして、ifで分岐して・・としているですが、成功しません。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ibook に固定ipアドレスを設定する方法は?

    全くの初心者で申し訳ありません。 ご存知の方よろしくお願いします。 ibook dual USB から自宅の Linux fedora core 4 に クロスケーブルでssh で接続しようと考えています Linux のアドレスは 192.168.0.1(wanには繋いでません)で ibook のアドレスをシステム環境設定のネットワークで手入力で192.168.0.2 と入力すると、 en0: アドレス設定なしです ppp0: flags=8011<UP,POINTOPOINT,MULTICAST> mtu 1492 inet 192.168.0.2 --> 10.112.112.112 netmask 0xffffff00 の様に、ppp0のアドレスが変わりました。 これで ibook ターミナルから、ping -c 10 192.168.0.1 すると反応しません なので sudo ifconfig en0 192.168.0.2 すると en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:03:93:cf:3b:9e media: autoselect (100baseTX <full-duplex>) status: active supported media: none autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP <full-duplex,hw-loopback> 100baseTX <half-duplex> 100ba の様に、en0のアドレスが変わりました。 これで ibook ターミナルから、ping -c 10 192.168.0.1 するときちんと反応します。 これでよいのでしょうか? しかし再起動するともとの設定に戻ってしまいます システム設定パネルからen0のアドレスを変更はできないのでしょうか?(再起動しても設定が反映) それとも他に良い方法がありますか? よろしくお願いします。

    • 締切済み
    • Mac
  • FreeBSDでルータ作成ができなくてこまっています 

    当方初心者で、設定に丸3日程かかっていてかなりこまっています。 教えてください、よろしくお願いします。 FreeBSD7.2を使いブロードバンドルータとして動作させようと思っています。 接続方法はWANのIPをDHCPクライアントでIPSから取得し LANのIPは手動で設定し、Vistaを接続してインターネットに接続したいです。 FreeBSDビギナーズバイブルを見ながらPacket Filterを設定し、Vistaでインターネットに接続しようとすると、DNSの構成に問題がある可能性が有るとエラーがでます。 re0 WAN em0 local rc.confの設定は ---------------------------------------------------------- defaultrouter="192.168.1.1" gateway_enable="YES" tcp_drop_synfin="YES" icmp_drop_redirect="YES" pf_enable="YES" pf_rules="/etc/pf.conf" pflog_enable="YES" hostname="*****.localhost" ifconfig_re0="DHCP" ifconfig_em0="inet 192.168.1.1 netmask 0xffffff00" keymap="jp.106" ---------------------------------------------------------- Vistaのネットワーク設定は IPアドレス 192.168.1.18 サブネットマスク 255.255.255.0 デフォルトゲートウェイ 192.168.1.1 優先DNSサーバー 192.168.1.1 代替DNSサーバー FreeBSDのnameserver 設定している内容もあまり解かっていませんが、ブロードバンドルータを作りたいので教えてください、よろしくお願いします。

  • シェルで特定行を処理する方法を教えてください。

    初めてご質問させていただきます 数時間考えましたが、全くできない初心者です。 awkとかも使ってみましたが・ちんぷんかんぷんです。 よろしくお願いいたします。 環境:RedHat、シェル:bash [やりたいこと] 特定の文字以外から始まる行を、 特定文字から始まる行へ連結させたい。 (例  aaaから始まっていない行(bbb、ccc、ddd)を、  aaaから始まる行へ出力させる。 ■元となるテキストファイル ============ aaa bbb ccc ddd aaa aaa aaa eee aaa ============ ■整形後のファイル ============ aaabbbcccddd aaa aaa aaaeee aaa ============

  • LANが繋がらない(再)

    以前、以下のような質問をしました。 --------------------- FreeBSD初心者です。 FreeBSD(4.2R)マシンとWin98マシンをLANで繋ぎたいのですがうまくいきません。 BSDマシンにLANカード(3CXE589ET)を入れ、 IP Address:192.168.10.13 Netmask:255.255.255.0 に設定して自分自身にpingしたところ、 ping: sendto: No route to host ....... 9 packets transmitted, 0 packets received, 100% packet loss となりました。 ifconfig ep0では、 ep0: flags=8802<BROADCAST,SIMPLEX.MULTICAST> mtu 1500 ether 00:00:86:61:e0:2d media 10baseT/UTP supported media: 10base2/BNC 10baseT/UTP 10base5/AUI とあります。 BSD側に問題があるのでしょうか? よろしくお願い致します。 ------------------------- それで、 ifconfig ep0 up ifconfig inet 192.168.10.13 netmask 255.255.255.0 とやったら解決したのですが、 rebootすると、 ep0: flags=8802<BROADCAST,SIMPLEX.MULTICAST> mtu 1500 ether 00:00:86:61:e0:2d media 10baseT/UTP supported media: 10base2/BNC 10baseT/UTP 10base5/AUI のように「UP」の文字やIPアドレス、マスクの記述が消えて元に戻ってしまいます。どうしたら設定が残るのでしょうか? よろしくお願いします。

  • KNOPPIXで起動時にIPアドレスを設定したい(リマスタリング)

    KNOPPIXをパッケージを削ったり、シェルスクリプトを入れたりしてリマスタリングを行っています。 /etc/init.dに #!/bin/bash ifconfig eth0 192.168.3.2 netmask 255.255.0.0 route add default gw 192.168.3.1 と書き、 update-rc.dで90番目に起動するように設定しました。 リマスタリング後のテスト(fromhd=/dev/sda1)で同じくupdate-rc.dで自動起動にしたsshは動作確認取れたのですが、ifconfigと打ってもeth0が出てきていません。 後でifconfig 192.168.3.2と打つと、eth0は出てきて、netmaskは設定値(255.255.0.0)に勝手になっています。 シェルスクリプトの書き方・順番が間違っているのでしょうか? CentOSとかを昔いじっていたのですが、CentOSと同じように/etc/以下にeth0の設定ファイルがあって上書きすると起動時にそれが設定されるなどは無いのでしょうか? お分かりになられる方いらっしゃいましたら、ご教授願います。

  • 引数が元のコードと、ファイルの文字列処理について

    よろしくお願いします。 MacOSX(FreeBSD)を使っています。 ●引数を元にして任意のファイルの特定行を  抜き出す方法?  コマンドラインから、   >./[スクリプト名] [ファイル名] [行番号]   (*例 >./test.pl ppp.txt 5)  を打って、   >kkk   (*その行番号の行)  と返ってくるスクリプトを作りたいのですが、  どうすれば良いのかさっぱり分かりません。  ファイルは固定では無く任意のファイルで  行いたいです。また行番号を忘れてコマンドを  入力した場合   (*例 >./test.pl 444.txt)  には、エラーメッセージを出したいのです。  どのようなコードを書けば良いでしょうか? ●文字列処理ですが・・  ファイルが   AAA   BBBCCC DDD EEEEE   FF GGGG HHH   IIIII   ・・・  とあった時に、  例えば3行目のGGGGだけを抜き出す  スクリプトはどうすれば良いでしょうか?  今やっている方針としては、   1.ファイルオープン   2.配列にいったん全部入れる   3.getc関数で1行ずつスカラーに取り込む   4.・・・  このあたりまで考えて息詰っています。  教えて頂けませんでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Perl