我有兩個檔案
第一個檔案blacklist.txt包含test.example.com
*.test.example.com
第二個檔案subdomains.txt含有
test.example.com
123.test.example.com
abc-test.example.com
www.example.com
預期的結果檔案的內容
abc-test.example.com
www.example.com
這就是過濾subdomains.txt中黑名單檔案中列出的所有子域名。
同時,它還檢查重詞,如果有*.,那么也將洗掉所有子域名,如預期結果所示。
在我的搜索程序中,我發現使用awk的以下命令,但在檔案blacklist.txt中存在*的情況下不起作用。
awk 'NR == FNR { list[tolower($0)]=1; next } { if (! list[tolower($0)]) print }' blacklist.txt subdomains.txt
但是當它只包含域名時,它將被過濾掉
我也試過comm命令,但它看起來好像不能處理regex。uj5u.com熱心網友回復:
如果你修改一下黑名單中的重名詞:
test.example.com
.*.test.example.com
你可以:
$ awk 'NR==FNR {
a[$0];next
}
{
for(i in a)
if(match($0,"^" i "$"))
下一個
列印
}'黑名單子域
輸出:
abc-test.example.com
www.example.com
uj5u.com熱心網友回復:
如果你用sed處理黑名單,把它變成一個regex串列,你可以這樣做:
sed 's/././g;s/*/.*/g' blacklist.txt|
grep -vixf - subdomains.txt
uj5u.com熱心網友回復:
一個純粹的bash版本,不需要對黑名單模式進行任何預處理:
#!/usr/bin/env bash
readarray -t blacklist < blacklist.txt
while read -r domain; do
匹配=0
for pat in "${blacklist[@]}"/span>; do
if [[ $domain == $pat ]]; then
匹配=1
break
fi
done
[[ $match -eq 0 ]] & & printf "%s
" "$domain" "%s
done < subdomains.txt
還有,一個tcl版本,在大檔案上應該比上述腳本更有效率:
#!/usr/bin/env tclsh
# 采取兩個引數;黑名單檔案和域檔案。
# 例如,。
# ./domainfilter blacklist.txt subdomains.txt > results.txt。
proc ggrep {blacklist domainfile}{黑名單域名檔案}。{
set f [open $domainfile]
set domains [split [read -nonewline $f]
]
關閉 $f ]
set f [open $blacklist]
while {[get $f pattern] >= 0} {
set domains [lsearch -inline -all -not -glob $domains $pattern ] 。
}
關閉 $f $pattern] }
把 [加入 $domains] } 關閉 $f
]
}
ggrep [lindex $argv 0] [lindex $argv 1] 。
還有一個更有效的zsh版本,如果這個shell是一個選項:
#!/usr/bin/env zsh
declare -A blacklist
while read -r pattern; do
blacklist[$pattern]=1
done < blacklist.txt
while read -r domain;do
# 將陣列鍵視為與索引匹配的glob模式。
[[ -z ${blacklist[(k)$domain]} ]] && printf "%s
" "$domain" "%s
done < subdomains.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324953.html
標籤:
