Cat, Grep, Redirect Output Tập tin trống?


8

Tôi vừa mới chạy

cat /opt/webapplications/Word/readme.log | grep -v 'Apple'

và tôi đã nhận được đầu ra trên cli mà tôi đang mong đợi, đó là tất cả các dòng trong readme.logđó không chứa ' Apple' ...

Tiếp theo tôi chạy ...

cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log

Tuy nhiên, /opt/webapplications/Word/readme.loglà trống.

Bất cứ ai có thể giải thích cho tôi tại sao điều này xảy ra, hoặc cách chính xác mà tôi nên đi về điều này?



1
bạn đang cố gắng đọc và viết cùng một tệp và bash quy trình chuyển hướng trước tiên (từ phải sang trái)
aaaaa nói phục hồi Monica

Câu trả lời:


14

Điều này xảy ra bởi vì điều đầu tiên >làm là tạo tệp mà nó muốn ghi vào - và nếu tệp đã tồn tại, nội dung của nó sẽ bị xóa. (Ngoài ra, hoàn toàn không cần sử dụng cattrong câu lệnh của bạn vì nó grephoạt động trên các tệp, không chỉ trên STDIN.)

Cách chính xác để làm điều này là sử dụng một tệp tạm thời để đọc hoặc ghi vào. Vì vậy

cp /opt/webapplications/Word/readme.log /tmp/readme.log
grep -v 'Apple' /tmp/readme.log > /opt/webapplications/Word/readme.log

hoặc là

grep -v 'Apple' /opt/webapplications/Word/readme.log > /tmp/readme.log
mv /tmp/readme.log /opt/webapplications/Word/readme.log

sẽ làm việc


1

Khi thực hiện chuyển hướng vào cùng một tệp ( >), shell có thể tạo / cắt bớt tệp trước khi catlệnh được gọi và đầu vào được đọc (xem: Tại sao không sắp xếp tập tin1> tập tin1 làm việc? ). Nếu bạn muốn lọc tệp, tốt hơn là chuyển hướng đầu ra thành các tệp khác hoặc tránh chuyển hướng, chẳng hạn:

grep -v 'Apple' readme.log | tee readme.log

Cách tốt hơn và an toàn hơn là sử dụng các trình soạn thảo tại chỗ được thiết kế cho loại hoạt động đó, ví dụ:

sed -i '.bak' '/Apple/d' readme.log

hoặc sử dụng ex(một phần của Vim):

ex +g/Apple/d -cwq readme.log

Liên quan:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.