Що означає команда lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Видалено \) $ / {printf "> / proc /% s / fd /% d \ n", $ 2, $ 4}' маю на увазі


9

Я читаю деякі статті і бачив цю команду:

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

Чи міг би якийсь орган допомогти мені зрозуміти це


+1 і улюблене, оскільки це цікаве питання. :-)
Лоренцо Анкора

Відповіді:


7

Ця команда буде друкувати файли з lsofпотрібного усікання.

(Він фактично не видаляє і не врізає жодні файли).

lsof поверне список відкритих файлів (дескрипторів файлів), які прокладені в awk, який обробляє його наступним чином.

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

Вищенаведений вираз містить два регулярні вирази, розділені крапкою з двокрапкою ;

давайте розглянемо першу частину gawk '$4~/txt/{next};

Тут, якщо 4-е поле містить, txtбуде прочитаний наступний рядок тексту, який сценарій почне обробляти з початку знову.

У nextзаяві сили AWK негайно припинити обробку поточного запису і перейти до наступного запису. Це означає, що подані правила не виконуються для поточного запису, а решта дій поточного правила не виконується.

Тепер розглянемо другу частину сценарію /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Тут, якщо рядок відповідає регулярному виразу /REG.*\(deleted\)$( $засоби, які (deleted)мають бути останнім словом у рядку), він просто надрукує >/proc/%s/fd/%d\n", $2,$4.

У команді lsof $4- це номер дескриптора файлу (наприклад 53w, wзасіб відкриття файлу для запису) або тип файлу, залежно від файлу. %dУ printfгарантує , що тільки номери будуть роздруковані, видалення будь-яких текстових символів (на кшталт w). $2друкує ідентифікатор процесу, який використовує файл, щоб він надрукував щось подібне >/proc/3989/fd/53і так далі він буде друкувати всі файли, які були видалені, але дескриптор файлу залишається відкритим, іншими словами, дескриптори файлів, які можна безпечно усікати.


2

Ця команда скоротить видалені файли з lsof.

Першим буде список відкритих файлівlsof

потім шукайте рядки рекурсивно один, а потім той, {next}який містить REG '$4~/txt/{next};/REG.*\(deleted\)$/як четвертий параметр, тоді цей процес відносно цього рядка буде видалений

а потім надрукувати всі результати без рядків, що містять REG і позначених як видалені.{printf ">/proc/%s/fd/%d\n", $2,$4}'


Я думаю, ви повинні пояснити різні частини команди (принаймні, щоб отримати мою підсумку).
don.joey

перевірити моє оновлення

1
Коли AWK заяву з регулярним виразом і печаткою staement початку усічення фактичної contents.You необхідності передати цю команду до shдля фактичного усічення і Morever є два регулярні вирази не один , як у вашому поясненні
Stormvirux
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.