공백으로 정의된 열(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|을 추출하기 위해 이 명령을 사용하려고 했습니다. {$7 인쇄}'| awk -F/ '{print $3}' 하지만 내 요청을 찾을 수 있는 7번째 열에서 이 요청을 바꾸는 방법을 모르겠습니다. 감사합니다.
답변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* 앞에도 공백이 필요하다는 것입니다.