我正在编写一个简单的脚本来从acpi
获取电池信息,因此我可以格式化并输出它。
目前,我正在使用cut
来获取此信息,但随着电池状态的变化,cut
无法获取正确的数据,而是会获取一部分字符串而不是电池百分比
运行acpi -b
时,我得到以下输出:
Battery 0: Unknown, 100
有时,如果正在充电或放电,acpi -b
也会返回以下内容或类似内容:
Battery 0: Discharging, 98%, 02:14:14 remaining
因此,在不使用cut
的情况下,我希望能够在第一个逗号之后抓取数据,并且有时在存在时,抓取两个逗号之间的信息。现在,我使用sed从输出中删除空格和百分号。这是命令:
acpi -b | cut -c20-24 | sed 's/ //g;s/%//g'
答案 0 :(得分:2)
您可以使用这个简单的awk命令:
s='Battery 0: Unknown, 100'
awk -F',[[:blank:]]*' '{sub(/%/, "", $2); print $2}' <<< "$s"
100
s='Battery 0: Discharging, 98%, 02:14:14 remaining'
awk -F',[[:blank:]]*' '{sub(/%/, "", $2); print $2}' <<< "$s"
98
awk分手:
-F,[[:blank:]]* # makes comma followed by 0 or more spaces as field separator
sub(/%/, "", $2) # remove trailing %
print $2 # print 2nd field
答案 1 :(得分:0)
使用sed:
$ str1='Battery 0: Unknown, 100'
$ str2='Battery 0: Discharging, 98%, 02:14:14 remaining'
$ sed 's/^[^,]*, \([0-9]*\).*$/\1/' <<< "$str1"
100
$ sed 's/^[^,]*, \([0-9]*\).*$/\1/' <<< "$str2"
98
替换匹配第一个逗号和空格(^[^,]*,
)之前的所有内容,然后捕获任何数字序列(\([0-9]*\)
)并匹配行的其余部分(.*$
) ,然后用捕获的数字代替整行。