我正在阅读一些文章并且看到了这个命令:
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
,是文件描述符编号(例如53w
,w
表示文件管理器已打开以进行写入)或文件类型,具体取决于文件。%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}'