HTTP를 통해 스트리밍해야 하는 대용량 로그 파일이 있습니다. 성능상의 이유로 모든 항목을 캡처/수집하고 싶습니다.N확인하고 보내세요. 그래서 기본적으로 내가 원하는 것은 파일의 버퍼링된 출력 n줄입니다. 이를 달성하기 위한 tail/head 또는 다른 Linux 명령이 있습니까?
답변1
awk
"발신 데이터" 디렉토리를 별도로 분할하고 모니터링하는 inotifywait
조합을 권장합니다 . 예를 들어 "outgoing"이라는 디렉터리를 생성하면 새 파일이 나타날 때마다 해당 파일을 보내드립니다.
스크립트 1: awk
10줄마다 분할하고 숫자 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를 실행하고 경로 및 파일 이름과 함께 감지된 파일을 인쇄합니다. 마지막 부분에서는 명령을 읽고 업로드 후 파일을 삭제합니다.-e
moved_to
-m
-o
--format
curl
나가는 디렉터리를 만들고 다음을 실행합니다.
bash watchdir.sh & <your_command_creating_output> | awk -f split.awk