Заблокируйте его в правиле ВЫХОДА, кроме вашего IP.
iptables -I FORWARD -s 192.168.43.51 ! -d 192.168.43.1 -j DROP
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -s 192.167.43.51 ! -d 192.168.43.1 -j DROP
Вы очень близки к рабочему решению. Вот один из способов сделать это (, отформатированный для удобочитаемости):
awk '{
match($0,/F2/);
a=substr($0, RSTART +2, RLENGTH +3);
match($0,/F6/);
b=substr($0, RSTART +2,RLENGTH +4);
print a" "b
}'
В этом случае я беру две ваши substr()
функции и назначаю их переменным, вместо того, чтобы печатать их напрямую, а затем просто настраиваю их на одновременную печать в конце. Распечатывая их в одном вызове печати, awk
добавляет только один символ новой строки в конце строки, а не после каждой части строки, что разделяло ваш результат на две строки.
bash:~$ echo F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315 | awk '{match($0,/F2/); a=substr($0, RSTART +2, RLENGTH +3); match($0,/F6/); b=substr($0, RSTART +2,RLENGTH +4); print a" "b}'
B3094 BC313D
Если вы знаете, что маркеры Fn
упорядочены, вы можете использовать их в качестве разделителей полей:
echo 'F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315' |
awk -F'(F2|F6)' '{print substr($2,1,5), substr($3,1,6)}'
B3094 BC313D
или, разбив на все маркеры Fn
и соответствующим образом пронумеровав поля
echo 'F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315' |
awk -F'F[0-9]' '{print substr($3,1,5), substr($7,1,6)}'
B3094 BC313D
(в этом случае вам может вообще не понадобиться substr
, если вы просто хотите все до следующегоFn
-это не ясно из вашего описания проблемы ).
С помощью GNU Awk вы могли захватить обе подстроки в одном шаблоне и получить к ним доступ через необязательный массив match
:
echo 'F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315' |
gawk 'match($0, /F2(.{5}).*F6(.{6})/, a) {print a[1], a[2]}'
B3094 BC313D
Кроме того, с помощью Perl вы можете захватывать символы после маркеров, используя просмотр назад:
echo 'F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315' |
perl -lne 'print join " ", /(?<=F2).{5}|(?<=F6).{6}/g'
B3094 BC313D
или
echo 'F1B308F2B3094F3B310F4B317CF5B312F6BC313DF7B315' |
perl -lne 'print "$1 $2" if /(?<=F2)(.{5}).*?(?<=F6)(.{6})/g'
B3094 BC313D
perl -lne ' $, = $"; print /(?=.*F2(.{5}))(?=.*F6(.{6}))/' input-file.txt
Вышеприведенное, независимо от того, F2
или F6
стоит раньше в текущей записи, будет печатать следующие цифры F2
, а затем цифры F6
.
$, = OFS
$" = double quoted separator = single space