Do một lỗi ứng dụng chưa được phát hiện, tôi có hàng trăm máy chủ với một đĩa đầy đủ. Có một tệp đã được lấp đầy bằng các dòng trùng lặp, không phải là tệp nhật ký, mà là tệp môi trường người dùng với các định nghĩa khác nhau (vì vậy tôi không thể xóa tệp).
Tôi đã viết một sed
lệnh đơn giản để kiểm tra các dòng được thêm sai và xóa chúng, và kiểm tra nó trên một bản sao cục bộ của tệp. Nó làm việc như dự định.
Tuy nhiên, khi tôi dùng thử trên máy chủ với toàn bộ đĩa, tôi đã gặp phải lỗi gần đây (đó là từ bộ nhớ, không sao chép và dán):
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
Tất nhiên, tôi biết không còn chỗ trống. Đó là lý do tại sao tôi đang cố gắng xóa công cụ! ( sed
Lệnh tôi đang sử dụng sẽ giảm tập tin hơn 4000 dòng xuống còn khoảng 90 dòng.)
sed
Lệnh của tôi chỉ làsed -i '/myregex/d' /path/to/file/filename
Có cách nào tôi có thể áp dụng lệnh này mặc dù đĩa đầy đủ không?
(Nó phải được tự động hóa, vì tôi cần áp dụng nó cho hàng trăm máy chủ như một cách khắc phục nhanh.)
(Rõ ràng là lỗi ứng dụng cần được chẩn đoán, nhưng trong khi đó, các máy chủ không hoạt động chính xác ....)
Cập nhật: Tình huống tôi gặp phải đã được giải quyết bằng cách xóa một thứ khác mà tôi phát hiện ra mình có thể xóa, nhưng tôi vẫn thích câu trả lời cho câu hỏi này , sẽ hữu ích trong tương lai và cho những người khác.
/tmp
là không đi; nó trên cùng một hệ thống tập tin.
Trước khi tôi giải phóng không gian đĩa, tôi đã kiểm tra và phát hiện ra rằng tôi có thể xóa các dòng vi
bằng cách mở tệp và chạy :g/myregex/d
và sau đó lưu thành công các thay đổi với :wq
. Có vẻ như có thể tự động hóa việc này mà không cần dùng đến một hệ thống tệp riêng để giữ tệp tạm thời .... (?)
sed -i
tạo một bản sao tạm thời để hoạt động. Tôi nghi ngờ rằng ed
sẽ tốt hơn cho việc này, mặc dù tôi không đủ quen thuộc để đăng ký một giải pháp thực tế
ed
bạn đang chạy: printf %s\\n g/myregex/d w q | ed -s infile
nhưng hãy nhớ rằng một số triển khai cũng sử dụng các tệp tạm thời giống như sed
(bạn có thể thử busybox ed - afaik nó không tạo tệp tạm thời)
echo
. sử dụng printf
. và thực hiện sed
nối thêm một số char bạn thả ở dòng cuối cùng để bạn có thể tránh bị mất khoảng trống. Ngoài ra, trình bao của bạn cần có khả năng xử lý toàn bộ tệp trong một dòng lệnh. đó là rủi ro của bạn - thử nghiệm đầu tiên. bash
đặc biệt tệ ở điều đó (tôi nghĩ rằng nó sẽ làm w / stack space?) và có thể làm bạn khó chịu bất cứ lúc nào. hai sed
'si khuyến nghị ít nhất sẽ sử dụng bộ đệm ống của hạt nhân để có hiệu quả tốt giữa chúng, nhưng phương pháp này khá giống nhau. điều phụ lệnh của bạn cũng sẽ cắt bớt file
cho dù sed w / in có thành công hay không.
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
và nếu nó hoạt động hãy đọc phần còn lại của câu trả lời của tôi. '