IP範囲を見つけるにはgrepを使用しますか?

IP範囲を見つけるにはgrepを使用しますか?

ローカルIPアドレスが10.0.0.159のRHEL 7システムでは、次のコマンドはIPを印刷します10.0.0.159

$ echo "$(ifconfig eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | \
   grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')""(rw,sync)" 

「10.0.0.0/8」を印刷するには、コマンドを何に変更する必要がありますか?

答え1

メモ: ifconfig廃止予定の cmd です。 cmdを使用する必要があります。 iproute2パッケージにあります。以下は、ip交換ツールを使用して目的の操作を実行する方法を示しています。


ifconfigこれを行うのではなく、コマンドを使用することをお勧めしますip

IPネットワークセグメント

このフォームはCIDR表記でIPアドレスを表示します。

$ ip addr list eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24

-or-

$ ip a l eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24

ネットワークセグメント

このフォームはCIDR表記でネットワークアドレスを表示します。

$ ip route show | awk '/eth0.*scope/ {print $1}'
10.0.2.0/24

IP計算

また、このipcalcコマンドを使用して上記のアドレスを操作して他の形式を計算することもできます。たとえば、

$ ipcalc -n $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
NETWORK=10.0.2.0

$ ipcalc -p $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
PREFIX=24

これを使用すると、複雑すぎるテキストを解析するためにipcalc多くのことを行わなくても、必要なバリエーションをより簡単に整理できますsedawk

答え2

必要に応じてコマンドラインを変更するには、まずコマンドラインが何をしているのかを理解する必要があります。分析は次のとおりです。

echo "$(<something>)""(rw,sync)" 

他のすべてはsomething編集するプレーンテキストです。echoecho

ifconfig eth0

ネットワーク情報を取得します。

grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' 

システムから複数のIPを分離します。たとえば、-Egrepに正規表現を使用するように指示すると、正規表現を使用してすべての数値を一致させることができます。デフォルトでは、grep条件に一致する行全体ではなく、正規表現に一致する部分のみを出力するようにgrepに指示します。したがって、入力ラインが裏面と部分を無視して出力のみになります。[0-9]*-oinet addr:10.0.0.159 Bcast:10.0.0.255 Mask:255.255.255.0inet addr:10.0.0.159BcastMask

grep -Eo  '([0-9]*\.){3}[0-9]*' 

これはラベルがないことを除いて上記とまったく同じです。inet addrこれは、IPを具体的に分離し、ラベルを削除することを意味します。ついに、

grep -v '127.0.0.1'

ループバック IP に興味がないため、その IP は出力リストから削除されます。


ご覧のとおり、コマンドは出力を取得してifconfig情報をフィルタリングして、必要な情報のみを分離します。いかなる計算や情報処理も行いません。ただし、印刷したいのは、.netが明示的に表示しない情報であるサブネットとマスクですifconfig。つまり、必要なものを得るために他の方法で何かをフィルタリングすることはできません。Mask行の末尾にあるフィールドを使用して、いくつかの処理と計算を実行する必要があります。つまり、「必要な内容を印刷するようにコマンドを変更する」ことはできません。まったく異なるコマンドを作成する必要があります。

slmの答えは同様の技術(必要な情報だけを保持するための情報フィルタリング)を使用しますが、入力を必要な情報を含むコマンドに変更します。 :-) 必要なものを正確に出力するコマンドがなく、それに対していくつかの処理を実行することが唯一のオプションである場合、将来のif例または基礎として使用できる見苦しいsセットがあります。 slmの最初の解決策を使用し、マスクが常に8、16、または24であるとします。

ip a l eth1 | awk '/inet.*brd/ {split($2,add,"/");split(add[1],ip,".");if(add[2]<=24){ip[4]=0} if(add[2]<=16){ip[3]=0} if(add[2]<=8){ip[2]=0} print ip[1]"."ip[2]"."ip[3]"."ip[4]"/"add[2];}'

このコマンドは、出力をipress add(10.0.0.159)とマスク(8)に分割します。次にIPを4つの数字に分割します。次に、マスクに基づいて数字を0に設定します。しかし、これはビット単位ではありません。これは、マスク8、16、24のみを処理することを意味します。なぜならこれが私がハードコーディングしたものだからです。 ;)

あなたが持っているツールについてもっと学ぶことを願っています。 ^_^

関連情報