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

9 command-line

我正在阅读一些文章,我已经看到了这个命令:

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

一些身体可以帮助我理解它吗

Sto*_*rux 7

此命令将打印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表示已打开文件管理器进行写入)或文件类型,具体取决于文件。的%dprintf确保只有数字将被打印,除去任何文本字符(如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}'