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

Nic*_*SIN 8 command-line bash

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

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

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

我知道我可以使用一些剪切命令或其他东西,但是例如,如果尺寸发生变化,它将不再起作用。

我也有关于使用正则表达式或其他东西的想法,但我想要最推荐的方法。

提前致谢!

nor*_*raj 8

编辑答案

正如@kevin 所说,您可以使用awk仅选择最后一行并通过使用完全避免使用 tailEND并且如果您想一次打印两列,您可以这样做:

df /dev/sdb1 | awk 'END {print $2,$5}'
1952971772 74%
Run Code Online (Sandbox Code Playgroud)

原答案

您只能选择第二列:

$ df /dev/sdb1 | tail -1 | awk '{print $2}' 
1952971772
Run Code Online (Sandbox Code Playgroud)

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

  • awk 将最后一行保留在 `END` 块中,因此不要使用 `tail`,只需使用 `awk 'END { print $2,$5}'` (3认同)

Rin*_*ind 6

$ df /dev/sdb1 | awk '{ print $5 }' | tail -n 1
Run Code Online (Sandbox Code Playgroud)

对于百分比和

$ df /dev/sdb1 | awk '{ print $2 }' | tail -n 1
Run Code Online (Sandbox Code Playgroud)

对于尺寸。

没有tail

df /home | awk 'NR==2 { print $2 }'
df /home | awk 'NR==2 { print $5 }'
Run Code Online (Sandbox Code Playgroud)
  • awk '{ print $2 }'
    获取第二列,其中多个分隔符计为 1。因此,对于您的系统,对于命令的第一部分,第二列始终相同。

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

  • awk 将最后一行保留在 `END` 块中,因此不要使用 `tail`,只需使用 `awk 'END { print $2,$5}'` (3认同)