linux + IPアドレスを3オクテットまたは4オ​​クテットと一致させます。

linux + IPアドレスを3オクテットまたは4オ​​クテットと一致させます。

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までのすべての式と一致します。

関連情報