从实时 tcpdump 捕获中提取唯一 IP
Extract unique IPs from live tcpdump capture
我正在使用以下命令从实时 tcpdump 捕获中输出 IP
sudo tcpdump -nn -q ip -l | awk '{print ; fflush(stdout)}' >> ips.txt
我得到以下输出
192.168.0.100.50771
192.168.0.100.50770
192.168.0.100.50759
需要两样东西:
- 只提取 IP,不提取端口。
- 生成一个具有唯一 IP 的文件,不重复,并在可能的情况下进行排序。
提前致谢
要从 tcpdump 中提取唯一 IP,您可以使用:
awk '{ ip = gensub(/([0-9]+.[0-9]+.[0-9]+.[0-9]+).*/,"\1","g",); if(!d[ip]) { print ip; d[ip]=1; fflush(stdout) } }' YOURFILE
因此,您查看实时唯一 IP 的命令是:
sudo tcpdump -nn -q ip -l | awk '{ ip = gensub(/([0-9]+.[0-9]+.[0-9]+.[0-9]+)(.*)/,"\1","g",); if(!d[ip]) { print ip; d[ip]=1; fflush(stdout) } }'
这将在每个 IP 出现时立即打印输出,因此无法对它们进行排序。如果要对这些进行排序,可以将输出保存到文件中,然后使用 sort
工具:
sudo tcpdump -nn -q ip -l | awk '{ ip = gensub(/([0-9]+.[0-9]+.[0-9]+.[0-9]+)(.*)/,"\1","g",); if(!d[ip]) { print ip; d[ip]=1; fflush(stdout) } }' > IPFILE
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 IPFILE
示例输出:
34.216.156.21
95.46.98.113
117.18.237.29
151.101.65.69
192.168.1.101
192.168.1.102
193.239.68.8
193.239.71.100
202.96.134.133
注意:确保您使用的是 gawk。它不适用于 mawk。
这是一个使用 match
(在 macOs 中工作)
sudo tcpdump -nn -q ip -l | \
awk '{match(,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); \
ip = substr(,RSTART,RLENGTH); \
if (!seen[ip]++) print ip }'
如果想要预过滤输入,您可以使用类似的东西:
sudo tcpdump -nn -q ip -l | \
awk ' !~ /^(192\.168|10\.|172\.1[6789]|172\.2[0-9]\.|172\.3[01]\.)/ \
{match(,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); \
ip = substr(,RSTART,RLENGTH); \
if (!seen[ip]++) print ip }'
虽然我是 Awk 的忠实粉丝,但值得拥有其他选择。使用 cut:
考虑这个例子
tcpdump -n ip | cut -d ' ' -f 3 | cut -d '.' -f 1-4 | sort | uniq
我正在使用以下命令从实时 tcpdump 捕获中输出 IP
sudo tcpdump -nn -q ip -l | awk '{print ; fflush(stdout)}' >> ips.txt
我得到以下输出
192.168.0.100.50771
192.168.0.100.50770
192.168.0.100.50759
需要两样东西:
- 只提取 IP,不提取端口。
- 生成一个具有唯一 IP 的文件,不重复,并在可能的情况下进行排序。
提前致谢
要从 tcpdump 中提取唯一 IP,您可以使用:
awk '{ ip = gensub(/([0-9]+.[0-9]+.[0-9]+.[0-9]+).*/,"\1","g",); if(!d[ip]) { print ip; d[ip]=1; fflush(stdout) } }' YOURFILE
因此,您查看实时唯一 IP 的命令是:
sudo tcpdump -nn -q ip -l | awk '{ ip = gensub(/([0-9]+.[0-9]+.[0-9]+.[0-9]+)(.*)/,"\1","g",); if(!d[ip]) { print ip; d[ip]=1; fflush(stdout) } }'
这将在每个 IP 出现时立即打印输出,因此无法对它们进行排序。如果要对这些进行排序,可以将输出保存到文件中,然后使用 sort
工具:
sudo tcpdump -nn -q ip -l | awk '{ ip = gensub(/([0-9]+.[0-9]+.[0-9]+.[0-9]+)(.*)/,"\1","g",); if(!d[ip]) { print ip; d[ip]=1; fflush(stdout) } }' > IPFILE
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 IPFILE
示例输出:
34.216.156.21
95.46.98.113
117.18.237.29
151.101.65.69
192.168.1.101
192.168.1.102
193.239.68.8
193.239.71.100
202.96.134.133
注意:确保您使用的是 gawk。它不适用于 mawk。
这是一个使用 match
(在 macOs 中工作)
sudo tcpdump -nn -q ip -l | \
awk '{match(,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); \
ip = substr(,RSTART,RLENGTH); \
if (!seen[ip]++) print ip }'
如果想要预过滤输入,您可以使用类似的东西:
sudo tcpdump -nn -q ip -l | \
awk ' !~ /^(192\.168|10\.|172\.1[6789]|172\.2[0-9]\.|172\.3[01]\.)/ \
{match(,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); \
ip = substr(,RSTART,RLENGTH); \
if (!seen[ip]++) print ip }'
虽然我是 Awk 的忠实粉丝,但值得拥有其他选择。使用 cut:
考虑这个例子 tcpdump -n ip | cut -d ' ' -f 3 | cut -d '.' -f 1-4 | sort | uniq