ローカル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」を出力するには、コマンドを何に変更する必要がありますか?
注:ifconfig
は非推奨のcmdです。 cmdを使用する必要があります。今後はiproute2パッケージで。以下に、ip
を使用して、置換ツールを使用して目的を達成する方法を示します。
ifconfig
でこれを行うのではなく、代わりに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
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
を使用すると、通常は非常に複雑なテキストを解析するために多くのsed
&awk
を実行する必要がなく、必要なバリエーションをより簡単に形成できます。 。
コマンドラインを変更して目的の操作を実行するには、まずコマンドラインが何を実行しているかを理解する必要があります。分析は次のとおりです。
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
の場合、Bcast
とMask
の部分を除いて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の回答は、同様の手法(必要な情報だけを保持するために情報をフィルターで除外する)を使用しますが、入力を、必要な情報を持つコマンドに変更しました。 :-)必要なものを正確に出力するコマンドがなく、それに対して何らかの処理を行うことが唯一の選択肢であった場合、例またはベースとして使用できる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];}'
このコマンドは、ip
の出力をadd
ress(10.0.0.159)とマスク(8)の間で分割します。次に、IPを4つの番号に分割します。次に、マスクに従って数値をゼロに設定します。しかし、それはビット単位ではありません。つまり、マスク8、16、および24のみを処理します。これは、私がハードコーディングしたものだからです。 ;)
手元にあるツールについてもう少し学ぶことができれば幸いです。 ^ _ ^