1つのコマンドでIPアドレスを4オクテットまたは3オクテットに一致させるにはどうすればよいですか?
ターゲット - xxx.xxx.xxxまたはxxx.xxx.xxx.xxxと一致する(構文はLinuxおよびSolarisに適している必要があります)
次のコマンドを1つにまとめるにはどうすればよいですか?
echo $IP_ADDRESS | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
echo $IP_ADDRESS | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
私もこれを試しましたが(できませんでした)
echo $IP_ADDRESS | egrep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}|[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
答え1
if expr ".$IP_ADDRESS" : '\(\.[0-9]\{1,3\}\)\{3,4\}$' > /dev/null
then echo match
else echo no match
fi
文字列以外の行を一致させるために使用されるため、grep
ここでは使用できません。パラメータを置き換えるため、これらはgrep
使用できません。echo
また、変数を引用符で囲まないままにすることはできません。それ以外の場合、ファイル名の生成とトークン化が発生します。
そのパターンに一致する入力ファイルの行を見つけるには、grep
次のように使用する必要があります。
grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}' < input.file
-x
全体が 10 進 3 桁または 4 桁から最大 3 桁(オプション)で構成されるすべての行が報告されます。
テキストファイルから3つまたは4つのIPアドレスを最大3桁まで抽出したい場合は、次の方法を使用することをお勧めしますperl
。
perl -lne 'print for grep /^\d{1,3}(\.\d{1,3}){2,3}$/, /[\d.]+/g'
出力されます:
111.222.333
1.2.3.4
次の入力の場合:
foo 1.1234.2.3 1.2 1.2.3.4.5 111.222.333 bar1.2.3.4@
次のようにすることもできます。
tr -cs 0-9. '[\n*]' < input.file |
grep -Ex '[0-9]{1,3}(\.[0-9]{1.3}){2,3}'
答え2
これにより、トリックを実行できます。
echo $IP_ADDRESS | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
または名前付きセットを使用します。
echo $IP_ADDRESS | grep -Eo '([[:digit:]]{1,3}\.[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){1,2})'
はい
# 4 octets
$ echo '10.10.0.1' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
10.10.0.1
# 3 octets
$ echo '10.10.0' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
10.10.0
# 2 octets
$ echo '10.10' | grep -Eo '([0-9]{1,3}\.[0-9]{1,3}(\.[0-9]{1,3}){1,2})'
$
メモ:これは、0.0.0.0から999.999.999.999までのすべての式と一致します。