Câu trả lời:
Lệnh này sẽ in các tập tin từ lsof
đó cần cắt ngắn.
(Nó thực sự không loại bỏ hoặc cắt bớt bất kỳ tập tin nào).
lsof
sẽ trả về một danh sách các tệp đang mở (mô tả tệp) được đưa vào awk để xử lý nó như sau.
gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Biểu thức trên chứa hai biểu thức chính quy cách nhau bởi dấu chấm phẩy ;
hãy xem xét phần đầu tiên gawk '$4~/txt/{next};
Ở đây, nếu trường thứ 4 chứa txt
thì dòng văn bản tiếp theo sẽ được đọc, đoạn script sẽ bắt đầu xử lý lại từ đầu.
Các next
lực lượng tuyên bố awk để ngay lập tức ngừng xử lý kỷ lục hiện tại và tiếp tục ghi tiếp theo. Điều này có nghĩa là không có quy tắc nào nữa được thực thi cho bản ghi hiện tại và phần còn lại của hành động của quy tắc hiện tại sẽ không được thực thi.
Bây giờ hãy xem xét phần thứ hai của kịch bản /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Ở đây nếu dòng khớp với biểu thức chính quy /REG.*\(deleted\)$
( $
có nghĩa là (deleted)
từ cuối cùng trên dòng), thì nó chỉ in >/proc/%s/fd/%d\n", $2,$4
.
Trong lệnh lsof $4
là số mô tả tập tin (ví dụ 53w
, các w
phương tiện filer đã được mở cho văn bản) hoặc filetype, tùy thuộc vào các tập tin. Việc %d
trong printf
đảm bảo rằng chỉ các số sẽ được in, loại bỏ bất kỳ ký tự văn bản nào (như w
). $2
in id quá trình của quá trình sử dụng tệp để nó sẽ in một cái gì đó giống như >/proc/3989/fd/53
vậy và nó sẽ in tất cả các tệp đã bị xóa nhưng mô tả tệp vẫn mở, nói cách khác, mô tả tệp có thể được cắt bớt an toàn.
Lệnh này sẽ cắt bớt các tệp đã bị xóa khỏi lsof.
Đầu tiên này sẽ liệt kê các tệp đang mởlsof
sau đó tìm kiếm các dòng đệ quy một rồi một dòng {next}
chứa REG '$4~/txt/{next};/REG.*\(deleted\)$/
làm tham số thứ tư thì quá trình này liên quan đến dòng này sẽ bị xóa
và sau đó in tất cả các kết quả mà không có dòng chứa REG và được đánh dấu là đã xóa.{printf ">/proc/%s/fd/%d\n", $2,$4}'
sh
cắt ngắn thực tế và hơn nữa có hai biểu thức chính quy không có trong một lời giải thích của bạn