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

时间:2013-01-11 10:57:28

标签: bash shell awk

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

uptime | awk '{print $3}'

运行时,我得到了这个结果:8:27,

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

5 个答案:

答案 0 :(得分:9)

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

# "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个用户”显示了什么?如果我们知道所有答案,我们是否要依赖它们?

如果我们的目的是向用户显示正常运行时间,则使用正则表达式在“向上”和“用户”之间提取部分可以解决问题:

uptime | sed 's/^.*up\(.*\), *[0-9]\+ *users.*$/\1/'

如果我们想比较时间或收集统计信息,那么特定于Linux的/proc/uptime之类的内容会更好(/proc/uptime中的第一列是原始运行时间秒)。

答案 1 :(得分:7)

你几乎拥有它,只有substrgsub函数awk

$ uptime | awk '{print substr($3,1,length($3)-1)}'
2:49

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

无需过多的管道或不正确使用反推。

使用(GNU) uptime给出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     

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

我假设这也处理多年了!

答案 2 :(得分:4)

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

答案 3 :(得分:2)

给出@ sudo_O的样本正常运行时间输出(谢谢!):

$ cat file
12:46:18 up 92 days,  5:00,  2 users,  load average: 0.00, 0.01, 0.05
12:47:30 up  4:24,  7 users,  load average: 0.34, 0.12, 0.07

$ awk -F'[ ,]+' '{print $3 (/days/?" "$4" "$5:"")}' file
92 days 5:00
4:24

$ sed 's/.*up *\(.*\), *[0-9]* users.*/\1/' file
92 days,  5:00
4:24

答案 4 :(得分:1)

使用sed

uptime | awk '{print $3}' | sed '$ s/,$//'