LinuxForum.Fans
Тема

grep из файла

Автор: Portick 12 сообщений 869 просмотров
16.02.2022 10:10 #437251

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

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

16.02.2022 10:55 #437252

Поиск уникальных строк в текстовом файле:
[console]sort data.txt | uniq -u[/console]
Поиск строк содержащих дубликаты в текстовом файле
[console]sort data.txt | uniq -d[/console]
Добавлено: 16.02.2022 10:55:11

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

16.02.2022 11:15 #437253
MozgFx написал:
Поиск уникальных строк в текстовом файле:
[console]sort data.txt | uniq -u[/console]
Поиск строк содержащих дубликаты в текстовом файле
[console]sort data.txt | uniq -d[/console]
Добавлено: 16.02.2022 10:55:11

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

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



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

16.02.2022 12:59 #437255
"Portick" написал:
Вот такие данные в файле, ну только ip другие, и нужно из такого файла как то вытащить серый диапазон адресов )

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

16.02.2022 13:44 #437256
Rizado написал:
[quote="Portick"]Вот такие данные в файле, ну только ip другие, и нужно из такого файла как то вытащить серый диапазон адресов )

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

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

16.02.2022 13:48 #437257

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

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

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

text

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

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

text

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

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

text

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}'

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

text

# 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}'

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

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

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

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

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

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

text

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

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

text

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}'

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

text

# 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}'

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

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

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

17.02.2022 07:23 #437259
"Portick" написал:
А как можно просто удалить ненужные столбцы и работать уже с файлом с одним столбцом ?
text

#Вывести только столбец $2 (с учетом пробела в столбце $1)
cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $2}'
#Перенаправить вывод в файл
cat ip.csv | tr ' ' '-' | tr ',' ' ' | awk '{print $2}' > ./myfile.txt
17.02.2022 09:19 #437260
alex_q_2000 написал:
[quote="Portick"]А как можно просто удалить ненужные столбцы и работать уже с файлом с одним столбцом ?
text

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

[/quote]

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

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

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



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

grep '10.130.7' new.csv | uniq -u

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

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

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

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

text

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-адресов описана здесь. После сортировки поиск дубликатов.

17.02.2022 11:05 · отредактировано #437262
alex_q_2000 написал:
[quote="Portick"]В общем вывел я один столбец в отдельный файл... вот таким способом:
cut -f1,3,4,5,6,7,8,9,10- --complement  ip.csv > new.csv

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


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

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

17.02.2022 11:51 #437263
"Portick" написал:
Вот ссылка на похожий файл но с меньшим количеством строк !

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

text

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

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

Войдите или зарегистрируйтесь, чтобы ответить.