Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Эксперт NIX
3297 / 920 / 199
Регистрация: 14.01.2013
Сообщений: 4,586

Регуляр для bash/grep/sed/awk/perl

13.11.2024, 14:28. Показов 1318. Ответов 29

Author24 — интернет-сервис помощи студентам
Имеется текст такого вида
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
[29599:1545281] -A Bla_122_123_PREROUTING -d 123.123.123.121/32 -p tcp -m tcp --dport 3332 -j DNAT --to-destination 192.168.0.33
[102155:9816402] -A Bla_122_123_PREROUTING -d 123.123.123.121/32 -p udp -m udp --dport 3332 -j DNAT --to-destination 192.168.0.33
[34828:1815944] -A Bla_122_123_PREROUTING -d 123.123.123.123/32 -p tcp -m tcp --dport 3333 -j DNAT --to-destination 192.168.0.37
[6060:601079] -A Bla_122_123_PREROUTING -d 123.123.123.123/32 -p udp -m udp --dport 3333 -j DNAT --to-destination 192.168.0.37
[37841:1971064] -A Bla_122_123_PREROUTING -d 123.123.123.125/32 -p tcp -m tcp --dport 3334 -j DNAT --to-destination 192.168.0.41
[24203:2336906] -A Bla_122_123_PREROUTING -d 123.123.123.125/32 -p udp -m udp --dport 3334 -j DNAT --to-destination 192.168.0.41
[9315:488572] -A Bla_122_123_PREROUTING -d 123.123.123.127/32 -p tcp -m tcp --dport 3335 -j DNAT --to-destination 192.168.0.45
[133063:12779428] -A Bla_122_123_PREROUTING -d 123.123.123.127/32 -p udp -m udp --dport 3335 -j DNAT --to-destination 192.168.0.45
[779:44092] -A Bla_122_123_PREROUTING -d 123.123.123.129/32 -p tcp -m tcp --dport 3336 -j DNAT --to-destination 192.168.0.49
[0:0] -A Bla_122_123_PREROUTING -d 123.123.123.139/32 -p udp -m udp --dport 3336 -j DNAT --to-destination 192.168.0.49
[1079:58799] -A Bla_122_123_PREROUTING -d 123.123.123.131/32 -p tcp -m tcp --dport 3337 -j DNAT --to-destination 192.168.0.53
[9:1387] -A Bla_122_123_PREROUTING -d 123.123.123.131/32 -p udp -m udp --dport 3337 -j DNAT --to-destination 192.168.0.53
Требуется вынуть второе число из квадратных скобок, не учитывая 0. Т.е. с [0:0] не нужна строка. И ip адрес. Примерный выхлоп
Code Скопировано
1
1545281 123.123.123.123
С помощью трёхэтажного grep-awk и иже с ними, требуемое извлекается. Но сильно подозреваю, что можно уложиться в один/два регуляра, за один проход. Для Незабудки, наверное, раз плюнуть Но, поучаствовать могут все желающие.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2024, 14:28
Ответы с готовыми решениями:

Поиск длинного слова используя grep, sed или awk
Написать скрипт с использованием grep, sed, awk (необходимо использовать не менее одной из указанных утилит; использовать все три...

Bash, как в awk передать переменную из bash
Есть такой скрипт for (( i=0; i < $(awk 'END{print NR - 2}' /proc/net/dev); i++)) do echo $ $(ip link | awk 'FNR == $i {print $2}')...

Тройное условие для регулярного выражения на bash c использованием grep
Изначально было простое условие оставить все строки в файле если в них нет следующих символов ",IUnD,," grep -v...

29
Невнимательный
 Аватар для ft4l
2810 / 1146 / 353
Регистрация: 08.02.2013
Сообщений: 6,548
Записей в блоге: 2
13.11.2024, 15:03
Цитата Сообщение от Kubuntovod Посмотреть сообщение
perl
как вариант
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
perl -nE "!/\[\d+:(\d{2,}).*?-d\h*\K[.0-9]+/ || say $1.' '.$&"  "./test.txt"
1545281 123.123.123.121
9816402 123.123.123.121
1815944 123.123.123.123
601079 123.123.123.123
1971064 123.123.123.125
2336906 123.123.123.125
488572 123.123.123.127
12779428 123.123.123.127
44092 123.123.123.129
58799 123.123.123.131
1387 123.123.123.131
но у меня (v5.32.1) built for MSWin32-x86-...

Добавлено через 2 минуты
Цитата Сообщение от ft4l Посмотреть сообщение
-nE "!/\[\d+:...
оптимальнее
-nE "!/^\[\d+:...
0
319 / 191 / 18
Регистрация: 27.07.2018
Сообщений: 874
13.11.2024, 16:06
ft4l,
а если там будет 1:1, а не 0:0? не хорошо по количеству символов чекать.
1
 Аватар для volodin661
6328 / 2169 / 340
Регистрация: 10.12.2013
Сообщений: 7,453
13.11.2024, 17:30
myproc
Perl Скопировано
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env perl -ln
/                      # Справимся и без Незабудки
^                      # отсель грозить мы будем шведу
\[ (\d+):(\d+) \]      # здесь поимеем $1 и $2
.+                     # здесь любой текст
-d \s ([\d.]+)         # здесь поимеем $3
/x                     # и в случае успеха рег. выражения проверяем $1 и $2
? $1&$2                # если $1 не 0 и $2 не 0
? print "$2 $3"        # вывод результата в stdout
:0                     # здесь просто курим анашу
:0                     # и здесь тоже
Bash Скопировано
1
2
chmod +x myproc
./myproc file_with_rules
1
Невнимательный
 Аватар для ft4l
2810 / 1146 / 353
Регистрация: 08.02.2013
Сообщений: 6,548
Записей в блоге: 2
13.11.2024, 17:31
Цитата Сообщение от Sienwfpgdo Посмотреть сообщение
1:1
если не бывает :01
perl -nE "say qq'$1 $2' if /^\[\d+:(?!0)(\d+).*?-d\h*([.0-9]+)/" "./test.txt"
0
13.11.2024, 17:37

Не по теме:


Всегда поражался тем, кто в такое умеет. Для меня все эти страшные регулярки на перле — как разновидности "патча Бармина".

0
 Аватар для volodin661
6328 / 2169 / 340
Регистрация: 10.12.2013
Сообщений: 7,453
13.11.2024, 17:42
Eddy_Em,

Эдуард, страшный патч Бармина - это просто шутка с оператором tr ( Translate одну букву в другую )
0
321 / 46 / 11
Регистрация: 08.04.2022
Сообщений: 177
14.11.2024, 01:02
зубодробительно на awk:

Bash Скопировано
1
awk -F '[\\[\\]:/]|[ \\s]+' '$3 > 0 { print $3, $8 }'
0
Эксперт NIX
3297 / 920 / 199
Регистрация: 14.01.2013
Сообщений: 4,586
14.11.2024, 06:52  [ТС]
Цитата Сообщение от siberian-man Посмотреть сообщение
зубодробительно на awk:
Это великолепно! Пойду тереть зубы, чтобы вникнуть, как оно работает.

Цитата Сообщение от ft4l Посмотреть сообщение
если не бывает :01
Не бывает. Но не взлетело.
Bash Скопировано
1
2
cat file_with_rules | perl -nE "say qq'$1 $2' if /^\[\d+:(?!0)(\d+).*?-d\h*([.0-9]+)/"
zsh: event not found: 0
Да, zshell.

Цитата Сообщение от volodin661 Посмотреть сообщение
Справимся и без Незабудки
Но в незабываемые впечатления от регуляров она умеет

Добавлено через 1 минуту
Цитата Сообщение от volodin661 Посмотреть сообщение
chmod +x myproc
Файл сколхозить, конечно, можно. Но желательно на лету, одной строкой.
0
321 / 46 / 11
Регистрация: 08.04.2022
Сообщений: 177
14.11.2024, 10:02
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Не бывает. Но не взлетело.
что фраза точно поразумевает
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Требуется вынуть второе число из квадратных скобок, не учитывая 0. Т.е. с [0:0] не нужна строка.
а) второе поле не должно быть 0
б) второе поле не должно содержать 0

Мой первый вариант подразумевает вариант а). Если надо решить вариант б), то зубы дробить так:

Bash Скопировано
1
awk -F '[\\[\\]:/]|[ \\s]+' '$3 !~ /0/ { print $3, $8 }'
0
Невнимательный
 Аватар для ft4l
2810 / 1146 / 353
Регистрация: 08.02.2013
Сообщений: 6,548
Записей в блоге: 2
14.11.2024, 14:25
Цитата Сообщение от Kubuntovod Посмотреть сообщение
не взлетело.
С виндовыми кавычками потомучто
но у меня bash
Bash Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
zzz@zz ~
$ perl -nE "say qq'$1 $2' if /^\[\d+:(?!0)(\d+).*?-d\h*([.0-9]+)/" "./test.txt"
bash: !0: event not found
zzz@zz ~
$ perl -nE 'say "$1 $2" if /^\[\d+:(?!0)(\d+).*?-d\h*([.0-9]+)/' ./test.txt
1545281 123.123.123.121
9816402 123.123.123.121
.....
zzz@zz ~
$ cat ./test.txt | perl -nle 'print "$1 $2" if /^\[\d+:(?!0)(\d+).*?-d\h*([.0-9]+)/'
1545281 123.123.123.121
...
0
 Аватар для volodin661
6328 / 2169 / 340
Регистрация: 10.12.2013
Сообщений: 7,453
14.11.2024, 14:28
Цитата Сообщение от Kubuntovod Посмотреть сообщение
сколхозить
дожил.
колхозником назвали.
и это, заметьте, за развертывание regex в идиоматическую вертикаль с комментами и удобной правкой фрагментов, ежели чо.

Bash Скопировано
1
perl -lne '/(\d+):(\d+) .+ -d \s ([\d.]+)/x ? $1&$2 ? print "$2 $3" :0:0' rules.txt
0
Эксперт NIX
3297 / 920 / 199
Регистрация: 14.01.2013
Сообщений: 4,586
14.11.2024, 15:07  [ТС]
Цитата Сообщение от siberian-man Посмотреть сообщение
Мой первый вариант подразумевает вариант а)
И это именно то, что доктор прописал. Спасибо.

Цитата Сообщение от siberian-man Посмотреть сообщение
Если надо решить вариант б), то зубы дробить так:
Лучше написать, что за зубная пыль содержится здесь:
Цитата Сообщение от siberian-man Посмотреть сообщение
'[\\[\\]:/]|[ \\s]+'
Перебрал несколько мануалов, нигде не нашёл развёрнутого варианта. Везде про разделитель пишут. Но, тут явно нечто большее

Цитата Сообщение от ft4l Посмотреть сообщение
perl -nE 'say "$1 $2" if /^\[\d+?!0)(\d+).*?-d\h*([.0-9]+)/'
Да. Этот вариант сработал.

Цитата Сообщение от volodin661 Посмотреть сообщение
дожил.
колхозником назвали.
Да это ж выражение такое. К колхозникам не имеет отношения

Цитата Сообщение от volodin661 Посмотреть сообщение
perl -lne '/(\d+)\d+) .+ -d \s ([\d.]+)/x ? $1&$2 ? print "$2 $3" :0:0'
Работает!

Но вот этот, самый изящный вариант:
Цитата Сообщение от siberian-man Посмотреть сообщение
awk -F '[\\[\\]:/]|[ \\s]+' '$3 > 0 { print $3, $8 }'
0
321 / 46 / 11
Регистрация: 08.04.2022
Сообщений: 177
14.11.2024, 16:43
Лучший ответ Сообщение было отмечено Kubuntovod как решение

Решение

Цитата Сообщение от Kubuntovod Посмотреть сообщение
Лучше написать, что за зубная пыль содержится здесь
Code Скопировано
1
'[\\[\\]:/]|[ \\s]+'
Я здесь немного опечатался. Но это не ошибка. Должно быть

Code Скопировано
1
'[\\[\\]:/]|[ \\t]+'
Давай начну с него, как самого правильного. И правильная команда в моем исполнеии должна быть такой:

Bash Скопировано
1
awk -F '[\\[\\]:/]|[ \\t]+' '$3 > 0 { print $3, $8 }'
Понятно, что флаг -F устанавливает пользовательский разделитель полей. А он у нас регулярно выраженный. И разделитель может быть один из:

* [\\[\\]:/] - разделилетелем может быть один из символов левая квадратная скобка \\[, правая квадратная скобка \\], жвоеточие : или прямой слеш/
* или [ \\t]+ - группа пробельных символов (любая комбинация пробелов и символов табуляции \\t)

А теперь несколько слов откуда частокол обратных слешей \\. Дело в том, что внешние квадратные скобки - это часть синтаксиса регекспов, который говорит: "это список чего-то". Но в этот список входят сами скобки. И поэтому, чтобы правильно интерпретировать их как простые символы, их надо экранировать. Но в последних своих версиях GNU Awk сильно ругается:
awk: warning: escape sequence `\[' treated as plain `['
. Поэтому, чтобы избежать этого ставим второй слеш.

Давай посмотрим, что же у нас получится. Вот первая строка из примера (обрезал остаток строки):

Code Скопировано
1
[29599:1545281] -A Bla_122_123_PREROUTING -d 123.123.123.121/32 ...
Code Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$1 - первое поле (пустая строка)
[ - разделитель
$2 = 29599
: - разделитель
$3 = 1545281
] - разделитель
$4 = 4-ое поле (пустая строка, потому что мы так решили: разделитель это один символ из списка или пробельные символы)
пробел - разделитель
$5 = -A
пробел - разделитель
$6 = Bla_122_123_PREROUTING
пробел - разделитель
$7 = -d
пробел - разделитель
$8 = 123.123.123.121
/ - разделитель
$9 = 32
и т.д.
Понятно, что можно здесь поиграть в оптимизацию и сделать так, чтобы регэксп стал красивее. А еще лучше использовать perl, потому что это Чак Норрис среди бойцов регулярных выражений.

Добавлено через 20 минут
Ну раз я упомянул perl, то вот мое видение решения с его помощью:

Bash Скопировано
1
perl -lane '/^\[\d+:(\d+)].+\s+-d\s+((?:\d+\.){3}\d+)\// and $1 > 0 and print "$1 $2"'
а еще лучше так

Bash Скопировано
1
perl -F'[\[\]:/]|\s+' -lane '$F[2] > 0 and print "$F[2] $F[7]"'
Добавлено через 11 минут
или так

Bash Скопировано
1
perl -F'[\[\]:/]|\s+' -lane 'print "$F[2] $F[7]" if $F[2] > 0'
2
Эксперт NIX
3297 / 920 / 199
Регистрация: 14.01.2013
Сообщений: 4,586
14.11.2024, 18:25  [ТС]
Цитата Сообщение от siberian-man Посмотреть сообщение
$1 - первое поле (пустая строка)
Слева от разделителя всегда поле?

Тема получилась замечательная! Думаю, будет полезна всем, идущим нам вслед. Всем участникам большая спасиба! Но приз зрительских симпатий достаётся siberian-man. Думайте, что хотите. А мне, больше всего, нравится решение с awk. На мой взгляд, очень красивый вариант. Ещё и с описаловом - просто огонь!
0
321 / 46 / 11
Регистрация: 08.04.2022
Сообщений: 177
14.11.2024, 19:40
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Слева от разделителя всегда поле?
Зависит от используемого средства. В данных примерах - да.

Цитата Сообщение от Kubuntovod Посмотреть сообщение
Но приз зрительских симпатий достаётся siberian-man
Спасибо )))

Цитата Сообщение от Kubuntovod Посмотреть сообщение
больше всего, нравится решение с awk
Мои последние примеры на perl - аналоги того решения на awk.
0
 Аватар для volodin661
6328 / 2169 / 340
Регистрация: 10.12.2013
Сообщений: 7,453
15.11.2024, 02:27
подаю официальный протест,
решение на основе split - это завсегда жёсткая привязка к позициям, что неспортивно.

но даже если оставить как есть, perl тут может почти догнать awk по длине и не будет при этом привязан к позициям:

Bash Скопировано
1
2
3
awk  -F'[][:/]|[ ]' '$3>0{print$3,$8}' text
perl -nE'/:(\d+).+-d( [\d.]+)/;say$1.$2if$1' text
perl -F'[][:/]|\s' -nE'say"$F[2] $F[7]"if$F[2]' text
0
Эксперт NIX
3297 / 920 / 199
Регистрация: 14.01.2013
Сообщений: 4,586
15.11.2024, 08:26  [ТС]
Цитата Сообщение от siberian-man Посмотреть сообщение
Мои последние примеры на perl - аналоги того решения на awk.
Это понятно. Но с awk красивее.

Цитата Сообщение от volodin661 Посмотреть сообщение
подаю официальный протест,
решение на основе split - это завсегда жёсткая привязка к позициям, что неспортивно.
Этот "фломастер" показался мне более вкусным А спорт остаётся молодым. В любом случае, в теме присутствует и так и сяк. И это прекрасно. Хотя ... До идеала чуть чуть не дотягивает. Вот если повторить трюк с описанием, но для перла, то эти акробатические этюды станут на шаг ближе к народу
0
 Аватар для volodin661
6328 / 2169 / 340
Регистрация: 10.12.2013
Сообщений: 7,453
15.11.2024, 10:31
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Вот если повторить трюк с описанием, но для перла, то эти акробатические этюды станут на шаг ближе к народу
Kubuntovod,

ну вот, приехали, я же с этого начал ( комментарии в столбик прямо в исходнике: Регуляр для bash/grep/sed/awk/perl ),
а ты назвал это колхозом

Добавлено через 26 минут
awk...фломастеры..

Ставить кого-нибудь рядом с Perl в мире регулярных выражений - просто неприлично.

Чтоб беседу поддержать, вот видео, где Дэмиан Конвэй показывает новую игрушку ( дело происходит в 2012 году )
Отладчик регулярных выражений.
https://www.youtube.com/watch?v=zcSFIUiMgAs
анимэ.
(Но тут надо быть в теме и знать хотя бы про бэктрэкинг)
0
Эксперт NIX
3297 / 920 / 199
Регистрация: 14.01.2013
Сообщений: 4,586
15.11.2024, 12:24  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
комментарии в столбик прямо в исходнике
Там именно, что комментарии. А в 14 посту прям разжёвано.

Цитата Сообщение от volodin661 Посмотреть сообщение
Ставить кого-нибудь рядом с Perl в мире регулярных выражений - просто неприлично.
Эт понятно. Но в данном случае, регуляр awk-а выглядит менее зубодробильно. А если знать нюансы (у меня нигде глаз не зацепился, в мануалах, что разделитель может быть списком разделителей и что "ничего и что-то" разделяется два поля), то регуляр вообще выглядит простым. Вполне допускаю, что и регуляр перла может быть понятен на беглый взгляд, но это только для тех, у кого синапсы закучерявились под него.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.11.2024, 12:24
Помогаю со студенческими работами здесь

sed or awk
есть строка вида document.write('Monitor\n'); как сделать вывод слова Monitor Спасибо.

Linux Grep и Sed
Добрый день! Пожалуйста помогите с заданием. Имеется файл passwd.txt в котором содержится информация на подобие slizky:x:500:500:Lumir...

awk, grep внешняя переменная
Здравствуйте, не могу понять в чем может заключатся проблема отбора данных из файла к примеру есть строки в файле мне надо показать...

Awk/sed с переменной
Привет, подскажите пожалуйста, как использовать awk или sed с переменной. Есть некая переменная массива arr, в конце которой нужно...

Не работает регулярное выражение в AWK и GREP
Здравствуйте. Составил регулярное выражение https://regex101.com/r/1HyvMd/1/ ^41:01:00\d{5}:\d{1,4}$ Но не могу добиться чтобы оно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
На любовном киберфронте
Alexander-7 01.04.2025
Недавно на одном малоизвестном сайте знакомств мною заинтересовалась девушка: «Текст немного странный. Но, судя по адресу почты, иностранка», – подумал я. Поколебавшись пару суток, я ответил ей:. . .
Как работает Node.js изнутри
run.dev 29.03.2025
Node. js изменил подход к разработке веб-приложений, позволив использовать JavaScript не только на стороне клиента, но и на сервере. Созданный в 2009 году Райаном Далем, этот открытый,. . .
Моки в Python: Mock Object Library
py-thonny 29.03.2025
Тестирование кода требует особого подхода, когда речь идёт о компонентах, взаимодействующих с внешним миром. Мы часто сталкиваемся с непредсказуемостью HTTP-запросов, чтением данных из базы или. . .
JavaScript: Управление памятью и улучшение производительности
run.dev 29.03.2025
В отличие от низкоуровневых языков программирования, JavaScript не требует ручного выделения и освобождения памяти. Здесь работает автоматический сборщик мусора, который определяет, какие объекты. . .
Мультитенантная архитектура со SpringBoot и PostgreSQL
ArchitectMsa 29.03.2025
SaaS-приложения редко обслуживают одного клиента и обычно они должны поддерживать множество организаций, каждая из которых работает в своём изолированном пространстве. Мультитенантная архитектура. . .
std::span в C++: Производительность и лучшие практики
NullReferenced 28.03.2025
std::span — одно из самых недооценённых нововведений стандарта C++20, которое радикально меняет подход к работе с непрерывными последовательностями данных. По сути, это невладеющее представление. . .
Многопоточность в C#: Threadpool
UnmanagedCoder 28.03.2025
Пул потоков в C# — это коллекция заранее созданных и готовых к использованию потоков, которые находятся в распоряжении приложения. Вместо того чтобы создавать и уничтожать потоки для каждой небольшой. . .
Вопросы на собеседованиях по микросервисам
ArchitectMsa 27.03.2025
Работодатели ищут не просто разработчиков, знающих базовые концепции, а специалистов, разбирающихся в тонкостях масштабирования, отказоустойчивости и производительности. Сейчас на первый план выходят. . .
Взаимодействие Python с REST API
py-thonny 27.03.2025
REST API - это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Python располагает функциональным набором инструментов для работы с REST API и основная библиотека для. . .
sshd restrictions, ssh access limitations
jigi33 26.03.2025
sshd restrictions | ssh access limitations рестрикции доступа на сервер sshd статья: https:/ / www. golinuxcloud. com/ restrict-allow-ssh-certain-users-groups-rhel подробные расшифровки по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер