Lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Silindi \) $ / {printf “> / proc /% s / fd /% d \ n”, $ 2, $ 4}' komutu anlamına gelmek


9

Bazı makaleler okuyorum ve bu komutu gördüm:

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

Bazı bedenler onu anlamama yardımcı olabilir mi


+1 ve favori çünkü ilginç bir soru. :-)
Lorenzo Ancora

Yanıtlar:


7

Bu komut, kesilmesi gereken dosyaları yazdırır lsof.

(Aslında herhangi bir dosyayı kaldırmaz veya kesmez ).

lsof aşağıdaki gibi işleyen awk'ye aktarılan açık dosyaların (dosya tanımlayıcıları) bir listesini döndürür.

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

Yukarıdaki ifade, noktalı virgülle ayrılmış iki normal ifade içerir ;

ilk kısmı düşünelim gawk '$4~/txt/{next};

Burada, 4. alan içeriyorsa txt, komut dosyasının en baştan yeniden işlemeye başlayacağı bir sonraki metin satırı okunacaktır.

nextDeyim kuvvetleri derhal işlemi o anki kayıtta durdurmak ve bir sonraki kayda gitmek için awk. Bu, geçerli kayıt için başka kural yürütülmediği ve geçerli kuralın eyleminin geri kalanının yürütülmediği anlamına gelir.

Şimdi betiğin ikinci bölümünü ele alalım /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Burada satır normal ifadeyle eşleşiyorsa /REG.*\(deleted\)$( satırdaki son sözcük olması gereken $araç (deleted)), yalnızca yazdırılır >/proc/%s/fd/%d\n", $2,$4.

Lsof komutunda $4dosya tanımlayıcı numarası (örneğin 53w, disk denetleme dosyasının wyazmak için açıldığı anlamına gelir) veya dosyaya göre dosya türü bulunur. %dİçinde printfsadece sayılar (gibi herhangi bir metin karakterleri kaldırarak, baskılı olmasını sağlar w). $2dosyayı kullanan işlemin işlem kimliğini yazdırır, böylece böyle bir şey yazdırır >/proc/3989/fd/53ve böylece silinmiş ancak dosya tanımlayıcısı açık kalan tüm dosyaları, yani güvenli bir şekilde kesilebilen dosya tanımlayıcılarını yazdırır.


2

Bu komut, silinen dosyaları lsof'tan keser.

Bu ilk önce açık dosyaları listelerlsof

daha sonra dördüncü parametre olarak {next}REG içeren satırları özyinelemeli olarak arayın, ardından '$4~/txt/{next};/REG.*\(deleted\)$/bu satıra göre bu işlem silinir

ve ardından REG içeren satırlar silinmemiş olarak işaretlenmiş tüm sonuçları yazdırın.{printf ">/proc/%s/fd/%d\n", $2,$4}'


Bence komutun farklı kısımlarını açıklamalısınız (en azından benim oyumu almak için).
don.joey

güncellememi kontrol et

1
Ne zaman regex ve gerçek contents.You ihtiyacını kesiliyor başlayan bir baskı staement bir awk deyimi bir bu komutu geçmek vermedi shfiili budamaya ve Morever iki düzenli ifadeler orada açıklama gibi bir tane değil
Stormvirux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.