我正在尝试显示以下包含IP地址的输入文件。我想显示如示例所示的字符串之间的精确匹配,但似乎没有成功。为了演示,这里是文本文件内的示例数据input.txt
:
1. IP [1.1.1.1]
2. IP [1.1.1.11]
3. IP [1.1.1.115]
4. IP "1.1.1.1 "
5. IP "1.1.1.11 "
6. IP "1.1.1.115"
7. IP U*@K1.1.1.1-I(M@
8. IP *JJ1.1.1.11()
9. IP *[email protected]*@
10. IP U#@I1.1.1.19lds
因此,假设我要查找此IP:,1.1.1.1
我将编写以下代码:
grep -w '1.1.1.1' input.txt
有了这个我得到以下输出:
1. IP [1.1.1.1]
4. IP "1.1.1.1 "
但是预期的输出是,第7行也应显示,因为它包含1.1.1.1
随机字符串之间的IP 。因此,预期输出应如下所示:
1. IP [1.1.1.1]
4. IP "1.1.1.1 "
7. IP U*@K1.1.1.1-I(M@
现在让我说我想找到这个字符串1.1.1
:
grep -w '1.1.1' input.txt
我得到以下输出:
1. IP [1.1.1.1]
2. IP [1.1.1.11]
3. IP [1.1.1.115]
4. IP "1.1.1.1 "
5. IP "1.1.1.11 "
6. IP "1.1.1.115"
7. IP U*@K1.1.1.1-I(M@
预期的输出是,它不应该返回任何东西,因为整个字符串1.1.1
不在里面input.txt
。
grep有能力做到这一点吗?
简化并更加明确。
$: grep '[^.0-9]1.1.1.1[^.0-9]' txt
1. IP [1.1.1.1]
4. IP "1.1.1.1 "
7. IP U*@K1.1.1.1-I(M@
但是,这仍然存在缺陷-在测试数据中添加另一条记录。
$: grep '[^.0-9]1.1.1.1[^.0-9]' txt
1. IP [1.1.1.1]
4. IP "1.1.1.1 "
7. IP U*@K1.1.1.1-I(M@
11. IP [1a1b1c1]
然后试试这个:
$: grep '[^.0-9]1\.1\.1\.1[^.0-9]' txt
1. IP [1.1.1.1]
4. IP "1.1.1.1 "
7. IP U*@K1.1.1.1-I(M@
这仍然无法说明在线路的最末端使用IP的可能性,因此,如果完全有这种可能性,
$: grep -E '(^|[^.0-9])1\.1\.1\.1([^.0-9]|$)' txt
1. IP [1.1.1.1]
4. IP "1.1.1.1 "
7. IP U*@K1.1.1.1-I(M@
12. IP 1.1.1.1
如果IP作为变量出现,则可以在其位置引用它。
$: ip=1.1.1.1
$: echo "grep -E '(^|[^.0-9])${ip//./\\.}([^.0-9]|$)'"
grep -E '(^|[^.0-9])1\.1\.1\.1([^.0-9]|$)'
$: grep -E "(^|[^.0-9])${ip//./\\.}([^.0-9]|$)" txt
1. IP [1.1.1.1]
4. IP "1.1.1.1 "
7. IP U*@K1.1.1.1-I(M@
12. IP 1.1.1.1
如果您的模式变得复杂,则可能会出现问题,但是在这里可以正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句