首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bash:如何删除最后一个符号

bash:如何删除最后一个符号
EN

Stack Overflow用户
提问于 2013-01-11 18:57:28
回答 5查看 423关注 0票数 4

我正在尝试从bash命令输出中提取一些信息:

代码语言:javascript
运行
复制
uptime | awk '{print $3}'

当运行它时,我得到这样的结果:8:27,

如何删除最后一个符号(即逗号)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-11 19:00:40

另一种变体(用cut替换awksed ):

代码语言:javascript
运行
复制
# "unnecessary" echo with evil backticks to get rid of extra spaces
echo `uptime|cut -d, -f1'

看起来是有效的。直到正常运行时间达到一天(感谢@sudo_O指出)。然后输出格式将包括天数,我们将需要

代码语言:javascript
运行
复制
echo `uptime|cut -d, -f2`

(后者是我最初的答案,因为我测试的正常运行时间>24小时)。

UPD:这两种解决方案都不是真的有效:后者打印没有天数的正常运行时间小时数,前者无法提取小时数,因为在没有天数的情况下,它们前面没有逗号分隔符--但答案的其余部分实际上通过这些失败得到了证明。

整个方法容易出错。几个月和几年后会发生什么?(我似乎记得它仍然显示N天,但我可以出错)。如果正常运行时间是本地化的呢?(他们是不是为了现有的脚本而拒绝这么做?)对于1个用户、"1个用户“或"1个用户”,它显示什么?如果我们知道所有的答案,我们还想依赖它们吗?

如果我们的目的是向用户显示正常运行时间,那么使用正则表达式提取“up”和“users”之间的部分可以做到这一点:

代码语言:javascript
运行
复制
uptime | sed 's/^.*up\(.*\), *[0-9]\+ *users.*$/\1/'

如果我们想要比较时间或收集统计数据,像特定于Linux的/proc/uptime会工作得更好( /proc/uptime中的第一列是原始正常运行时间秒)。

票数 9
EN

Stack Overflow用户

发布于 2013-01-11 19:08:18

您几乎可以做到这一点,只需要使用awksubstrgsub函数

代码语言:javascript
运行
复制
$ uptime | awk '{print substr($3,1,length($3)-1)}'
2:49

$ uptime | awk '{sub(/,/,"");print $3}'
2:49

不需要多余的管道或不正确地使用反标记。

更好但更健壮的解决方案是使用(GNU) grep -Po "\d{1,2}:\d{2}(?=,)"给出不同的uptime输出

代码语言:javascript
运行
复制
# More than one day    
$ uptime
12:46:18 up 92 days,  5:00,  2 users,  load average: 0.00, 0.01, 0.05
$ uptime | grep -Po "\d{1,2}:\d{2}(?=,)"
5:00

# Less than one day
$ uptime
12:47:30 up  4:24,  7 users,  load average: 0.34, 0.12, 0.07       
$ uptime | grep -Po "\d{1,2}:\d{2}(?=,)"
4:24     

或使用sed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p

代码语言:javascript
运行
复制
# More than one day
$ uptime
12:54:00 up 92 days,  5:07,  2 users,  load average: 0.03, 0.02, 0.05
$ uptime | sed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p'
5:07

# Less than one day 
$ uptime
12:54:55 up  4:31,  7 users,  load average: 0.07, 0.10, 0.08
$ uptime | sed -rn 's/.*([0-9]{1,2}:[0-9]{2}),.*/\1/p'
4:31

更新:,所以如果uptime不到一个小时,输出就不一样了!?

代码语言:javascript
运行
复制
$ uptime
14:46:03 up 3 min,  4 users,  load average: 0.54, 0.75, 0.36

$ uptime
14:53:40 up 11 min,  4 users,  load average: 0.48, 0.62, 0.46

一个regexp就可以统治所有人:

代码语言:javascript
运行
复制
$ sed -rn 's/.*up\s+(.*),\s+[0-9]+ users.*/\1/p' file
92 days,  5:00
4:24
11 min
3 min

我假设这也能处理几年!

票数 7
EN

Stack Overflow用户

发布于 2013-01-11 19:00:13

uptime | awk '{print $3}' | tr -d ,

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14276673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档