60초마다 파일에서 x 줄을 복사해야 하고, 60초 후에 60초 동안 계속 복사하고 마지막 복사본에서 다시 시작해야 합니까?
#!/bin/bash
while true; do
sed -n -e '1,10000' input.yml > output.txt
sleep 60
done
감사해요
답변1
output.txt
실행할 때마다 재정의 하려면 다음을 수행하세요.
#! /bin/sh -
while true; do
head -n 10000 > output.txt
sleep 60
done < input.yml
그렇지 않은 경우:
#! /bin/sh -
while true; do
head -n 10000
sleep 60
done < input.yml > output.txt
그 사본들에 따라60초마다 10,000개 행. 행이 많지 않으면 10000행이 될 때까지 기다리지 않습니다.
head
출력의 목록 바이트 바로 뒤에 입력에 커서를 두는 구현을 가정합니다 . 입력 파일을 검색할 수 있는 경우(예 input.yml
:정기적인문서).
각 반복에서 이러한 10000줄을 기다리려면 다음을 사용하여 (GNU 시스템에서) 수행할 수 있습니다.
tail -fn+1 input.yml |
while true; do
sed -u 10000q > output.txt
sleep 60
done
여기서 입력은 검색 불가능한 파이프입니다. 따라서 우리는 최대 10000번째 개행 문자head
까지 한 번에 1바이트를 읽을 수 있는 구현이 필요합니다 . 그래서 GNU는 이것을 할 수 있습니다 .sed
-u
또 다른 방법은 다음과 같습니다.
tail -fn+1 input.yml | awk -v out=output.txt -v n=10000 '
{print > out}
NR % n == 0 {close(out); system("sleep 60")}'
( awk
인 경우에는 mawk
통과해야 합니다 -W interactive
.) 이 명령은 입력을 읽는 동일한 명령에 대해 항상 동일한 호출이므로 한 번에 1바이트를 읽을 필요가 없습니다. awk
이 명령을 실행할 때마다 sleep 60
쉘이 실행된다는 점에 유의하십시오 .