파일에서 n줄마다 수집

파일에서 n줄마다 수집

HTTP를 통해 스트리밍해야 하는 대용량 로그 파일이 있습니다. 성능상의 이유로 모든 항목을 캡처/수집하고 싶습니다.N확인하고 보내세요. 그래서 기본적으로 내가 원하는 것은 파일의 버퍼링된 출력 n줄입니다. 이를 달성하기 위한 tail/head 또는 다른 Linux 명령이 있습니까?

답변1

awk"발신 데이터" 디렉토리를 별도로 분할하고 모니터링하는 inotifywait조합을 권장합니다 . 예를 들어 "outgoing"이라는 디렉터리를 생성하면 새 파일이 나타날 때마다 해당 파일을 보내드립니다.

스크립트 1: awk10줄마다 분할하고 숫자 X를 늘려 새 파일 "bufferX"에 씁니다. 필요에 따라 조정합니다.

$cat split.awk

NR%10==1 {buffer="buffer"++i}

{
print > buffer
if (NR%%10==0) {system("mv "buffer" outgoing/")}
}

스크립트 2: 나가는 디렉터리를 모니터링하고 새 로그 배치가 나타나면 데이터를 보냅니다. 나는 당신이 curl전송에 사용하고 있다고 가정하고 있습니다. 그에 따라 조정하십시오.

$cat watch_dir.sh

#!/bin/bash
inotifywait -m -o watch.logs -e moved_to --format '%w%f' outgoing/  |\
while read bufferfile
do
    curl -T ${bufferfile} http://taget.url && rm ${bufferfile}
done

이는 "보내는" 파일에 대한 inotifywait디렉터리를 감시하고 , 모니터 모드에서 무한히 실행되며, "watch.logs"에 lgs를 실행하고 경로 및 파일 이름과 함께 감지된 파일을 인쇄합니다. 마지막 부분에서는 명령을 읽고 업로드 후 파일을 삭제합니다.-emoved_to-m-o--formatcurl

나가는 디렉터리를 만들고 다음을 실행합니다.

bash watchdir.sh & <your_command_creating_output> | awk -f split.awk

관련 정보