다음 형식의 파일이 있습니다.
추적 프로세스 시작 17134 17136 17137 17138 (/usr/sbin/nginx)... [1465461983910514] pid:17136 get/ 총: 244us, accept() ~ 헤더 읽기: 19us, 다시 쓰기: 9us, 사전 액세스: 13us, 액세스: 9us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us [1465461983911223] pid:17136 GET /sfi9876 총: 110us, accept() ~ 헤더 읽기: 12us, 다시 쓰기: 13us, 사전 액세스: 20us, 액세스: 13us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us [1465461983911949] pid:17136 GET /lpt9 총: 127us, accept() ~ 헤더 읽기: 14us, 다시 쓰기: 18us, 사전 액세스: 28us, 액세스: 20us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us [1465461983912121] pid:17136 GET /~sfi9876 총: 127us, accept() ~ 헤더 읽기: 11us, 다시 쓰기: 24us, 사전 액세스: 37us, 액세스: 26us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us
각 요청에 소요된 총 시간을 사용하여 이 로그를 다음과 같이 정렬하고 싶습니다.
추적 프로세스 시작 17134 17136 17137 17138 (/usr/sbin/nginx)... [1465461983911223] pid:17136 GET /sfi9876 총: 110us, accept() ~ 헤더 읽기: 12us, 다시 쓰기: 13us, 사전 액세스: 20us, 액세스: 13us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us [1465461983911949] pid:17136 GET /lpt9 총: 127us, accept() ~ 헤더 읽기: 14us, 다시 쓰기: 18us, 사전 액세스: 28us, 액세스: 20us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us [1465461983912121] pid:17136 GET /~sfi9876 총: 127us, accept() ~ 헤더 읽기: 11us, 다시 쓰기: 24us, 사전 액세스: 37us, 액세스: 26us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us [1465461983910514] pid:17136 get/ 총: 244us, accept() ~ 헤더 읽기: 19us, 다시 쓰기: 9us, 사전 액세스: 13us, 액세스: 9us, 콘텐츠: 137us 업스트림: 연결=0us, 첫 번째 바이트까지의 시간=0us, 읽기=0us
따라서 bash 스크립트를 사용하여 이를 수행할 수 있는 방법을 제안해 주십시오.
답변1
일반 while read
루프를 사용한 다음 read
루프 내에서 두 번 사용하여 각 그룹의 두 번째 및 세 번째 행을 읽을 수 있습니다.
while read -r line1; do
read -r line2
read -r line3
...
done
답변2
headTime=$(echo $line|cut -d':' -f2|cut -du)
EOF까지 반복하고, 각 항목(3줄)을 읽고, 시간 을 추출 하고 total=$(expr $headTime + $rewriteTime + ...)
.
그런 다음 3개 행의 각 세트를 합계로 시작하는 단일 줄로 출력하고(정렬용) 행 구분 기호(예: )를 넣어 |
정렬 후 쉽게 구분할 수 있습니다. 그런 다음 분명히 임시 파일을 정렬하여 줄을 다시 분할합니다 sort -n tempFile|sed "s/|/\n/g"
.