Я пытаюсь найти эффективный способ поиска по всему набору файлов в каталоге и поиска только определенной строки до первой запятой.
Пример файла журнала 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
конца записи, изменяет их на пустую строку ( ""
).