シェル スクリプト内の 2 つの異なるファイルに特定の行を挿入したいと考えています。これの構文をどのように配置すればよいですか。
例:
for ループは 6 行を出力します。最初の 2 行を最初のファイルに追加し、最後の 4 行を他のファイルに追加する必要があります。
for ループは 6 行を出力します。最初の 2 行を最初のファイルに追加し、最後の 4 行を他のファイルに追加する必要があります。
道はない。1 つのオプションは、すべてをファイルにリダイレクトしてから、ログの目的のセクションを他のファイルにコピーすることです。
for i in {1..6}; do
echo $i > log
done
head -4 log >> logfile1 # Appends the first four lines to logfile1
tail -2 log >> logfile2 # Appends the last two lines to logfile2
BASH を使用している場合は、プロセス置換とパイプの組み合わせを使用してtee
、同じ入力を両方に同時に送信するためにhead -n2
使用できます。tail -n4
$ for i in {1..6}; do echo $i; done | tee >(head -n2 >first2.txt) | tail -n4 >last4.txt
$ cat first2.txt
1
2
$ cat last4.txt
3
4
5
6
デフォルトtee
では、その STDIN を取り、その STDOUT に加えて、引数として指定されたファイルにコピーします。/dev/fd
プロセス置換はファイル記述子へのパスを返すため(echo >(true)
例を参照) tee
、他の通常のファイルと同様にそのパスに書き込むことができます。
tee
置換後のコマンドは次のようになります。
tee /dev/fd/xx | tail -n4 >last4.txt
またはより視覚的に:
tee | tail -n4 >last4.txt
:
/dev/fd/xx
:
:..>(head -n2 >first2.txt)
head
したがって、出力はプロセス (出力は にリダイレクトされます) とプロセスfirst2.txt
にパイプされる STDINの両方にコピーされます。tail
プロセス置換は BASH 主義であるため、別のシェルを使用している場合、または POSIX 準拠を懸念している場合は、利用できない可能性があることに注意してください。