나는 디렉토리에 있는 전체 파일 세트를 검색하고 첫 번째 쉼표 앞의 특정 문자열만 찾는 효율적인 방법을 찾으려고 노력하고 있습니다.
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 사용자가 아닌 사람을 찾고 있습니다.
파일에 대해 greping을 시도했지만 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
""