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
シェルが実行されることに注意してください。