Похоже, это заставляет обратный трафик также проходить через openwrt. Переписав исходный адрес, который увидит веб-сервер.
Если веб-сервер ответил напрямую клиенту, адрес источника для тех пакетов все равно будет принадлежать веб-серверу. Но клиент пытается поговорить с IP-адресом openwrt. Следовательно, ответные пакеты будут отброшены.
В первом случае такое принуждение не требуется, потому что маршрут от веб-сервера к клиентам через Интернет уже проходит через окно openwrt.
Короткийgawkподход:
awk '(index($1, $2) !=0 && length($2) >= 4) || (index($2, $1) !=0 && length($1) >= 4)' file
Вывод:
023q 023q023q
0adc 0adc0adc
123456 123456
abcde abcdefg
index(in, find)
Поиск в строке inпервого вхождения строки findи вернуть позицию в символах, где вхождение начинается со строки in.
Для болеесложногослучая, когда нам нужно найти самую длинную общую подстроку длиной не менее 4 символов в 2 входных строках, я бы предложилPython подход:
Давайте скажем, входной файл был немного «сложным» и имел следующие строки:
1023q 023q023q
v0adc 20adc0adc
s123456 123456
eabcde cabcdefg
08tgdf 90alkhg
Чтобы найти самую длинную общую подстроку, мы будем использовать классSequenceMatcherиз модуляdifflib .
find_common_lines.py
скрипт:
import re
from difflib import SequenceMatcher
with open('filename', 'r') as fh:
for l in fh.read().splitlines():
items = re.findall(r'\S+', l.strip()) # getting 2 comparable strings
m = SequenceMatcher(None, items[0], items[1]).find_longest_match(0, len(items[0]), 0, len(items[1]))
if m.size >= 4:
print(l)
Использование(у вас может быть другая версия python3.x, текущий случай был протестирован на python3.5 ):
python3.5 find_common_lines.py
Вывод:
1023q 023q023q
v0adc 20adc0adc
s123456 123456
eabcde cabcdefg
Вам нужно задействовать мощь регулярных выражений
, чтобы справиться с этой проблемой, и позволить движку RE
выполнять всю тяжелую работу во время просеивания. ваши данные:
sed -n '/\(\S\{4,\}\).*\s.*\1/p' yourfile
023q 023q023q
0adc 0adc0adc
123456 123456
abcde abcdefg