lsof | gawk'$ 4〜/ txt / {next}; / REG。* \(deleted \)$ / {printf“> / proc /%s / fd /%d \ n”,$ 2,$ 4}'命令做什么意思


9

我正在阅读一些文章,并且看到了以下命令:

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

可以帮我理解一下吗


+1和最爱,因为这是一个有趣的问题。:-)
Lorenzo Ancora 2014年

Answers:


7

该命令将打印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中,取决于文件,文件描述符号(例如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}'


我认为您应该解释命令的不同部分(至少得到我的认可)。
don.joey 2014年

检查我的更新

1
什么时候用正则表达式,并开始截断实际contents.You需要打印staement一个awk语句,此命令传递给sh实际截断和morever有两个正则表达式有没有一个在你的解释
Stormvirux
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.