入力ファイルと同じ名前のファイルに出力が保存される[重複]

入力ファイルと同じ名前のファイルに出力が保存される[重複]

入力ファイルがあり、いくつかのコマンドを実行しますが、出力を入力ファイルと同じ名前で保存したいと思います。

次のコマンドを試しましたが、出力ファイルが空です。

cat file1 | grep "YISHA" > file1

答え1

GNUシステムでは、次のものを使用できますsed(GNU実装):

sed -i -n '/YISHA/p' file1

FreeBSDまたはそれに対応するOS / X:

sed -i '' -n '/YISHA/p' file1

またはsponge以下で使用その他のユーティリティ:

grep "YISHA" file1 | sponge file1

答え2

データを削除すると、ファイル自体に書き込んで後で切り取ることができます。

{
  grep YISHA
  perl -e 'truncate STDOUT, tell STDOUT'
} < file 1<> file

もちろん、ここでは次のことができますperl

perl -ne 'print if /YISHA/; END{truncate STDOUT, tell STDOUT}' < file 1<> file

perl-i内部編集オプションもあります(sedGNUからコピーしたオプション)。

perl -ni -e 'print if /YISHA/' file

ただし、sed同じ名前の新しいファイルを作成しますが、実際にファイルを書き換えることはありません。所定の位置にこれは、ファイルのinode番号とその他の属性がプロセスによって影響を受ける可能性があることを意味します。また、シンボリックリンクも壊れます。

答え3

要求に応じて、シェルは安全な一時ファイルを提供できます。

grep "YISHA" <<IN > file
$(cat file)
IN

fileこれにより、末尾から空白行が削除されます。grep(空白行をpingしない限り関連してはいけません)。これが重要な場合は、コマンド置換の後に行き、echo .最後の行を削除してください。cat

使用できる別のオプションはですdd。たとえば、

seq 5000000 >/tmp/temp
-rw-r--r-- 1 mikeserv mikeserv 38888896 Mar 11 04:20 /tmp/temp

パイプバッファを超えるほど大きなダミーファイルです。

</tmp/temp grep 5\$ |
dd bs=4k of=/tmp/temp conv=notrunc,sync

可能なパイプバッファのサイズを超えたことがわかります。

949+1 records in
950+0 records out
3891200 bytes (3.9 MB) copied, 0.164471 s, 23.7 MB/s

notrunc変換が指定されている場合、dd読み取った内容を書き込む場合を除き、出力ファイルには触れません。seek=必要に応じて、この入力データをファイル内の他のオフセットに配置することもできます。しかし...ファイルはまだ切り捨てる必要があります。最後の入力バッファもフラッシュされたことがわかりますdd。 949+1 件のレコードを読みましたが、950 件のレコードを記録しました。 -dd最後の入力チャンクをnullを使用してフル4kサイズに同期します。(stdioを使用するツールからパイプ入力を受け取るときに合理的なチャンクサイズを選択することが可能な場合が多いです。例えばgrep

だから...

ls -l /tmp/temp; tail /tmp/temp
-rw-r--r-- 1 mikeserv mikeserv 38888896 Mar 11 04:22 /tmp/temp

4999991
4999992
4999993
4999994
4999995
4999996
4999997
4999998
4999999
5000000

作成されたもの以外はまだ同じファイルですdd

しかし...

dd if=/dev/null bs=4k seek=950 of=/tmp/temp

dd...作成された部分まで切り取ることができます...

0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000153783 s, 0.0 kB/s

...何も起こらなかったようですが...

ls -l /tmp/temp; tail /tmp/temp
-rw-r--r-- 1 mikeserv mikeserv 3891200 Mar 11 04:25 /tmp/temp
4999915
4999925
4999935
4999945
4999955
4999965
4999975
4999985
4999995

ddその時間を短縮してください。しかし、実際にはsyncファイルの最後に最後に編集された部分ブロックがあるので...

tail /tmp/temp | wc -c 

2383

...そして最後にはnull値がたくさんあります。

関連情報