我似乎找不到解决方案,这让我发疯。我知道我可以用来awk
打印列。由于我的文件系统的排列方式,我在打印特定列时遇到问题。
这就是我跑步时的情况df
:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vg_root-root
36623968 4484592 30278976 13% /
tmpfs 961312 0 961312 0% /dev/shm
/dev/sda1 516040 102896 386932 22% /boot
如果我awk
对于 1K 块列,由于文件系统位置的长度,它会从其他列返回值。基本上会发生这种情况:
1K-blocks
4484596
961312
516040
如何列出正确的列信息?
答案1
如果您要通过管道df
进入awk
,df -P
请改为使用管道。它被设计为易于解析,特别是不会断行。请记住跳过标题行 ( NR >= 2
)。
如果您需要解析一些带有奇怪换行符的现有输出,您可以告诉一个续行,因为它以空格开头。
awk '
NR==1 {next}
/^ / {print $1}
!/^ / {print $2}
'
但请注意,有一些 UNIX 变体(至少是 OSX,如果它是实践中唯一发生这种情况的变体,我不会感到惊讶),其中文件系统名称可以包含空格,这使得任何基于列的解析都会出现问题(不幸的是, ,df -P
不使用制表符)。
答案2
我没有非常长的 FS 名称,但您可以尝试以下操作:
df |grep "%" |grep -v Use |awk {'print $(NF-4)'}
这是假设您不需要带有 1K 块的标题行。
答案3
df -Pk|tail -n +2|column -t | awk '{print $4}'
df -Pk
:将列出文件系统。tail -n +2
: 将删除标题。column -t:
用于格式化输出。awk '{print $4}'
:将打印第四列的内容。
答案4
使用 GNU df
,您可以使用该-P
标志并将其通过管道传输到awk
其他答案中的建议。一个简单明了的例子:对于您想要可用千字节数 ( df -k
) 的情况,以下方法可以正常工作:
df -kP | awk 'NR>1 {print $4}'
这告诉 awk 打印第一列之后所有行的第四列(即不是标题行)。
无论如何,添加这个答案的主要原因是观察到在 Solaris 上(在 Solaris 9 和 10 上检查过),尽管输出格式中有类似的换行符,但实际上并不需要此标志;在这种情况下,将进行以下工作:
df -k | awk 'NR>1 {print $4}'