로그 파일에서 일부 부분 제거

로그 파일에서 일부 부분 제거

공백으로 정의된 열(7번째 열: /user1/index...)의 일부를 삭제하고 싶습니다. 내 로그 파일의 예는 다음과 같습니다.

192.xx.xxx - - [07/Apr/2017:14:21:15 +0200] "POST /user1/index.php?m=xxxxx&doajax=do_ajax_request&action=xxxx HTTP/1.1" ...
192.xx.x.xx - - [07/Apr/2017:14:21:15 +0200] "GET /user2/index.php?m=xxxxx&doajax=do_ajax_request&action=xxxxx HTTP/1.1".... 

모든 사용자를 삭제하고 싶습니다. 이는 user1과 user2를 의미합니다. 이렇게 사용자와 관련이 없는 요청을 분석하고 싶기 때문입니다.

192.xx.xxx - - [07/Apr/2017:14:21:15 +0200] "POST /index.php?m=xxxxx&doajax=do_ajax_request&action=xxxx HTTP/1.1" ...
192.xx.x.xx - - [07/Apr/2017:14:21:15 +0200] "POST /index.php?m=xxxxx&doajax=do_ajax_request&action=xxxxx HTTP/1.1".... 

요청을 가져오기 위해 이 명령을 사용해 보았지만 (/index.php?m=xxxx) cat /var/log/test.log| {print $7}'| awk -F/ '{print $3}' 내 요청을 찾을 수 있는 일곱 번째 열에서 이 요청을 바꾸는 방법을 모르겠습니다. 감사합니다.

답변1

sed 's,POST /[^/]*/,POST /,'  logfile | awk ... 

또는 기본 필드 구분 기호(FS)를 사용하는 경우 awk 스크립트에서

sub ("POST /[^/]*/", "POST /", $7) ; 

답변2

아래의 sed 옵션을 시도해 볼 수 있습니다.

sed -i 's:/[a-zA-Z0-9]*/:/:2' logfile

여기서는 "/"로 시작하고 문자와 숫자(사용자 이름용)가 있고 "/"로 끝나고 파일의 각 줄을 "/"로 바꾸는 패턴을 찾고 있습니다.

또는

sed -i 's: /[a-zA-Z0-9]*/:/:2' logfile

여기서 첫 번째 명령과의 유일한 차이점은 해당 줄의 첫 번째 /user* 앞의 공간도 차지한다는 것입니다.

관련 정보