1

Всем привет. Помогите грепнуть инфу из файла.
Есть файл, в котором очень много строк. нужно как то вытащить из него инфу, при этом чтобы не выводить дубликаты.
Допустим надо вытащить инфу по 10.130.7.0-10.130.7.253
то есть чтобы выдал все значения 10.130.7.* и не выводить дубликаты...

Подскажите как это сделать. Заранее спасибо.

2

Поиск уникальных строк в текстовом файле:

 Консоль:
sort data.txt | uniq -u

Поиск строк содержащих дубликаты в текстовом файле
 Консоль:
sort data.txt | uniq -d

*** Добавлено: 16.02.2022 10:55:11 ***

Непонятен формат входного файла. Чтобы конкретно что-то советовать.

3

MozgFx пишет:

Поиск уникальных строк в текстовом файле:

 Консоль:
sort data.txt | uniq -u

Поиск строк содержащих дубликаты в текстовом файле
 Консоль:
sort data.txt | uniq -d

*** Добавлено: 16.02.2022 10:55:11 ***

Непонятен формат входного файла. Чтобы конкретно что-то советовать.

Формат файла csv.
Название файла ip.csv
*** Добавлено: 16.02.2022 11:15:56 ***

https://i.ibb.co/871v7rg/ip.png

Вот такие данные в файле, ну только ip другие, и нужно из такого файла как то вытащить серый диапазон адресов )

4

Portick пишет:

Вот такие данные в файле, ну только ip другие, и нужно из такого файла как то вытащить серый диапазон адресов )

Из одного столбца или из двух?
Не проще открыть в LibreOffice, оставить нужный столбец и там выбрать уникальные значения?

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD, DDR4 32 GB, SSD 500GB + HDD 2TB | Linux Mint 21.3 Cinnamon + Fedora 39 MATE (Compiz) + Windows 11 + macOS 12 Monterey

5

Rizado пишет:
Portick пишет:

Вот такие данные в файле, ну только ip другие, и нужно из такого файла как то вытащить серый диапазон адресов )

Из одного столбца или из двух?
Не проще открыть в LibreOffice, оставить нужный столбец и там выбрать уникальные значения?

Из одного столбца будет достаточно !
В моем случае в файле 150 млн строк.. Не уверен что LibreOffice прожует такие объемы )

6

Всего имеем 9 столбцов ($1-$9), работаем со столбцом $2 (FromIp). Аналогично можно работать со столбцом $4 (ToIp). Либо сразу по двум, сдвигая их в конец таблицы и изменяя уcловия 'сортировки | уникальности'.

Для столбца $2 (FromIp)...

uniq работает с разделителем "пробел", формат csv - разделение полей "запятой". Заменим все запятые пробелами, НО! Первое поле и так содержит пробел, поэтому заменим сначала все пробелы на "-" и только после этого, получив цельный столбец $1 заменим запятые на пробелы:

clear; cat ip.csv | tr ' ' '-' | tr ',' ' '

В uniq можно сравнивать строки, начиная с определённого столбца. Чтобы сравнение было чистым (только столбец №2), без учета последующих столбцов (слева на право), поменяем нужный столбец ($2) с последним ($9), чтобы он был финальным для сравнения uniq и введём признак уникальности по этому столбцу (теперь уже $9) с предварительной сортировкой строк (-f8, потому, что $9 - следующий):

cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -f8

И вернём столбцы на свои места, как было:

clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

Значит варианты такие:

# uniq -f8 - выводить дубликаты IP единожды
clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

# uniq -u -f8 - не выводить дубликаты IP
clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -u -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

# uniq -d -f8 - выводить только дубликаты IP
clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -d -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

Как-то так, видимо...  ab

MSI H81M-ECO, Intel Core i3-4130T, Intel HD Graphics 4400 | MgaRemix-9 Budgie 10.8.1 x86_64 + Windows 10

7

alex_q_2000 пишет:

Всего имеем 9 столбцов ($1-$9), работаем со столбцом $2 (FromIp). Аналогично можно работать со столбцом $4 (ToIp). Либо сразу по двум, сдвигая их в конец таблицы и изменяя уcловия 'сортировки | уникальности'.

Для столбца $2 (FromIp)...

uniq работает с разделителем "пробел", формат csv - разделение полей "запятой". Заменим все запятые пробелами, НО! Первое поле и так содержит пробел, поэтому заменим сначала все пробелы на "-" и только после этого, получив цельный столбец $1 заменим запятые на пробелы:

clear; cat ip.csv | tr ' ' '-' | tr ',' ' '

В uniq можно сравнивать строки, начиная с определённого столбца. Чтобы сравнение было чистым (только столбец №2), без учета последующих столбцов (слева на право), поменяем нужный столбец ($2) с последним ($9), чтобы он был финальным для сравнения uniq и введём признак уникальности по этому столбцу (теперь уже $9) с предварительной сортировкой строк (-f8, потому, что $9 - следующий):

cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -f8

И вернём столбцы на свои места, как было:

clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

Значит варианты такие:

# uniq -f8 - выводить дубликаты IP единожды
clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

# uniq -u -f8 - не выводить дубликаты IP
clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -u -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

# uniq -d -f8 - выводить только дубликаты IP
clear; cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}' | sort -k9 | uniq -d -f8 | awk '{print $1,$9,$3,$4,$5,$6,$7,$8,$2}'

Как-то так, видимо...  ab

Спасибо большое.... завтра буду пробовать )
*** Добавлено: 17.02.2022 06:20:48 ***

А как можно просто удалить ненужные столбцы и работать уже с файлом с одним столбцом ?

8

Portick пишет:

А как можно просто удалить ненужные столбцы и работать уже с файлом с одним столбцом ?

#Вывести только столбец $2 (с учетом пробела в столбце $1)
cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $2}'
#Перенаправить вывод в файл
cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $2}' > ./myfile.txt
MSI H81M-ECO, Intel Core i3-4130T, Intel HD Graphics 4400 | MgaRemix-9 Budgie 10.8.1 x86_64 + Windows 10

9

alex_q_2000 пишет:
Portick пишет:

А как можно просто удалить ненужные столбцы и работать уже с файлом с одним столбцом ?

#Вывести только столбец $2 (с учетом пробела в столбце $1)
cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $2}'
#Перенаправить вывод в файл
cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $2}' > ./myfile.txt

В общем вывел я один столбец в отдельный файл... вот таким способом:

cut -f1,3,4,5,6,7,8,9,10- --complement  ip.csv > new.csv

Теперь имеет вид:

https://i.ibb.co/JK8ytWs/Screenshot-3.png

Сейчас пытаюсь обычным грепом вытащить то что мне нужно... но не получается...

grep '10.130.7' new.csv | uniq -u

Выдает дикую портянку с повторяющимися адресами, но хотя бы уже чисто из диапазона 10.130.7* =) Я иду к успеху )

10

Portick пишет:

В общем вывел я один столбец в отдельный файл... вот таким способом:
cut -f1,3,4,5,6,7,8,9,10- --complement  ip.csv > new.csv

Нет предела совершенству. Неплохо было бы увидеть небольшую часть исходного ip.csv. Интересует разделитель полей...

Если разделитель полей "," - тогда c cut можно и так:

cat ip.csv | cut -d ',' -f2 | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 | uniq

Здесь вырезается поле -f2, обязательно сортируется перед uniq (uniq работает только с соседними записями). Сортировка IP-адресов описана здесь. После сортировки поиск дубликатов.

MSI H81M-ECO, Intel Core i3-4130T, Intel HD Graphics 4400 | MgaRemix-9 Budgie 10.8.1 x86_64 + Windows 10

11 (17.02.2022 11:06:56 отредактировано Portick)

alex_q_2000 пишет:
Portick пишет:

В общем вывел я один столбец в отдельный файл... вот таким способом:
cut -f1,3,4,5,6,7,8,9,10- --complement  ip.csv > new.csv

Нет предела совершенству. Неплохо было бы увидеть небольшую часть исходного ip.csv. Интересует разделитель полей...


https://disk.yandex.ru/d/BJJJ1wx1aWZ7eg

Вот ссылка на похожий файл но с меньшим количеством строк !

12

Portick пишет:

Вот ссылка на похожий файл но с меньшим количеством строк !

У Вас разделитель полей - "табуляция". Вырезать $2 и отсортировать можно так:

cat ip.csv | cut -f2 | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4

Кстати, чтобы не цитировать большие сообщение в ответах, можно выделить нужную строчку/абзац, отпустить ЛКМ и появится черная подсказка "Цитировать выделенное". Ну это так, для экономии пространства и читабельности.

MSI H81M-ECO, Intel Core i3-4130T, Intel HD Graphics 4400 | MgaRemix-9 Budgie 10.8.1 x86_64 + Windows 10