![如何在 bash 脚本中选择一行的最后一个数字](https://linux22.com/image/49394/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E9%80%89%E6%8B%A9%E4%B8%80%E8%A1%8C%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E6%95%B0%E5%AD%97.png)
我有 smartctl -a 命令的输出;其中一行看起来像这样:
9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 301
我已将其放入 bash 脚本中的变量中(如果这是正确的术语),如下所示:
$SMARTCTL_OUTPUT=`smartctl -a /dev/sda`
我想解析它,以便仅将行末尾的数字返回给变量,因此在上面的示例中301
被放入变量中$POWER_ON_HOURS
。
我尝试过使用 grep:
$SMARTCTL_OUTPUT=`smartctl -a /dev/sda | grep "Power_On_Hours"`
但这会返回9 Power_On_Hours 0x0032 100 100 000 Old_age Always -
我不感兴趣的其他文本 ( )。
我可以只返回行尾的数字吗?
答案1
使用awk '{print $NF}'
就会达到目的。$NF
指最后一个字段。awk是一种用于数据提取的语言。
AWK 程序是一系列模式动作对,写为:
''条件'' { ''行动'' }
awk '{print $NF}'
将始终打印最后一个字段。
答案2
你可以用纯 bash 来做到这一点:
POWER_ON_HOURS=${SMARTCTL_OUTPUT##[^0-9]}
这将返回从 SMARTCTL_OUTPUT 中删除不以数字结尾的最长前缀所产生的字符串。
答案3
我确实非常喜欢 gawk,但是您可以使用更灵活的方法,而无需在系统上安装 (g)awk。将命令的输出存储在 bash 数组中,如下所示(请注意命令周围的反引号):
array=(`smartctl -a /dev/sda`)
然后,您可以通过索引号引用数组中的任何单词(请参阅下面的示例)。
不幸的是,我的系统上没有“smartctl”正在识别的设备。因此,我使用“man uptime”命令的输出作为示例的输入。
array=(`man uptime`)
显示该数组的所有元素:
echo ${array[@]}
UPTIME(1) FreeBSD General Commands Manual UPTIME(1) NAME uptime — show how long system has been running SYNOPSIS uptime DESCRIPTION The uptime utility displays the current time, the length of time the sys‐ tem has been up, the number of users, and the load average of the system over the last 1, 5, and 15 minutes. FILES /boot/kernel/kernel system name list SEE O w(1) HISTORY The uptime command appeared in 3.0BSD. FreeBSD 9.1 April 18, 1994 FreeBSD 9.1
显示特定单词:请注意,数组元素是从零开始计数的。因此,第 7 个单词将被称为“${array[6]}”。
假设您想要检索“man uptime”命令输出的第 19 个和第 17 个单词(即单词“DESCRIPTION”和“SYNOPSIS”)。
echo ${array[18]} ${array[16]}
DESCRIPTION SYNOPSIS
使用用户“Arpith”和“read”的巧妙方法,您还可以将数组元素存储在更容易记住的变量中,例如:
array2=(`ifconfig`)
read IPETH0 IPLO <<< $(echo ${array2[6]} {array2[46]}
echo $IPETH0 $IPLO
192.168.0.103 127.0.0.1
不要搞乱“这一行的最后一个字段”或字符掩码等内容。只需使用位置编号。
数组索引是正整数。因此,您可以在 shell 脚本中进行各种计算来选择特定单词(例如范围或每三个单词或 for 循环...)
华泰
伯尼