-2

シェル スクリプト内の 2 つの異なるファイルに特定の行を挿入したいと考えています。これの構文をどのように配置すればよいですか。

例:

for ループは 6 行を出力します。最初の 2 行を最初のファイルに追加し、最後の 4 行を他のファイルに追加する必要があります。

4

2 に答える 2

0

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
于 2013-10-03T06:05:02.710 に答える
0

答え

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 準拠を懸念している場合は、利用できない可能性があることに注意してください。

于 2013-10-03T19:19:17.317 に答える