2017-04-08 60 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