除非您打算长时间运行它或有一个非常繁忙的站点,否则您可以通过将以前的查找保存到 awk 哈希来确保唯一性。这在这里有效:
tcpdump -lvi any "udp port 53" 2> /dev/null | grep -E 'A\?' | awk '!h[$(NF-1)]++ { print $(NF-1) }' > /tmp/domains
否则,您需要将tcpdump/grep
输出的块保存到临时文件并将其与/tmp/domains
. 我知道的最好方法是保持输出单独排序,然后使用sort -mu
. 这在这里有效:
lim=10000
tmpfile=$(mktemp /tmp/unique.domain.XXXXXX)
unique_domains=/tmp/domains
tcpdump -lvi any "udp port 53" 2> /dev/null | grep -E 'A\?' | while read line; do
awk -v lim=$lim '!h[$(NF-1)]++ { print $(NF-1); ndomain++ }; ndomain > lim { exit }' | sort > $tmpfile
sort -mu $tmpfile $unique_domains 2> /dev/null > $unique_domains.tmp
mv $unique_domains.tmp $unique_domains
done
如果您想在/tmp/domain
运行时访问,您需要添加一些文件锁定,例如lockfile
:
lim=10000
lock=/tmp/domains.lock
tmpfile=$(mktemp /tmp/unique.domain.XXXXXX)
unique_domains=/tmp/domains
tcpdump -lvi any "udp port 53" 2> /dev/null | grep -E 'A\?' | while read line; do
awk -v lim=$lim '!h[$(NF-1)]++ { print $(NF-1); ndomain++ }; ndomain > lim { exit }' | sort > $tmpfile
lockfile $lock
sort -mu $tmpfile $unique_domains 2> /dev/null > $unique_domains.tmp
mv $unique_domains.tmp $unique_domains
rm $lock
done
现在要获取您的快照,/tmp/domains
请执行以下操作:
lockfile /tmp/domains.lock
cp /tmp/domains unique_domains
sync
rm -f /tmp/domains.lock