Я постараюсь добраться до сути. Поэтому я пытаюсь сегментировать большой экспортируемый файл (400 МБ) по определенному слову. Мы скажем уникальное слово в этом примере PYTHONEXP
,
Пример:
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxx 55.44.44.44 xxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxx 77.66.66.66 xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx 99.88.88.88xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx 99.88.88.88 xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
Теперь давайте представим, что x — это случайные слова, но каждый кусок разделяет уникальное слово (PYTHONEXP
) в самом начале. Я хочу иметь возможность сегментировать каждую часть и удалить дубликаты IP-адресов в только эти сегменты. В идеале я хотел бы вывод, как это:
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxx xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxx xxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxx xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx
xxxxxxxxx
xxxxxxx xxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxx xxx
xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
Обратите внимание, что у меня еще есть 2 записи для 99.88.88.88
в моем желаемом выводе вместо 4. Моя главная цель — удалить дубликаты в эти сегменты на основе линий, которые просто содержат PYTHONEXP
, Я был бы очень признателен за любую помощь в этом или знаю, если это вообще возможно. Я надеюсь, что я объяснил это правильно или это имеет смысл.
С этим в качестве входного файла:
$ cat file
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxx 55.44.44.44 xxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxx 77.66.66.66 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx 99.88.88.88 xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx 99.88.88.88 xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
Мы можем выбрать только те строки, которые содержат PYTHONEXP
и для них удалите второе вхождение IP-адреса следующим образом:
$ sed -En '/PYTHONEXP/{ s/(( ([[:digit:]]+\.){3}[[:digit:]]+).*)(\2)/\1/; p }' file
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxx 12.34.34.34 xxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxx 55.44.44.44 xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxx xxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxx 77.66.66.66 xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx xxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxx 22.33.33.33 xxxxxxxxxxxxxxxx xxxxxxxxx xxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
XXXXX PYTHONEXP xxxxxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxx 99.88.88.88 xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxx xxx xxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx
Это соответствует вашему желаемому результату.
-E
говорит sed использовать более современные расширенные регулярные выражения.
-n
говорит sed не печатать, если мы явно не попросим об этом.
/PYTHONEXP/{ ... }
говорит sed выбирать только те строки, которые соответствуют регулярному выражению PYTHONEXP
и для этих строк примените команды в фигурных скобках. В нашем случае фигурные скобки содержат две команды:
s/old/new/
это команда замещения, которая в нашем случае удаляет второе вхождение IP-адреса из строки.
p
говорит sed напечатать полученную строку.
Команда подстановки выглядит так:
s/(( ([[:digit:]]+\.){3}[[:digit:]]+).*)(\2)/\1/
---------------------------------- ----
| |
This matches a space followed |
by an IP address |
(This is saved in group 2.) |
|
This matches another
occurrence of the same IP
--------------------------------------
|
This matches a space and an IP
followed by anything and this
is save as group 1.
встречаются ли повторяющиеся строки? ххх ты упомянул в файле.
если так, то ниже должно работать в Bash
имя кота | grep -i PYTHONEXP | уник