LINUX.ORG.RU
ФорумAdmin

Сравнение двух файлов

 ,


0

1

Доброго времени всем!

Нашел закрытую тему про сравнения двух файлов:

for i in $(cat a.txt); do grep $i b.txt 1>/dev/null 2>/dev/null && echo $i ; done

Это выведет все адреса из a.txt, которые есть в b.txt. Если надо наоборот чтоб были адреса которых нет - замените && на ||

У меня стоит похожая задача, только в файле a.txt:
18:52:35.924 User skashtanov logged in succesfully
19:02:09.421 User ngrigoreva logged in succesfully
20:32:25.647 User onikolaeva logged in succesfully
22:38:55.747 User UNKNOWN is logging out
22:38:57.912 User ogrigorieva logged in succesfully
23:30:16.425 User nvasilev logged in succesfully

А в файле b.txt:
23:30:50
23:30:50
23:30:50
23:30:52
23:30:52
23:30:52
23:30:52
23:30:53
23:30:56
23:30:57
23:30:57
23:31:00
23:33:04

необходимо сравнение этих двух файлов, если время из файла a.txt совпадает c файлом b.txt тогда выводится строка из файла a.txt. В данном виде не отрабатывает, я думаю проблема в миллисекундах. Может возможно сравнивать по первым 8 символам? что нужно дописать для этого? Может вообще я неправильно мыслю) Подскажите пожалуйста



Последнее исправление: fosterx (всего исправлений: 3)

uniq b.txt | grep -f - a.txt

Но у тебя в приведённых файлах ни одно время из b.txt не совпадает с тем, что в a.txt. Если это лишь пример, но не рабочий, то ок. Если это реальное содержимое этих файлов, то непонятно, чего ты хочешь, ведь есть:

если время из файла a.txt совпадает c файлом b.txt тогда выводится строка из файла a.txt

Но при этом в приведённых фрагментах ни разу не совпадает.

P.S. uniq в целом необязателен, но если файл b.txt очень большой, и там много одинаковых строк, то так может быть быстрее.

Вот я добавил пару строк в b.txt, чтоб оно имело смысл. Это то, что тебе надо?

% cat a.txt
18:52:35.924 User skashtanov logged in succesfully
19:02:09.421 User ngrigoreva logged in succesfully
20:32:25.647 User onikolaeva logged in succesfully
22:38:55.747 User UNKNOWN is logging out
22:38:57.912 User ogrigorieva logged in succesfully
23:30:16.425 User nvasilev logged in succesfully

% cat b.txt
19:02:09
22:38:55
23:30:50
23:30:50
23:30:50
23:30:52
23:30:52
23:30:52
23:30:52
23:30:53
23:30:56
23:30:57
23:30:57
23:31:00
23:33:04

% uniq b.txt | grep -f - a.txt
19:02:09.421 User ngrigoreva logged in succesfully
22:38:55.747 User UNKNOWN is logging out
CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

Спасибо за ответ! ДА, данные действительно пример! Все отработало как надо. Возник еще вопрос) Как исключить в выводе строки содержащие UNKNOWN и весь этот результат записать в файл csv поделенный на время и user?

fosterx
() автор топика
Ответ на: комментарий от fosterx

Как исключить в выводе строки содержащие UNKNOWN

| grep -v 'UNKNOWN' в конце.

и весь этот результат записать в файл csv поделенный на время и user

Это, наверное, проще всего будет сделать с помощью awk. csv это же тупо время, потом юзернейм через запятую без пробелов, и так на каждой строке? Тогда так выходит:

uniq b.txt | grep -f - a.txt | grep -v UNKNOWN | awk '{ print $1 "," $3 }'
CrX ★★★★★
()
Ответ на: комментарий от CrX

Ребят, я очень извиняюсь, но задачу теперь ставят по другому(( Вообще первоначально было так: Есть tomcat-овский лог: cat localhost_access_log.2025-07-02.txt | grep Linux

[02/Jul/2025:13:48:22 +0300] «GET /kap/api/loggedin HTTP/1.1» 200 266541 - Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 [02/Jul/2025:13:48:23 +0300] «GET /kap/api/loggedin HTTP/1.1» 200 266541 - Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 [02/Jul/2025:13:48:23 +0300] «GET /kap/api/dashboard HTTP/1.1» 200 22150 - Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 [02/Jul/2025:13:48:25 +0300] «GET /kap/api/edoc/repairWorkOsk/16696?subPath=survey%2F84112%2Fsact HTTP/1.1» 200 23 - Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36
[02/Jul/2025:13:48:33 +0300] «POST /kap/api/edoc/repairWorkOsk/16696?subPath=survey/84112/sact HTTP/1.1» 200 54 - Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 [02/Jul/2025:13:48:33 +0300] «GET /kap/api/edoc/repairWorkOsk/16696?subPath=survey%2F84112%2Fsact HTTP/1.1» 200 143 - Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 [02/Jul/2025:13:48:36 +0300] «GET /kap/api/loggedin HTTP/1.1» 200 266541 - Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36

Тут отображены все юзеры которые ходят с планшетов

А есть лог некой cms которая крутится на tomcat:

13:19:26.169 User asmirnov logged in succesfully
13:19:36.399 User eivanova logged in succesfully
13:20:10.305 User mvzaitsev logged in succesfully
13:23:42.833 User UNKNOWN is logging out
13:23:44.078 User ldmitrieva logged in succesfully
13:26:02.185 User UNKNOWN is logging out
13:26:03.400 User emageramova logged in succesfully
13:27:53.599 User vivanov logged in succesfully
13:29:14.671 User kvasilev logged in succesfully
13:31:45.609 User UNKNOWN is logging out
13:31:47.317 User rahtyamov logged in succesfully
13:33:54.038 User mpopov logged in succesfully
13:35:09.679 User vukleyn logged in succesfully
13:35:27.993 User UNKNOWN is logging out
13:35:28.050 User UNKNOWN is logging out
13:35:28.050 User UNKNOWN is logging out
13:35:29.458 User rastafev logged in succesfully
13:36:58.350 User idobrovolskaya logged in succesfully
13:37:54.541 User akutenov logged in succesfully
13:38:08.565 User UNKNOWN is logging out
13:38:08.565 User UNKNOWN is logging out

Тут отображены вообще все пользователи которые посещают cms Необходимо сопоставить данные из этих двух логов что бы понять какой пользователь и во сколько посещал сайт. Я вчера вырезал время из лога tomcat и с вашей помощью сопоставил эти два файла: grep -f b.txt a.txt Теперь требуется что бы вначале шла дата, время, юзер, ось (Android, Linux)

fosterx
() автор топика
Ответ на: комментарий от CrX

tomcat-овский лог:
cat localhost_access_log.2025-07-02.txt | grep Linux

[02/Jul/2025:14:42:22 +0300] «POST HTTP/1.1» 200 58 - Mozilla/5.0 (Linux; Android 12; Lenovo TB-J616X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36

[02/Jul/2025:14:42:39 +0300] «POST HTTP/1.1» 200 58 - Mozilla/5.0 (Linux; Android 12; Lenovo TB-J616X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36

[02/Jul/2025:14:42:52 +0300] «POST HTTP/1.1» 200 58 - Mozilla/5.0 (Linux; Android 12; Lenovo TB-J616X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36

[02/Jul/2025:14:43:03 +0300] «POST HTTP/1.1» 200 58 - Mozilla/5.0 (Linux; Android 12; Lenovo TB-J616X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36

Из этого лога получаю файл такого содержания:

02/Jul/2025:13:46:54 Android
02/Jul/2025:13:46:55 Android
02/Jul/2025:13:46:55 Android
02/Jul/2025:13:46:55 Android
02/Jul/2025:13:46:56 Android
02/Jul/2025:13:46:56 Android
02/Jul/2025:13:46:59 Android
02/Jul/2025:13:46:59 Android
02/Jul/2025:13:46:59 Android

Получаю лог CMS выстроенный в два столбца:

13:35:29.458 User rastafev logged in succesfully
13:36:58.350 User idobrovolskaya logged in succesfully
13:37:54.541 User akutenov logged in succesfully
13:38:09.469 User evybornova logged in succesfully
13:38:21.655 User lbabaeva logged in succesfully
13:38:33.940 User tsmolenceva logged in succesfully
13:40:00.539 User nstepura is logging out
13:41:24.100 User smursalimova logged in succesfully
13:46:54.162 User nnikiforov logged in succesfully
13:46:55.083 User azubkova logged in succesfully
13:46:59.550 User dosipova logged in succesfully

Я вчера вырезал время из лога tomcat и с вашей помощью сопоставил эти два файла: grep -f b.txt a.txt Теперь требуется что бы вначале шла дата, время, юзер, ось (Android, Linux)

fosterx
() автор топика
Ответ на: комментарий от fosterx

Почему бы тебе с этими задачами не сходить к ChatGPT? Пора осваивать современные инструменты, а не пытаться эксплуатировать форумчан. В такой постановке задача тянет на категорию Job.

vbr ★★★★★
()
Ответ на: комментарий от fosterx

Непонятно что нужно сделать, слишком запутанно (одно вытекает из третьего, сливаясь с первым после первого через фильтр …). Опиши задачу заново, пожалуйста. Что есть на входе, как фильтруешь и что нужно сделать.

kaldeon
()
Ответ на: комментарий от vbr
IFS='
'
for i in $(cat); do
  echo $i
done

Да, есть свои условности (пустые линии, размер массива), но шелл хотя бы задумывался прежде всего удобным, уникальная конструкция под каждую задачу — это уже перл какой-то.

kaldeon
()
Ответ на: комментарий от kaldeon

Да, так можно. Но добавлю, что ещё минус такого подхода - загрузка всего файла в память shell-а. И что-то мне подсказывает, что для больших файлов это будет супер-неэффективно. В то время как while read читает файлы построчно и память тратит только на текущую строку.

vbr ★★★★★
()
Ответ на: комментарий от futurama

Да нет никакой разницы, как писать. Что значит «правильней»? Не правильней. И вообще так неудобно писать, т.к. ты пишешь пайп, дорабатываешь его, дописываешь что-то в конец, и это < a.txt постоянно будет мешаться. Ты пишешь слева направо, думаешь слева направо. И действия идут слева направо. Напечатать файл a.txt. Для каждой строки сделать то-то. А не йода-стайл «для каждой строки сделать то-то, из файла a.txt»

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)

С учетом сложности и меняющихся требований, я бы взял какой нибудь питон или клал данные в sqlite и уже оттуда забирал с помощью SQL.

skyman ★★★★★
()
Ответ на: комментарий от fosterx

надеюсь, это не в real-time?

проще тогда сначала логи обработать и потом сравнивать.
для начала - выбросить миллисекунды и UNKNOWN из cms log:

sed -e ‘s/.[0-9][0-9][0-9] / /’ -e ‘/UNKNO/d’ cms-log >real-cms-log

примерно также выбрасываешь ненужные поля из апачевсокго лога, можно с помощью cut

и да, апач (если это именно он) - очень просто можно сказать в каком формате вести лог. CustomLog это называется.

mumpster ★★★★★
()