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 txtthì 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 nextlự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 $4là số mô tả tập tin (ví dụ 53w, các wphươ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 %dtrong 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). $2in 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/53vậ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}'
shcắ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