如何删除端口为1/1且MAC非aa:bb:cc:dd:ee:ff的文本行
处理方法
你需要保留的行满足两个条件之一即可:
- 第二列端口号不是
1/1 - 端口号为
1/1,但第一列MAC地址是aa:bb:cc:dd:ee:ff
其余同时满足「端口为1/1、MAC不是指定值」的行直接删除即可,以下是几种常用的命令行实现方式:
awk 方案(优先推荐)
不改动原文件、结果输出到新文件的写法最安全,命令如下:
awk '$2!="1/1" || $1=="aa:bb:cc:dd:ee:ff"' 原文件路径 > 结果文件路径
如果要直接修改原文件(GNU awk支持),加原地修改参数即可:
awk -i inplace '$2!="1/1" || $1=="aa:bb:cc:dd:ee:ff"' 原文件路径
awk默认按空格分割列,$1对应MAC地址列,$2对应端口列,两个条件满足任意一个就打印当前行,逻辑简单不容易出错。用你给出的示例测试,处理后结果为:
aa:bb:cc:dd:ee:ff 1/1 ff:ee:dd:cc:bb:aa 1/2
sed 方案
用sed匹配删除的写法如下,结果输出到新文件:
sed '/ 1\/1$/ { /aa:bb:cc:dd:ee:ff/!d }' 原文件路径 > 结果文件路径
逻辑是先匹配所有以 1/1结尾的行,在这些行里如果找不到指定的MAC地址就执行删除,其他行全部保留。GNU sed要原地修改的话加-i参数即可。
grep 方案
通过反向匹配过滤掉要删除的行也能实现,需要grep支持PCRE正则:
grep -Pv '^(?!aa:bb:cc:dd:ee:ff\s).*\s1/1$' 原文件路径 > 结果文件路径
这个方法兼容性不如前两个,部分精简系统的grep没有-P参数,不推荐优先使用。
内容的提问来源于stack exchange,提问作者Regastrid
相关产品推荐
相关产品推荐

