공백으로 정의된 열(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* 앞의 공간도 차지한다는 것입니다.