awk 具有意外换行符的特定列

awk 具有意外换行符的特定列

我似乎找不到解决方案,这让我发疯。我知道我可以用来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进入awkdf -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}'

相关内容