С Новым годом! Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Эксперт NIX
3281 / 892 / 196
Регистрация: 14.01.2013
Сообщений: 4,451
1

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

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

Author24 — интернет-сервис помощи студентам
Имеется текст такого вида
Код
[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 адрес. Примерный выхлоп
Код
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 $...

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

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

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

29
Невнимательный
2776 / 1108 / 346
Регистрация: 08.02.2013
Сообщений: 6,336
Записей в блоге: 2
13.11.2024, 15:03 2
Цитата Сообщение от Kubuntovod Посмотреть сообщение
perl
как вариант
Код
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
317 / 189 / 18
Регистрация: 27.07.2018
Сообщений: 874
13.11.2024, 16:06 3
ft4l,
а если там будет 1:1, а не 0:0? не хорошо по количеству символов чекать.
1
6302 / 2144 / 337
Регистрация: 10.12.2013
Сообщений: 7,387
13.11.2024, 17:30 4
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
Невнимательный
2776 / 1108 / 346
Регистрация: 08.02.2013
Сообщений: 6,336
Записей в блоге: 2
13.11.2024, 17:31 5
Цитата Сообщение от Sienwfpgdo Посмотреть сообщение
1:1
если не бывает :01
perl -nE "say qq'$1 $2' if /^\[\d+:(?!0)(\d+).*?-d\h*([.0-9]+)/" "./test.txt"
0
Eddy_Em
13.11.2024, 17:37
  #6

Не по теме:


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

0
6302 / 2144 / 337
Регистрация: 10.12.2013
Сообщений: 7,387
13.11.2024, 17:42 7
Eddy_Em,

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

Bash
1
awk -F '[\\[\\]:/]|[ \\s]+' '$3 > 0 { print $3, $8 }'
0
Эксперт NIX
3281 / 892 / 196
Регистрация: 14.01.2013
Сообщений: 4,451
14.11.2024, 06:52  [ТС] 9
Цитата Сообщение от 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
Сообщений: 176
14.11.2024, 10:02 10
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Не бывает. Но не взлетело.
что фраза точно поразумевает
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Требуется вынуть второе число из квадратных скобок, не учитывая 0. Т.е. с [0:0] не нужна строка.
а) второе поле не должно быть 0
б) второе поле не должно содержать 0

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

Bash
1
awk -F '[\\[\\]:/]|[ \\s]+' '$3 !~ /0/ { print $3, $8 }'
0
Невнимательный
2776 / 1108 / 346
Регистрация: 08.02.2013
Сообщений: 6,336
Записей в блоге: 2
14.11.2024, 14:25 11
Цитата Сообщение от 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
6302 / 2144 / 337
Регистрация: 10.12.2013
Сообщений: 7,387
14.11.2024, 14:28 12
Цитата Сообщение от Kubuntovod Посмотреть сообщение
сколхозить
дожил.
колхозником назвали.
и это, заметьте, за развертывание regex в идиоматическую вертикаль с комментами и удобной правкой фрагментов, ежели чо.

Bash
1
perl -lne '/(\d+):(\d+) .+ -d \s ([\d.]+)/x ? $1&$2 ? print "$2 $3" :0:0' rules.txt
0
Эксперт NIX
3281 / 892 / 196
Регистрация: 14.01.2013
Сообщений: 4,451
14.11.2024, 15:07  [ТС] 13
Цитата Сообщение от 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
Сообщений: 176
14.11.2024, 16:43 14
Лучший ответ Сообщение было отмечено Kubuntovod как решение

Решение

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

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

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

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

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

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

Код
[29599:1545281] -A Bla_122_123_PREROUTING -d 123.123.123.121/32 ...
Код
$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
3281 / 892 / 196
Регистрация: 14.01.2013
Сообщений: 4,451
14.11.2024, 18:25  [ТС] 15
Цитата Сообщение от siberian-man Посмотреть сообщение
$1 - первое поле (пустая строка)
Слева от разделителя всегда поле?

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

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

Цитата Сообщение от Kubuntovod Посмотреть сообщение
больше всего, нравится решение с awk
Мои последние примеры на perl - аналоги того решения на awk.
0
6302 / 2144 / 337
Регистрация: 10.12.2013
Сообщений: 7,387
15.11.2024, 02:27 17
подаю официальный протест,
решение на основе 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
3281 / 892 / 196
Регистрация: 14.01.2013
Сообщений: 4,451
15.11.2024, 08:26  [ТС] 18
Цитата Сообщение от siberian-man Посмотреть сообщение
Мои последние примеры на perl - аналоги того решения на awk.
Это понятно. Но с awk красивее.

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

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

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

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

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

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

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

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

Не работает регулярное выражение в AWK и GREP
Здравствуйте. Составил регулярное выражение https://regex101.com/r/1HyvMd/1/...

Awk/sed считать строки от конца
Как вывести строки файла, указывая диапазон от конца? Т.е. аналогично tail, но нужен не конец...

Вырезать строку между 2 позициями с помощью sed и awk
Коллеги, добрый день. Помогите, пожалуйста, не могу разобраться. Не помогает даже гугл, все, что...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru