2017-05-29 49 views
0

我试图以更可解析的方式格式化lsof输出。将lsof输出格式化为可解析结构

背景:由于并非所有打开句柄的进程都具有线程ID,因此不一定会确定由空格(空格AFAIS)分隔的字段数。

作为输出字段,我需要PID,UID /用户名和路径(如果它是一个文件 - 因为+ D非常慢,我在路径上寻找)。

作为字段分隔我从NL切换到NUL(和更换由空“|”为可读性)

所以,我想

> /usr/sbin/lsof -F pnuf0 | sed 's/\x0/|/g' | grep "cvmfs" | tail -n 2 
ftxt|n/usr/bin/cvmfs2| 
fmem|n/usr/lib64/libcvmfs_fuse.so.2.3.5| 

只生成文件描述符和名称(而不是在给定顺序?)但不是PID或UID?

至于侧面说明,PID和UID领域显然已经“空”分别选择他们的时候

> /usr/sbin/lsof -F u0 | sed 's/\x0/|/g' | grep "cvmfs" | tail -n 2 
> /usr/sbin/lsof -F p0 | sed 's/\x0/|/g' | grep "cvmfs" | tail -n 2 
> /usr/sbin/lsof -F n0 | sed 's/\x0/|/g' | grep "cvmfs" | tail -n 2 
    n/usr/bin/cvmfs2| 
    n/usr/lib64/libcvmfs_fuse.so.2.3.5| 

什么是解析为lsof的输出正确的方法“PD,NAME,UID,FILEDESC” ?

回答

0

寻找同样的事情发现,即使我指定-F 0它跨越了几行,这使得lsof的几乎-F选项不可用的拆分结果:

 
# lsof -F pnuf0 /tmp/aaa | tr '\0' '|' 
p19677|u1000| 
f4|n/tmp/aaa| 

该死。 我已经结束使用查找或简单地grep stat -c“%u%N”/ proc/[0-9] /fd/