Answers:
该命令将打印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打印使用该文件的进程的进程ID,这样它将打印类似的内容>/proc/3989/fd/53,依此类推,它将打印所有已删除但其文件描述符保持打开状态的文件,换句话说,可以安全地截断的文件描述符。
此命令将截断lsof中已删除的文件。
这首先将列出打开的文件lsof
然后递归搜索行,然后搜索{next}包含REG '$4~/txt/{next};/REG.*\(deleted\)$/作为第四个参数的行,然后将删除相对于此行的此过程
然后打印所有结果,但不包含包含REG并标记为已删除的行。{printf ">/proc/%s/fd/%d\n", $2,$4}'
sh实际截断和morever有两个正则表达式有没有一个在你的解释