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 사용자가 아닌 사람을 찾고 있습니다.

파일에 대해 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""

관련 정보