如何从bash命令获取子字符串


8

给定以下从命令获得的子字符串df /dev/sdb1 | tail -n 1

/dev/sdb1 1952971772 1441131032 511840740 74% /media/kaiman/ShareData

我想从该字符串中提取195297177274%在bash脚本中使用它。

我知道我可以使用一些剪切命令之类的东西,但是例如,如果尺寸改变,它将不再起作用。

我也考虑过使用正则表达式之类的东西,但是我想推荐最推荐的方法。

提前致谢!


2
您是在询问一般情况,还是df特别询问?如果是后者,则可以明确指定特定的输出字段,例如df --output=pcent /dev/sdb1
steeldriver '19

2
cut在行上使用字符位置,这会导致当行长随文件大小的变化而变化时失败。我相信您可以告诉cut您选择以空格分隔的一栏2和一栏5,但是我正在打电话,无法研究并有效地发布答案。
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix空格数可能有所不同,因此很难确定哪个列号是正确的。cut在每个定界符之后将看到一列。
mook765 '19

我认为,两个或更多个连续的空间仍可作为单个空间来描述列
WinEunuuchs2Unix

@ WinEunuuchs2Unix正确:)我手头有一个文本文件中的命令:D
Rinzwind

Answers:


6
$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1

对于百分比和

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1

对于大小。

没有tail

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'

  • awk '{ print $2 }'
    获取第二列,其中多个分隔符计为1。因此,对于系统的第二部分,该命令的第一部分始终是相同的。

  • NR 提供给您正在处理的记录总数或行号。


1
或者,如果您同时需要两者df /home | awk '{print $2; print $5;}'
Videonauth

3
Awk将最后一行保留在代码END块中,因此而不是tail仅使用awk 'END { print $2,$5}'
Kevin

仅供参考,我把您放在Meta中:) meta.askubuntu.com/questions/18584/…–
WinEunuuchs2Unix

8

编辑答案

如@kevin所述,您可以使用awk仅选择最后一行,并通过使用完全避免使用tail,END如果要一次打印两列,则可以执行以下操作:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%

原始答案

您只能选择第二列:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772

其中$2表示TAB分隔列的位置。您可以使用cut它,因为它只处理一次TAB,并且这里有多个TAB用来分隔一列。


3
Awk将最后一行保留在代码END块中,因此而不是tail仅使用awk 'END { print $2,$5}'
Kevin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.