다음과 같은세게 때리다이 명령은 입력 파일을 읽고 각 줄 사이에 15초 간격을 두고 각 줄을 인쇄합니다.
IFS=$'\n';for line in $(cat file.txt | tail -n +2); do echo $line && sleep 15; done;
다만, 각 회선 사이의 지연 시간이 길기 때문에이 명령이 실행되는 동안 입력 파일 수정.
예를 들어 다섯 번째 줄을 수정하면 명령이 처음 세 줄만 인쇄할 수 있습니다. 30초 후 명령이 다섯 번째 줄에 도달하여 인쇄할 때 명령이 처음 실행되었을 때의 파일이 아닌 업데이트된 줄을 표시하고 싶습니다.
예입력하다파일.txt
본토
아프리카
남극
아시아
호주
유럽
북미
남미
입력 파일에 순서가 없습니다.
수정됨입력하다파일.txt
아프리카
남극
대륙
유럽
아시아
호주 북미
남미
답변1
파일을 실행할 때마다 파일을 읽어야 합니다. 다음을 시도해 보세요.
num=1
while true; do
if [[ $num < $(wc -l file.txt) ]]; then
awk "NR==$num" file.txt && let "num++"
else
break
fi
sleep 15
done
그러면 한 줄이 인쇄되고 15초 동안 휴면 상태가 된 다음 계속되며 더 이상 줄이 없으면 종료됩니다. NR은 awk
레코드 번호 또는 줄 번호에 대한 내장 변수 입니다 .
답변2
다음을 사용하고 파일에 추가하세요(또는 편집할 때 매우 주의하세요).
awk '{ system("echo "$0"; sleep 15") }' file.txt
주문하다
당신이 가진 주요 문제는 처음에 파일 읽기를 수행하는 방법입니다 $(cat file.txt | tail -n +2)
. 즉, 전체 파일을 읽고 루프가 시작되기 전에 반복할 줄 목록을 생성하는 것입니다. 이 시점에서는 파일 읽기를 마쳤을 때 파일에 어떤 일이 발생하는지는 중요하지 않습니다. 그런 다음 값비싼 명령을 사용하여 라인을 반복할 수 있습니다.
대신, 애플리케이션이 한 번에 한 행씩 읽고 처리하기를 원합니다. 이 작업을 수행하려면 awk
및 명령을 사용할 수 있습니다 system
.
awk '{ system("echo "$0"; sleep 15") }' file.txt
여기서는 awk를 사용하여 파일을 열고 한 줄씩 처리합니다. 각 줄에서 "echo "$0"; sleep 15"
쉘의 명령을 실행합니다. sed를 현재 행으로 바꾸려면 따옴표가 $0
따옴표 외부에 있어야 합니다. 그렇지 않으면 명령의 일부로 간주됩니다.
파일 수정
그러나 이 명령이 유일한 문제는 아닐 수도 있습니다. 이면에서 대부분의 응용 프로그램은 완전히 새로운 파일에 쓴 다음 "저장"을 클릭하면 이전 파일을 삭제하고 새 파일의 이름을 바꾸는 방식으로 파일을 수정합니다. 이는 안전을 위한 것입니다. 파일을 쓰는 도중에 충돌이 발생하더라도 원본 파일은 그대로 유지되기 때문에 문제가 되지 않으며 파일을 성공적으로 쓴 후에만 매우 빠른 작업으로 이전 파일을 삭제합니다. 파일이 제자리에서 수정된 것 같습니다. 이는 awk(또는 사용 중인 모든 명령)가 수정 사항을 읽기 시작하기 전에 파일을 닫았다가 다시 열어야 함을 의미합니다.
불행하게도 파일을 수정하는 대부분의 명령은 이런 방식으로 수행됩니다. 그러나 파일에 안전하게 추가할 수 있습니다.
echo "Test" >> file.txt
다른 모든 국가가 완료되면 위 명령이 처리를 시작합니다.
실제로 이 모든 것에는 그럴 만한 이유가 있으며, 단순히 원하는 것을 수행하는 것이 가능하다면 가능한 수많은 경쟁 조건과 특수 사례를 가리고 있습니다. 우선, 필수 라인 이전에 파일을 수정하면 어떻게 될까요? 파일 위치는 줄 번호가 아닌 바이트 위치로 추적되므로 수정하는 줄의 길이가 다른 경우 응용 프로그램이 파일에서 해당 위치를 잃게 됩니다. 또한 응용 프로그램이 파일을 내부에서 수정할 수 있더라도 변경된 바이트만 업데이트하는 것이 아니라 실제로 전체 파일을 처음부터 다시 작성한다는 점을 고려해야 합니다(다시 추가/이동하는 줄로 인해 달라질 수 있음). 치수는 원본입니다.)
또는 매번 파일을 읽고 현재 행 번호를 추적할 수 있습니다. 이렇게 하면 위의 문제 중 일부가 해결되지만, 현재 행 앞에 행을 추가하면 어떻게 되는지와 같이 고려해야 할 몇 가지 특수한 경우가 있습니다. 처리중인 라인? 간단한 솔루션에서는 현재 행을 두 번 처리하게 되는데, 이는 문제가 될 수도 있고 그렇지 않을 수도 있습니다. 가장 좋은 방법은 파일을 읽고, 파일이 수정/삭제된 경우 다시 읽고, 파일의 변경 사항을 수동으로 처리하여 차이점을 해결하는 응용 프로그램을 직접 작성하는 것입니다. 그러나 이렇게 하려면 더 많은 작업이 필요하고 간단히 추가해야 합니다. 상황에 따라 위와 같은 방법만 필요할 수도 있습니다.