我正在阅读一些文章,我已经看到了这个命令:
lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Run Code Online (Sandbox Code Playgroud)
一些身体可以帮助我理解它吗
此命令将打印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}'
归档时间: |
|
查看次数: |
697 次 |
最近记录: |