Подробный способ: установить ACCEPT
all policy для всех подключений перед сбросом:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
Тогда:
iptables -F
Вы уже близки, только не хватает нескольких незначительных моментов:
data.txt
в качестве аргумента к вашему вызову awk
, иначе этот файл не будет обработан. keys.txt
в базе данных удаления, поэтому вам следует ограничить это вторым полем($2
вместо$0
). if ($0 ~ var)
, чтобы проверить, следует ли исключить строку в data.txt
. Здесь также следует сравнивать только второе поле строки и использовать точное соответствие(==
)вместо соответствия регулярному выражению, чтобы защититься от ситуаций, в которых ваши ключи могут содержать специальные символы для регулярных выражений. awk
, что на самом деле вам не нужно. Вместо этого вы можете перенаправить вывод. Итак, с небольшими изменениями:
awk 'NR==FNR{pattern[$2];next} !($2 in pattern)' keys.txt data.txt > GoodFile.txt
Это зарегистрирует второй столбец каждой строки в keys.txt
в массиве pattern
, но больше ничего не сделает для этого файла. Для data.txt
будет достигнута точка, в которой условие !($2 in pattern)
оценивается для каждой строки. Если условие оценивается как «истина» (, то есть второй столбец строки , а не среди индексов массива pattern
), будет напечатана текущая строка.
Первая проблема в вашем скрипте:
NR == FNR {pattern[$0]; next}
Вы используете всю строку в качестве ключа для массива pattern
, но вам нужно только второе поле. Вам не нужны оба next
и getline
, все, что вам нужно, это next
для перехода к следующей строке. Вы также забыли передать второй файл в качестве входных данных. Наконец, вам нужно указать имя файла в кавычках, так как это просто строка, а не переменная. Исправление этих двух ошибок дает:
awk '
NR == FNR {pattern[$2]; next}
{
for (var in pattern) {
if ($0 ~ var) {
getline
next
}
}
print >> "GoodFile.txt"
}
' keys.txt data.txt
Итак, вы уверены, что хотите >>
там? Это означает, что awk
не перезапишет ничего из того, что уже было в файле (вывода предыдущего запуска, например ). Вам не нужен >>
, если вы просто хотите, чтобы awk
не перезаписывал свой собственный вывод из одного запуска, >
достаточно. Вам нужно только >>
, если вы хотите сохранить данные предыдущих запусков, чего, я подозреваю, у вас нет.
Кроме того, исходя из ваших данных, вы на самом деле не хотите проверять всю строку. Вы просто хотите пропустить строки в data.txt
, второе поле которых совпадает со вторым полем из keys.txt
. Если это так, это было бы намного эффективнее, особенно для больших файлов :
awk '
NR == FNR {pattern[$2]; next}
{
if ($2 in pattern) {
next
}
print > "GoodFile.txt"
}
' keys.txt data.txt
Или эквивалентно, но более кратко:
awk '
NR == FNR {pattern[$2]; next}
{
if (!($2 in pattern) {
print > "GoodFile.txt"
}
}
' keys.txt data.txt
GNU sed
с включенным расширенным режимом регулярных выражений -E
и отключенным пространством шаблонов автопечати-n
$ sed -En '
/^\S+\s+(\S+)$/{
s//\1/;H;d
}
G
/^\S+\s+(\S+)\s.*\n\1(\n|$)/!P
' keys.txt data.txt
Предположим, что в файле ключей два поля, а в файле данных больше двух.
В качестве первого шага мы сохраняем в блоке 2-е поле файла keys.txt. Затем при чтении файла data.txt мы добавляем ключи к текущей записи файла data.txt и сравниваем, можно ли увидеть второе поле данных где-либо среди ключей. Только если не найдено, мы печатаем данные.