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

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

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

Студворк — интернет-сервис помощи студентам
Имеется текст такого вида
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
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
16.11.2024, 20:20
Студворк — интернет-сервис помощи студентам
Если хорошо ориентироваться в работе текстового процессора gawk, то подход можно сделать более человеческим. Вместо того чтобы всю строку разбивать на массив разделителей можно выбрать поля 1 и 5 с разделителем по умолчанию и уже эту строку $1$5 [29599:1545281]123.123.123.121/32 разбить на составляющие:
Code
1
awk '{split($1$5,N,"[]:/]")} N[2]{print N[2],N[3]}'
или
Code
1
awk '{split($1$5,N,/[]:/]/);$0=N[2]FS N[3]}N[2]'
Это более удобно. Визуально видны нужные поля в тексте 1 и 5, явно определяются разделители ];/ и подряд идут индексы в массиве N - 2 и 3, отбрасывая первое и последнее значения.

На гнутом седе:
Code
1
sed -nr 's/.*:([0-9]*[1-9]+[0-9]*)].+d( [0-9.]*)/\1\2/p'
Вот эта регулярка [0-9]*[1-9]+[0-9]* гарантирует, что в контрольном числе будут не только нули
0
1152 / 405 / 89
Регистрация: 30.08.2017
Сообщений: 2,487
16.11.2024, 22:50
Вызов сработал
0
Эксперт NIX
3308 / 935 / 202
Регистрация: 14.01.2013
Сообщений: 4,777
17.11.2024, 10:04  [ТС]
Цитата Сообщение от nezabudka Посмотреть сообщение
N[2]{print N[2],N[3]
Цитата Сообщение от nezabudka Посмотреть сообщение
;$0=N[2]FS N[3]}N[2]
Вот эти части - какой-то квадратный трёхчлен. Без пузыря пояснений не укладывается в синопсы.

Цитата Сообщение от nezabudka Посмотреть сообщение
Это более удобно.
Но менее понятно.

Цитата Сообщение от nezabudka Посмотреть сообщение
Если хорошо ориентироваться в работе текстового процессора gawk, то подход можно сделать более человеческим.
Самый гуманный вариант в 14 посте. И выглядит очень гармонично.

Добавлено через 2 минуты
Тему пора переименовывать. В "Не очевидные па, в танцах с AWK"
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
17.11.2024, 13:55
Цитата Сообщение от Kubuntovod Посмотреть сообщение
Вот эти части - какой-то квадратный трёхчлен. Без пузыря пояснений не укладывается в синопсы.
Все в awk имеет форму "условие {действие}". Если условие вычисляется в 1(или true) значит выполняется действие. Если условие опускается значит оно, принимает значение 1 по умолчанию. Если действие опускается и условие при этом вычисляется в 1 значит действие по умолчанию выполняется, то есть выводится на печать строка в буфере - {print $0}. Теперь смотрим что у нас есть:
Цитата Сообщение от nezabudka Посмотреть сообщение
Code
1
awk '{split($1$5,N,"[]:/]")} N[2]{print N[2],N[3]}'
Запишем это в формате "условие {действие}":
Code
1
2
3
4
5
awk '
1       {split($1$5,N,[]:/"} # условие по умолчанию принимается за 1
N[2]    {print N[2],N[3]}    # если в переменной N[2] - 0 значит действие не выполняется,
                             # если другое число то принимается за 1 и действие выполняется
}'
В переменной N записывается число триггер по которому определяется выводить ли строку на печать, следовательно если записано 0 или 00 то строка не выводится что соответствует условию задачи.
Следующий пример:
Цитата Сообщение от nezabudka Посмотреть сообщение
Code
1
awk '{split($1$5,N,/[]:/]/);$0=N[2]FS N[3]}N[2]'
Записываем в явном формате:
Code
1
2
3
awk '
{split($1$5,N,/[]:/]/);$0=N[2]FS N[3]}    N[2]
'
Теперь все меняется местами. Первое в фигурных скобках это условие. При выполнении действий в фигурных скобках получаем значение 1. А действие у нас определяет значение которое, находится в переменной N[2]. Если там число 0 или 00, то строка из записи(буфера) не выводится, если любое другое число, то оно означает 1 и выполняется действие по умолчанию {print $0}.
Не посвященному это кажется непонятным, поэтому я в начале и оговорилась:
Цитата Сообщение от nezabudka Посмотреть сообщение
Если хорошо ориентироваться в работе текстового процессора gawk
0
 Аватар для volodin661
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,020
17.11.2024, 14:07
Цитата Сообщение от nezabudka Посмотреть сообщение
Если хорошо ориентироваться
традиционно
0
Эксперт NIX
3308 / 935 / 202
Регистрация: 14.01.2013
Сообщений: 4,777
17.11.2024, 14:30  [ТС]
Цитата Сообщение от nezabudka Посмотреть сообщение
Теперь все меняется местами. Первое в фигурных скобках это условие. При выполнении действий в фигурных скобках получаем значение 1.
На взгляд непосвящённого, получается два условия. Хотя, первое, по факту, формирует новую строку, из запчастей изначальной строки. И оно всегда будет 1. Верно?
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
17.11.2024, 14:41
Kubuntovod, Да, это действие всегда возвращает 1 и это принимается как условие, а действие принимает значение или 0 или 1 в зависимости от значения в переменной и если это 1 то вызывается действие по умолчанию {print $0}. Так что во многих случаях достаточно поставить число, а не писать явно {print $0}. Обычно так и ставят 1, но подойдет любое число.

Добавлено через 4 минуты
Да и старая запись затирается и записывается новая состоящая из двух полей - значений в массиве N[2] и N[3]
0
Эксперт NIX
3308 / 935 / 202
Регистрация: 14.01.2013
Сообщений: 4,777
17.11.2024, 15:19  [ТС]
Цитата Сообщение от nezabudka Посмотреть сообщение
split($1$5,N,/[]:/]/)
Осталось одно белое пятно. Как-то странно расставленные слеши. Можете растолмачить?
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
17.11.2024, 15:34
Kubuntovod, В одном примере регулярка в кавычках, а в этом внутри двух прямых слэшей
/[]:/]/ вместо квадратных скобок - объединения в группу, можно указать через оператор или, но все же удобней будет в кавычках "]|:|/"
1
Эксперт NIX
3308 / 935 / 202
Регистрация: 14.01.2013
Сообщений: 4,777
17.11.2024, 16:23  [ТС]
Цитата Сообщение от nezabudka Посмотреть сообщение
но все же удобней будет в кавычках "]|:|/"
Да, так гуманнее.

Добавлено через 40 минут
Выжимка сока мозга нектара для непосвящённых, которые придут сюда после.

Строка "сырец":
Bash
1
[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
Bash
1
awk '{split($1$5,N,/[]:/]/);$0=N[2]FS N[3]} N[2]'
• Разделитель по дефолту - пробел. Берём поля 1 и 5. Т.е. [29599:1545281] и 123.123.123.121/32
• Список разделителей в /[ ... ]/
• Разделяем и складываем в массив N
• N[1] = [29599
• N[2] = 1545281
• N[3] = 123.123.123.121
• $0=N[2]FS N[3] - изначальную строку меняем на
1545281 123.123.123.121
• Если N[2] не 0, то выполняется действие по дефолту. А по дефолту, это {print $0}, т.е. выводим строку
И в свете последних обсуждений, брюки превращаются:
Bash
1
awk '{split($1$5,N,"]|:|/");$0=N[2]FS N[3]} N[2]'
Что воспринимается гораздо понятнее.
Bash
1
"]|:|/"
Список разделителей в кавычках и через | - ИЛИ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2024, 16:23

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}$ Но не могу добиться чтобы оно...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru