如何为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
相关产品推荐
相关产品推荐

