在两个逗号之间抓取数据

时间:2015-08-27 16:35:48

标签: linux bash sed

我正在编写一个简单的脚本来从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'

2 个答案:

答案 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]*\))并匹配行的其余部分(.*$) ,然后用捕获的数字代替整行。