命令类似于 head,只不过不是按换行显示输出,而是按空格显示输出

命令类似于 head,只不过不是按换行显示输出,而是按空格显示输出

head例子:

Desktop:  
 λ df -h
Filesystem       Size   Used  Avail Capacity iused    ifree %iused  Mounted on
/dev/disk1s7s1  113Gi  8.9Gi  8.6Gi    51%  355384 90345720    0%   /
/dev/disk1s2    113Gi  3.3Gi  8.6Gi    28%    1743 90345720    0%   /System/Volumes/Preboot
/dev/disk1s4    113Gi   24Ki  8.6Gi     1%       5 90345720    0%   /System/Volumes/VM
/dev/disk1s6    113Gi   63Mi  8.6Gi     1%     660 90345720    0%   /System/Volumes/Update
/dev/disk1s5    113Gi   91Gi  8.6Gi    92%  655534 90345720    1%   /System/Volumes/Data
/dev/disk1s1    113Gi   64Ki  8.6Gi     1%      15 90345720    0%   /Volumes/mnbvcxz    - Data
/dev/disk3s1     58Gi   57Gi  843Mi    99%     209  8636800    0%   /Volumes/Untitled

Desktop:  
 λ df -h | head -n1
Filesystem       Size   Used  Avail Capacity iused    ifree %iused  Mounted on

是否有一个专门的命令可以按空格而不是换行显示字段的输出?

一个 cmd 将会执行该awkcmd 的操作:

Filesystem       Size   Used  Avail Capacity iused    ifree %iused  Mounted on \ 
| awk -F ' ' '{print$1}'
Filesystem

答案1

令人烦恼的是,没有标准命令可以提取由可变数量的空格分隔的列范围,而不会破坏间距:

  • 对于cut -d ' ' -f 1-2,任何单个空格都是分隔符,因此例如" a b"有 4 个字段:"", a, "", b
  • cut -c 1-4只剪切字符,不剪切字段
  • awk '{print $1, $2}'提取由任意数量的空格分隔的字段,忽略前导和尾随字段,因为这是默认情况下的特殊行为FS=" ",但这些字段在输出时由一个空格字符(默认值OFS)分隔。

要提取第一个$n(或最多$n)个字段,同时保留它们之间的空格,使用 GNUgrep或兼容的方法,一种方法是使用:

n=3
grep -Eo "^(\s*\S+){0,$n}"

(注意它会丢弃空行)

现在,请注意,该命令的输出df不遵循允许以这种方式可靠地提取数据的模式,因为字段值本身可以包含空格。例如,请参阅Mounted on标头或某些安装点。另请参阅某些字段如何左对齐和某些字段右对齐。在这种情况下,如果不对字段宽度进行硬编码(cut -c例如使用),就很难提取字段。这也是为什么mlr --pprint cut不能在这里使用的原因。

如果可以的话,最好是告诉生成输出的工具仅打印您想要的列。例如,通过 GNU 实现df,您可以使用:

df -h --output=source,size,used

如果您需要对输出进行后处理,请寻找以可解析格式输出的选项。对于df-P的帮助很小,df的输出无法可靠地进行后处理。

如果在 Linux 上,findmntlsblkGNUstat -f可以输出与可后处理方式相同的信息df(例如,请参阅-J选项如何处理包含无效 UTF-8 字符串的 JSON-c对于stat)

答案2

你似乎正在寻找cut

以你的例子来说,那就是cut -d' ' -f1

相关内容