
複数のネットワークで生成されたリストからIPを抽出しようとしていますが、そのIPを分離する必要があります。欲しくない0で終わります。
たとえば、以下のリストにはテキスト、一般IP、IP範囲があります。私が望むのは、ゼロまたはサブネットマスクで終わるIPではなく、通常のIPだけを取得することです。
; Spamhaus DROP List 2016/07/03 - (c) 2016 The Spamhaus Project
; http://www.spamhaus.org/drop/drop.txt
; Last-Modified: Sun, 3 Jul 2016 21:18:32 GMT
; Expires: Sun, 03 Jul 2016 23:26:45 GMT
1.0.1.0/24
223.223.176.0
129.130.100.100
1.160.118.30
走ればgrep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
それは私に以下を与えます:
1.0.1.0
223.223.176.0
129.130.100.100
1.160.118.30
正規表現の最後の部分を次に変更しようとしました。
grep -Eo '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[^1-255]'
しかし、うまくいきません。
検索プロセスを高速化するために、grep(またはsed / awk)に対する複数のパイプラインの使用を最小限に抑えるよう努めています。たとえば、私が避けたいものは次のとおりです。
grep <all IPs from list> | grep -v <all those that end in 0 or subnet>
これらのIPを取得するために1行にgrep / sed / awkを使用できますか?上記の例では、結果は次のようになります。
129.130.100.100
1.160.118.30
ありがとう
答え1
あなたは試すことができますawk
:
$ awk -F . '$NF !~ /^0/' <file
129.130.100.100
答え2
質問の元のバージョンへの回答
$ awk -F'[./]' '($4+0) != 0' iplist
129.130.100.100
どのように動作しますか?
-F'[./]'
これにより、フィールド区切り文字がまたは
.
に設定されます/
。これにより、最後のオクテットは常にフィールド4になります。($4+0) != 0
この論理条件は、4番目のオクテットが次の場合に真と評価されます。いいえ0.この場合、明示的なジョブは含まれていないため、awkは行を印刷するための基本操作を実行します。
0
awkに文字列比較ではなく数値比較を実行させるために、4番目のフィールドを追加します。
答え3
grep -E '^([0-9]{1,3}\.){3}[1-9][0-9]{0,2}$'
[1-9]
最後のオクテットの最初の数字がゼロでないことを確認してください。オプションの次の数字は、次の0(129.130.100.100
)とまだ一致できることを意味します。
$
行が最後のオクテットの後に終わるようにして、サブネットマスクと一致しないようにします。
[^1-255]
次のようなさまざまな理由で目的を達成できませんでした。
- 数字以外の文字を扱います。 「(
1
間2
) OR5
OR5
」を意味します。 ^
方法」いいえこの範囲内で」
したがって、最後のオクテットが1、2、または5で始まるすべての項目を除いて、残りと一致します。