Я читаю несколько статей, и я видел эту команду:
lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Может ли какое-то тело помочь мне понять это
command-line
Braiam
источник
источник
Ответы:
Эта команда будет печатать файлы с
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
и поэтому он будет печатать все файлы, которые были удалены, но чей дескриптор файла остается открытым, другими словами, дескрипторы файлов, которые можно безопасно обрезать.источник
Эта команда будет обрезать удаленные файлы из lsof.
Эта первая будет список открытых файлов
lsof
затем искать строки рекурсивно одну, затем одну
{next}
, содержащую REG'$4~/txt/{next};/REG.*\(deleted\)$/
в качестве четвертого параметра, тогда этот процесс относительно этой строки будет удалена затем выведите все результаты без строк, содержащих REG и помеченных как удаленные.
{printf ">/proc/%s/fd/%d\n", $2,$4}'
источник
sh
для фактического усечения, и более того, там есть два регулярных выражения, а не одно, как в вашем объяснении