解決済み

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

  • すぐに回答を!
  • 質問No.2495671
  • 閲覧数228
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 95% (123/129)

よろしくお願いいたします。

ある行があった時に
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です。

よろしくお願いいたします。

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

  • 回答No.3

ベストアンサー率 72% (435/603)

>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

お礼率 95% (123/129)

ご返答ありがとうございます。
~|cut -d" " -f 2
で正しく表示出来ました。
ありがとうございました。
投稿日時 - 2006-10-29 21:11:10
たいせつな将来のこと。あえて、知らない人に聞いてみよう。

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 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
お礼コメント
aopoma

お礼率 95% (123/129)

早速のご返答ありがとうございます。
MacOSXでのBSDと、本物のUnixではパラメータの書式が
かなり違うんですね。
ありがとうございました。リンクして頂いた本で調べて見ます。
投稿日時 - 2006-10-27 01:05:36
  • 回答No.2

ベストアンサー率 36% (146/403)

単純に cut コマンドを使ってみてはどうでしょうか。

% ifconfig rl0| grep "inet " | cut -d" " -f 2
192.168.0.6

手元のFreeBSD5.5ではこんな結果になります。

解はたくさんあると思います。
補足コメント
aopoma

お礼率 95% (123/129)

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

何度もしつこいようですが、周りにスクリプト(と言いますか
UnixやBSDやシェル)が分かる人が居ないので・・

よろしくお願い申し上げます。
投稿日時 - 2006-10-26 19:42:52
お礼コメント
aopoma

お礼率 95% (123/129)

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

ベストアンサー率 52% (54/103)

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

だいぶ、アホなやりかたかも知れませんが、参考になれば幸いです。
補足コメント
aopoma

お礼率 95% (123/129)

ご返答ありがとうございます。

補足よろしいでしょうか。
スクリプト化しようとすると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}'
の箇所に対してエラーが出てスクリプト化出来ません。

これは何故でしょうか?

何度も申し訳ありませんが、教えていただけませんでしょうか?
投稿日時 - 2006-10-26 19:33:02
お礼コメント
aopoma

お礼率 95% (123/129)

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

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


OKWAVE若者応援スペシャル企画

ピックアップ

ページ先頭へ