我正在尝试从bash命令输出中提取一些信息:
uptime | awk '{print $3}'
Run Code Online (Sandbox Code Playgroud)
运行时,我得到这个结果: 8:27,
如何删除最后一个符号(即逗号)?
另一种变体(替换awk和sed使用cut):
# "unnecessary" echo with evil backticks to get rid of extra spaces
echo `uptime|cut -d, -f1'
Run Code Online (Sandbox Code Playgroud)
似乎工作...直到正常运行时间达到一天(感谢@sudo_O指出).然后输出格式将包括天数,我们需要
echo `uptime|cut -d, -f2`
Run Code Online (Sandbox Code Playgroud)
(后者是我最初的答案,因为我测试的正常运行时间> 24小时).
UPD:两种解决方案都没有真正起作用:后者打印正常时间没有天,前者无法提取小时数,因为当没有天时没有逗号分隔符 - 但其余的答案实际上是由那些人证明的故障.
整个方法容易出错.几个月和几年后会发生什么?(我似乎记得它仍然显示N天,但我可以犯错).如果正常运行时间本地化怎么办?(他们是否因为现有脚本而拒绝这样做?)它为1个用户,"1个用户"或"1个用户"显示了什么?如果我们知道所有答案,我们是否要依赖它们?
如果我们的目的是向用户显示正常运行时间,则使用正则表达式在"up"和"users"之间提取部分可以解决问题:
uptime | sed 's/^.*up\(.*\), *[0-9]\+ *users.*$/\1/'
Run Code Online (Sandbox Code Playgroud)
如果我们想比较时间或收集统计信息,那么像Linux一样的东西/proc/uptime会更好(第一列/proc/uptime是原始正常运行时间秒).
你几乎拥有它,只是substr或gsub功能与awk
$ uptime | awk '{print substr($3,1,length($3)-1)}'
2:49
$ uptime | awk '{sub(/,/,"");print $3}'
2:49
Run Code Online (Sandbox Code Playgroud)
无需过多的管道或不正确使用反推.
uptime使用(GNU) 给出不同的输出,更好的是更强大的解决方案grep -Po "\d{1,2}:\d{2}(?=,)":
# 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
Run Code Online (Sandbox Code Playgroud)
或者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
Run Code Online (Sandbox Code Playgroud)
更新:所以如果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
Run Code Online (Sandbox Code Playgroud)
一个regexp统治他们所有人:
$ sed -rn 's/.*up\s+(.*),\s+[0-9]+ users.*/\1/p' file
92 days, 5:00
4:24
11 min
3 min
Run Code Online (Sandbox Code Playgroud)
我假设这也处理多年了!
| 归档时间: |
|
| 查看次数: |
390 次 |
| 最近记录: |