web-dev-qa-db-ja.com

IP範囲のgrep?

ローカルIPアドレスが10.0.0.159のRHEL7ボックスで、次のコマンドは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」を出力するには、コマンドを何に変更する必要がありますか?

2
CodeMed

注:ifconfigは非推奨のcmdです。 cmdを使用する必要があります。今後はiproute2パッケージで。以下に、ipを使用して、置換ツールを使用して目的を達成する方法を示します。


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

IPCIDR

このフォームは、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

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

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

ipcalc

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を実行する必要がなく、必要なバリエーションをより簡単に形成できます。 。

4
slm

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

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

somethingを実行し、それをechoへの入力として受け取ります。それ以外はすべて、echo 'される通常のテキストです。

ifconfig eth0

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

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

システム内の複数のIPを分離します。 -Eは、正規表現を使用するようにgrepに指示します。そのため、たとえば、[0-9]*を使用してすべての数値を一致させることができます。 -oは、デフォルトでgrep条件に一致する行全体を出力するのではなく、正規表現に一致する部分のみを出力するようにgrepに指示します。したがって、たとえば入力行がinet addr:10.0.0.159 Bcast:10.0.0.255 Mask:255.255.255.0の場合、BcastMaskの部分を除いてinet addr:10.0.0.159のみが出力されます。

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

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

grep -v '127.0.0.1'

ループバックIPを気にしないため、出力のリストからその1つのIPを削除しています。


ご覧のとおり、コマンドはifconfigの出力を取得し、情報をフィルタリングして、必要な情報のみを分離します。計算や情報処理は行っていません。ただし、出力するのはサブネットとマスクです。これらは、ifconfigによって明示的に表示されない情報です。言い換えれば、あなたはあなたが望むものを得るために物事を異なってフィルターで取り除くことはできません。行の最後にあるMaskフィールドを使用して、いくつかの処理と計算を行う必要があります。要約すると、「コマンドを変更して必要なものを印刷する」ことはできません。まったく異なるコマンドを作成する必要があります。

slmの回答は、同様の手法(必要な情報だけを保持するために情報をフィルターで除外する)を使用しますが、入力を、必要な情報を持つコマンドに変更しました。 :-)必要なものを正確に出力するコマンドがなく、それに対して何らかの処理を行うことが唯一の選択肢であった場合、例またはベースとして使用できるifsの醜いセットを次に示します。未来。 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];}'

このコマンドは、ipの出力をaddress(10.0.0.159)とマスク(8)の間で分割します。次に、IPを4つの番号に分割します。次に、マスクに従って数値をゼロに設定します。しかし、それはビット単位ではありません。つまり、マスク8、16、および24のみを処理します。これは、私がハードコーディングしたものだからです。 ;)

手元にあるツールについてもう少し学ぶことができれば幸いです。 ^ _ ^

3
msb