bash 스크립트를 사용하여 루프에서 n 줄 읽기

bash 스크립트를 사용하여 루프에서 n 줄 읽기

다음 형식의 파일이 있습니다.

추적 프로세스 시작 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".

관련 정보