如何使用Grep提取仅第一个八位组为2的子网条目
哦,我明白你的问题了——你遇到的坑出在^锚点的作用范围上!
你的所有子网都挤在同一行里,^2匹配的是整个行的开头,而不是每个子网的开头。因为你的行确实以2开头(第一个子网就是2.1.1.0/24),所以grep直接返回了整行内容,这就是为什么你得到了所有子网,而不是预期的两个。
下面给你两种可行的解决方案:
方法1:用grep的-o选项精准提取匹配项
直接用grep的-o参数(只输出匹配的部分),搭配正则表达式定位每个以2开头的独立子网:
grep -o '\b2\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\b' file
细节解释:
-o:强制grep只输出被正则匹配到的片段,而不是整个行\b:单词边界,确保我们匹配的是独立的子网(不会误抓22.6.7.0/24里的开头2)2\.:明确匹配第一个八位组是2的子网(\.是转义后的点号,避免匹配任意字符)[0-9]\+:匹配一个或多个数字,对应子网剩余的八位组和掩码部分
运行后会输出:
2.1.1.0/24 2.2.2.0/24
如果想把结果合并成一行(用空格分隔),再加个管道到xargs即可:
grep -o '\b2\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\b' file | xargs
方法2:先拆分子网到单独行,再筛选
另一种更直观的思路是先把空格分隔的子网拆成每行一个,再用你最初的筛选逻辑:
tr ' ' '\n' < file | grep '^2\.'
细节解释:
tr ' ' '\n' < file:把文件里的空格替换成换行符,让每个子网单独占一行grep '^2\.':现在^匹配的是每行的开头,2\.确保第一个八位组是2,完全符合你的需求
同样,要合并成一行的话,加上xargs:
tr ' ' '\n' < file | grep '^2\.' | xargs
两种方法最终都会输出你想要的结果:2.1.1.0/24 2.2.2.0/24
内容的提问来源于stack exchange,提问作者ph3ro
相关产品推荐
相关产品推荐

