Выполните поиск по файлам Linux, отфильтруйте конкретную строку и удалите все остальное.

Выполните поиск по файлам Linux, отфильтруйте конкретную строку и удалите все остальное.

Я пытаюсь найти эффективный способ поиска по всему набору файлов в каталоге и поиска только определенной строки до первой запятой.

Пример файла журнала postgres:

Apr 27 03:35:18 test postgres[24098]: [5-1] user=postgres,db=postgres,app=psqlclient=127.0.0.1
Apr 27 03:35:18 test postgres[24098]: [5-2] user=postgres,db=postgres,app=psqlclient=127.0.0.1 

Меня интересует только имя пользователя, используемое в файлах. Я мог бы использовать pgbadger и посмотреть его через HTML, но это заняло бы много времени.

Итак, в качестве примера, я мог бы увидеть только:

user=postgres

В отличие от всего набора текста до и после пользователя.

Однако я ищу любого пользователя, не являющегося конкретно postgres.

Я пробовал использовать grep для файлов, но вижу результаты только для user=postgres.

Есть ли возможность поиска по набору файлов, например, по user= до первой запятой?

Или даже выполнить поиск по каждому файлу и удалить все, что находится перед user= в каждой строке, а затем, возможно, вставить это в Excel и получить нужный мне результат.

Буду признателен за любую оказанную помощь.

решение1

Использовать GNU grepс PCRE:

grep -Po -- '(?<=user=).+?(?=,)' *.log

Если вы также хотите отобразить user=ключевое слово:

grep -o -- 'user=[^,]*' *.log

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

Итак, grepкоманда становится такой:

grep -Ho -- 'user=[^,]*' *.log

И вывод:

pgsql.log:user=postgres
pgsql.log:user=postgres

решение2

С использованием awk:

awk '/user=/{gsub(/^.*user=|,.*$/, "");print $0}' file

Если вы хотите отобразить user=и имя файла, то команду можно изменить.

awk '/user=/{gsub(/^.*user=|,.*$/, "");
printf "%s:user=%s\n",FILENAME,$0}' *.log

В этой команде, если user=найдено, то gsub()функция, принимающая символы от начала записи до user=и следующие за запятой до userконца записи, изменяет их на пустую строку ( "").

Связанный контент