入力ファイルがあり、いくつかのコマンドを実行しますが、出力を入力ファイルと同じ名前で保存したいと思います。
次のコマンドを試しましたが、出力ファイルが空です。
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
内部編集オプションもあります(sed
GNUからコピーしたオプション)。
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値がたくさんあります。