我正在尝试从bash命令输出中提取一些信息:
uptime | awk '{print $3}'当运行它时,我得到这样的结果:8:27,
如何删除最后一个符号(即逗号)?
发布于 2013-01-11 19:00:40
另一种变体(用cut替换awk和sed ):
# "unnecessary" echo with evil backticks to get rid of extra spaces
echo `uptime|cut -d, -f1'看起来是有效的。直到正常运行时间达到一天(感谢@sudo_O指出)。然后输出格式将包括天数,我们将需要
echo `uptime|cut -d, -f2`(后者是我最初的答案,因为我测试的正常运行时间>24小时)。
UPD:这两种解决方案都不是真的有效:后者打印没有天数的正常运行时间小时数,前者无法提取小时数,因为在没有天数的情况下,它们前面没有逗号分隔符--但答案的其余部分实际上通过这些失败得到了证明。
整个方法容易出错。几个月和几年后会发生什么?(我似乎记得它仍然显示N天,但我可以出错)。如果正常运行时间是本地化的呢?(他们是不是为了现有的脚本而拒绝这么做?)对于1个用户、"1个用户“或"1个用户”,它显示什么?如果我们知道所有的答案,我们还想依赖它们吗?
如果我们的目的是向用户显示正常运行时间,那么使用正则表达式提取“up”和“users”之间的部分可以做到这一点:
uptime | sed 's/^.*up\(.*\), *[0-9]\+ *users.*$/\1/'如果我们想要比较时间或收集统计数据,像特定于Linux的/proc/uptime会工作得更好( /proc/uptime中的第一列是原始正常运行时间秒)。
发布于 2013-01-11 19:08:18
您几乎可以做到这一点,只需要使用awk的substr或gsub函数
$ 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输出
# 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
# 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不到一个小时,输出就不一样了!?
$ 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就可以统治所有人:
$ sed -rn 's/.*up\s+(.*),\s+[0-9]+ users.*/\1/p' file
92 days, 5:00
4:24
11 min
3 min我假设这也能处理几年!
发布于 2013-01-11 19:00:13
uptime | awk '{print $3}' | tr -d ,
https://stackoverflow.com/questions/14276673
复制相似问题