Điều gì làm lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Đã xóa \) $ / {printfiêu> / Proc /% s / fd /% d \ niêu, $ 2, $ 4}' nghĩa là


9

Tôi đang đọc một số bài báo và tôi đã thấy lệnh này:

lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Một số người có thể giúp tôi hiểu nó


+1 & yêu thích vì đó là một câu hỏi thú vị. :-)
Lorenzo Ancora

Câu trả lời:


7

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.


2

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}'


Tôi nghĩ bạn nên giải thích các phần khác nhau của lệnh (ít nhất là để có được upvote của tôi).
don.joey

kiểm tra cập nhật của tôi

1
Khi nào một câu lệnh awk với regex và một bản in bắt đầu cắt ngắn nội dung thực tế. Bạn cần chuyển lệnh này để 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
Stormvirux
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.