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빈 문자열( )로 변경하는 함수입니다 "".

관련 정보