2017-04-08 50 views
-2

我需要用靜態白名單來粉刷一組文件,我遇到了問題,因爲當我使用小規模的以下命令時,似乎工作,但是當我嘗試從bash腳本中平行運行它們時,我的文件中出現不一致的結果。並非所有條目都按照我的意圖被刪除,這意味着髒數據仍在我需要清洗的目標文件中。我需要一個解決方案,這是一個必須解決的生活變化問題,如果有人能夠給我一個提醒,這將是非常有益的。使用白名單在一個bash腳本中使用awk的多個實例對白名單進行粉飾

(順便說一句我拆白名單成多個副本希望這將解決這個問題,它沒有)

文件* S這裏有超過10行,每行純文本域名

Whitelist.txt是超過25,000條目

google.com 
1.google.net 
websitetowhitelist.org 
and so on... 

例如:

#!/bin/bash 
# Whitewash script washes blacklists against whitelist to remove domains that should never be blacklisted. 
# 
# 
echo 'Washing file1 blacklist with whitelist.txt ...' 
cat 'file1.acl' | awk '{ m=0 ; while ((getline row < "whitelist.txt") == 1) { if (row == $0) { m=1 ; break } } ; close("whitelist.txt") ; if (m == 0) { print $0 }}' > 'file1.out' & 
echo 'Washing file2 blacklist with whitelist.txt ...' 
cat 'file2' | awk '{ m=0 ; while ((getline row < "whitelist.txt") == 1) { if (row == $0) { m=1 ; break } } ; close("whitelist.txt") ; if (m == 0) { print $0 }}' > 'file2.out' & 
echo 'Washing file3 blacklist with whitelist.txt ...' 
cat 'file3.acl' | awk '{ m=0 ; while ((getline row < "whitelist.txt") == 1) { if (row == $0) { m=1 ; break } } ; close("whitelist.txt") ; if (m == 0) { print $0 }}' > 'file3.out' & 
+1

添加file1.acl和您想要的結果。 – Cyrus

回答

0

對於這種大小的文件,查看塊代替單行或者嘗試perl或其他語言通常是一個好主意。

因此,另一種解決方案可能是:

  • 標籤的白名單和dirtyfile
  • 它們的排序中的鍵的順序
  • 刪除重複

    sed 's/$/;a/' <whitelist> whitelisttagged 
    sed 's/$/;b/' <dirtyfile> dirtyfiletagged 
    cat whitelisttagged dirtyfiletagged > alltagged 
    sort alltagged > allsorted 
    cat allsorted | awk -F';' 'BEGIN {a=""} /;a$/{a=$1} /;b$/ { if ($1 != a) {print $1}}' 
    

你會注意到awk並不複雜。

+0

所以,現在我想知道你在做什麼。你是否將他的過程的輸出用作下次嘗試的輸入?那當然沒有什麼變化。白名單項目已被刪除,因此對同一白名單的新刪除將不會刪除任何內容。 –

+0

不,先生,它根本不刪除任何東西。 – TheAdminsHereAreFags