Что делает команда 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}'

Может ли какое-то тело помочь мне понять это

Braiam
источник
+1 и любимый, потому что это интересный вопрос. :-)
Лоренцо Анкора

Ответы:

7

Эта команда будет печатать файлы с lsofнужным усечением.

(Это на самом деле не удаляет и не усекает файлы).

lsof вернет список открытых файлов (файловых дескрипторов), который передается в awk, который обрабатывает его следующим образом.

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

Вышеупомянутое выражение содержит два регулярных выражения, разделенных точкой с запятой ;

давайте рассмотрим первую часть gawk '$4~/txt/{next};

Здесь, если четвертое поле содержит, 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и поэтому он будет печатать все файлы, которые были удалены, но чей дескриптор файла остается открытым, другими словами, дескрипторы файлов, которые можно безопасно обрезать.

Stormvirux
источник
2

Эта команда будет обрезать удаленные файлы из lsof.

Эта первая будет список открытых файловlsof

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

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


источник
Я думаю, что вы должны объяснить различные части команды (по крайней мере, чтобы получить мой голос).
don.joey
проверьте мое обновление
1
Когда оператор awk с регулярным выражением и оператором печати начали усекать фактическое содержимое. Вам нужно передать эту команду shдля фактического усечения, и более того, там есть два регулярных выражения, а не одно, как в вашем объяснении
Stormvirux,