You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为lsof -nPs输出中的空字段填充占位值?

如何为lsof -nPs输出中的空字段填充占位值?

我正在执行命令lsof -nPs,其输出如下:

COMMAND PID TID USER FD TYPE DEVICE SIZE NODE NAME
systemd 1  root cwd DIR 253,0 4096 128 /
docker-co 10166 10173 root 0r CHR 1,3 1028 /dev/null
sshd 10592  root mem REG 253,0 263800 67353392 /usr/lib64/security/pam_systemd.so
sshd 10592  root DEL REG 0,5 21551641 /dev/zero
sshd 10592  root 0u CHR 1,3 1028 /dev/null

请问是否有办法为输出中的空字段填充占位值?例如为缺失的字段内容设置替代值。


当然有办法啦!你可以借助awk这个强大的文本处理工具,轻松给空字段批量填充自定义占位符,下面是几个实用的方案:

方案1:快速替换所有空字段为指定占位符

这个命令会遍历每一行的所有字段,把空字段替换成-(你可以改成N/A或其他你想要的占位符):

lsof -nPs | awk '{for(i=1;i<=NF;i++) if($i=="") $i="-"; print}'

执行后你的输出会变成类似这样:

COMMAND PID TID USER FD TYPE DEVICE SIZE NODE NAME
systemd 1 - root cwd DIR 253,0 4096 128 /
docker-co 10166 10173 root 0r CHR 1,3 1028 /dev/null
sshd 10592 - root mem REG 253,0 263800 67353392 /usr/lib64/security/pam_systemd.so
sshd 10592 - root DEL REG 0,5 21551641 /dev/zero
sshd 10592 - root 0u CHR 1,3 1028 /dev/null

方案2:保持列对齐的格式化替换

如果你想保留原lsof输出的列对齐样式,同时替换空字段,可以用printf来定义每列的宽度:

lsof -nPs | awk '
    BEGIN {
        # 根据你的lsof输出调整每列的宽度(可按需修改)
        col_widths[1]=10; col_widths[2]=6; col_widths[3]=6; col_widths[4]=8;
        col_widths[5]=4; col_widths[6]=5; col_widths[7]=8; col_widths[8]=8;
        col_widths[9]=6; col_widths[10]=40
    }
    {
        for(i=1;i<=NF;i++) {
            if($i == "") $i = "N/A"  # 这里设置你想要的占位符
            printf "%-*s", col_widths[i], $i
        }
        print ""
    }'

这个方案会让输出更整齐,和原格式风格一致,同时空字段会被替换成你指定的内容。

方案3:针对特定列替换

如果你只想替换某几列的空字段(比如只处理TID列),可以指定列索引来处理:

lsof -nPs | awk '{if($3=="") $3="-"; print}'

这里的$3对应输出中的第3列(TID列),执行后只会给缺失的TID字段填充-,其他空字段保持不变。

内容的提问来源于stack exchange,提问作者Jay Joshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:19:00