Find the names added between two releases
Each release is cumulative, so the difference between two releases is a list of added names. Because the files are sorted, one streaming pass finds it, with constant memory.
- Added domains
- +73,045,002
- Added subdomains
- +444,969,050
- Memory
- Constant
28 September 2026 → 16 October 2026
in the same releases
both files are streamed
You need the same file from both releases, for example the domains file of 28 September 2026 and of 16 October 2026. A purchase includes the release on sale that day.
Why this works
Every file is strictly sorted bytewise, one unique name per line. comm compares two sorted streams line by line; LC_ALL=C makes it compare bytes the same way the files were sorted.
Try it on two small files
printf '%s\n' a.example.com c.example.com > old.txt
printf '%s\n' a.example.com b.example.com c.example.com > new.txt
LC_ALL=C comm -13 old.txt new.txt
It prints b.example.com: the name only in the newer file.
Run it on two releases
In Bash or Zsh:
LC_ALL=C comm -13 <(gzip -dc getdomainlists-2026-09-28-domains.txt.gz) <(gzip -dc getdomainlists-2026-10-16-domains.txt.gz) > added-domains.txt
wc -l added-domains.txt
For these two releases it gives 73,045,002 lines. Every name of the 28 September 2026 release is also in the 16 October 2026 release, so comm -23 (names only in the older file) prints nothing. The subdomains files work the same way, with 444,969,050 more names; they are larger, so that run takes longer.
Without comm
On a system without comm (for example Windows without WSL), the same merge walk in Python 3 streams both files:
import gzip, sys
old, new = (gzip.open(p, "rt") for p in sys.argv[1:3])
o = old.readline()
for n in new:
while o and o < n:
o = old.readline()
if o != n:
sys.stdout.write(n)
Save it as added.py and run python3 added.py getdomainlists-2026-09-28-domains.txt.gz getdomainlists-2026-10-16-domains.txt.gz > added-domains.txt.
What "added" means
An added name is new to these files, not newly registered: it is in the newer release and not in the earlier one. It is not evidence that the name is registered, resolves or hosts a website today. Each release's figures are in the release notes.
Try the format first with the free 1,000-name samples. Both full files are $9 once, with 30 days to download.
To keep one ending from the added names, pipe them through the TLD filtering guide.