Печать 2 разных шаблонов из строки на одной строке

Заблокируйте его в правиле ВЫХОДА, кроме вашего 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
5
17.07.2018, 03:07
3 ответа

Вы очень близки к рабочему решению. Вот один из способов сделать это (, отформатированный для удобочитаемости):

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
5
27.01.2020, 20:36

Если вы знаете, что маркеры 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
3
27.01.2020, 20:36
perl -lne ' $, = $"; print /(?=.*F2(.{5}))(?=.*F6(.{6}))/' input-file.txt

Вышеприведенное, независимо от того, F2или F6стоит раньше в текущей записи, будет печатать следующие цифры F2, а затем цифры F6.

$, = OFS$" = double quoted separator = single space

0
27.01.2020, 20:36

Теги

Похожие вопросы