2017-05-29 74 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/