我有两个文件,“文件A”是在同一行上具有相应MAC地址的IP地址列表。 “文件B”是仅MAC地址的列表。我需要比较这两个文件,并列出文件A中没有文件B中找到的MAC地址的行。
文件A:
172.0.0.1 AA:BB:CC:DD:EE:01
172.0.0.2 AA:BB:CC:DD:EE:02
172.0.0.3 AA:BB:CC:DD:EE:03
文件B:
AA:BB:CC:DD:EE:01
AA:BB:CC:DD:EE:02
所以输出应该是:
172.0.0.3 AA:BB:CC:DD:EE:03
我正在寻找sed,awk,grep,python中的解决方案或任何能够提供我想要的文件的解决方案。
答案 0 :(得分:4)
你的输入在每一行的开头是否真的有一个美元符号,或者是你问题的格式化怪癖?如果你可以摆脱美元符号,那么你可以使用这个:
fgrep -v -f fileb filea
答案 1 :(得分:1)
#!/usr/bin/env python
with open('fileb') as fileb, open('filea') as filea:
macs = set(map(str.strip, fileb))
for line in filea:
ip_mac = line.split()
if len(ip_mac) == 2 and ip_mac[1] not in macs:
print(" ".join(ip_mac))
答案 2 :(得分:1)
with open('filea','r') as fa:
with open('fileb','r') as f:
MACS=set(line.strip() for line in f)
for line in fa:
IP,MAC=line.split()
if MAC not in MACS:
print (line.strip())
答案 3 :(得分:1)
with open(FILEB) as file1,open(FILEA) as file2:
file1={mac.strip() for mac in file1}
file2={line.split()[1]:line.split()[0] for line in file2}
for x in file2:
if x not in file1:
print("{0} {1}".format(file2[x],x))
输出
172.0.0.2 AA:BB:CC:DD:EE:05
172.0.0.4 AA:BB:CC:DD:EE:06
172.0.0.6 AA:BB:CC:DD:EE:03
172.0.0.66 AA:BB:CC:DD:EE:0E
答案 4 :(得分:1)
使用awk
的一种方法。它将fileB
中的MAC保存在一个数组中,并且fileA
的每个第二个字段在数组中检查它,并且只在未找到时打印。
awk '
FNR == NR {
data[ $0 ] = 1;
next;
}
NFR < NR && !($2 in data)
' fileB fileA
输出:
172.0.0.3 AA:BB:CC:DD:EE:03
答案 5 :(得分:1)
的Python:
macs = set(line.strip() for line in open('fileb'))
with open('filea') as ips:
for line in ips:
ip,mac = line.split()
if mac not in macs:
print line
编辑:好的,所以每个人都发布了相同的python答案。我也是第一次到达python但是 gawk :
awk 'NR == FNR {fileb[$1];next} !($2 in fileb)' fileb filea
EDIT2 :OP删除了行中的前导$,这样python和awk就会改变,fgrep会出现。
fgrep -v -f fileb filea
答案 6 :(得分:0)
Python最简单。将文件B读入字典,然后浏览文件A并在字典中查找匹配项。
答案 7 :(得分:0)
我可以创建一个Java示例,您可以将其转换为您想要的任何语言
import java.io.*;
import java.util.*;
class Macs {
public static void main(String...args)throws Exception {
Set<String> macs = loadLines("macs.txt");
Set<String> ips = loadLines("ips.txt");
for(String raw : ips) {
String[] tokens = raw.split("\\s"); // by space
String ip = tokens[0];
String mac = tokens[1];
if(!macs.contains(mac))
System.out.println(raw);
}
}
static Set<String> loadLines(String filename) throws Exception {
Scanner sc = new Scanner(new File(filename));
Set<String> lines = new HashSet<String>();
while(sc.hasNextLine()) {
// substring(1) removes leading $
lines.add(sc.nextLine().substring(1).toLowerCase());
}
return lines;
}
}
将此输出重定向到文件将为您提供结果。
使用以下
输入文件macs.txt
$AA:BB:CC:DD:EE:01
$AA:BB:CC:DD:EE:02
$AA:BB:CF:DD:EE:09
$AA:EE:CF:DD:EE:09
ips.txt
$172.0.0.1 AA:BB:CC:DD:EE:01
$172.0.0.2 AA:BB:CC:DD:EE:02
$172.0.0.2 AA:BB:CC:DD:EE:05
$172.0.0.66 AA:BB:CC:DD:EE:0E
$172.0.0.4 AA:BB:CC:DD:EE:06
$172.0.0.5 AA:BB:CF:DD:EE:09
$172.0.0.6 AA:BB:CC:DD:EE:03
结果:
c:\files\j>java Macs
172.0.0.6 aa:bb:cc:dd:ee:03
172.0.0.66 aa:bb:cc:dd:ee:0e
172.0.0.2 aa:bb:cc:dd:ee:05
172.0.0.4 aa:bb:cc:dd:ee:06
答案 8 :(得分:0)
这可能对你有用(GUN sed);
sed 's|.*|/&/Id|' fileb | sed -f - filea