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

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

我正在阅读一些文章并且看到了这个命令:

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

有人能帮我理解吗

答案1

此命令将打印lsof需要截断的文件。

(实际上不会删除或截断任何文件)。

lsof将返回打开的文件(文件描述符)列表,该列表通过管道传输到 awk 中,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,是文件描述符编号(例如53ww表示文件管理器已打开以进行写入)或文件类型,具体取决于文件。%d中的printf确保只打印数字,删除任何文本字符(如w)。$2打印使用该文件的进程的进程 ID,因此它将打印类似 等的内容。它将>/proc/3989/fd/53打印所有已删除但其文件描述符仍处于打开状态的文件,换句话说,可以安全截断的文件描述符。

答案2

此命令将从 lsof 中截断已删除的文件。

首先将列出打开的文件lsof

然后递归搜索每行,{next}如果每行包含 REG'$4~/txt/{next};/REG.*\(deleted\)$/作为第四个参数,则删除与此行相关的进程

然后打印所有不包含 REG 并标记为已删除的行的结果。{printf ">/proc/%s/fd/%d\n", $2,$4}'

相关内容