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 将会执行该awk
cmd 的操作:
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 上,findmnt
和lsblk
GNUstat -f
可以输出与可后处理方式相同的信息df
(例如,请参阅-J
选项如何处理包含无效 UTF-8 字符串的 JSON和-c
对于stat
)
答案2
你似乎正在寻找cut
。
以你的例子来说,那就是cut -d' ' -f1
。