首页 > 解决方案 > AWK 有助于减少一些价值

问题描述

在变量中,值可以是:

ab_5.6.533.162665_84.kn or ab_5.6.550_prod342.6.165834_84.kn

值 162665 可以更改。模式将保持不变:ab_5.6.533.162665_84.kn 或 ab_5.6.550_prod342.6.165834_84.kn .. 无论如何我只想要最后一个倒数第三个值.. 就像在这种情况下 162665 。所以问题是获取ab_5.6.533./ab_5.6.550_prod342.6之间的值。和 _84.kn 在这里是 162665

我总是想抓住(倒数第三个)“165834”这个值..任何帮助将不胜感激

简而言之,我需要一个在这两种情况下都有效的命令。

我使用 cut,但它适用于一种情况,不适用于其他情况

root:~# cat abc.log  | cut -d '.' -f 4
162665_84
6
root:~# 

cat abc.log 
ab_5.6.533.162665_84.kn
ab_5.6.550_prod342.6.165834_84.kn

标签: linuxawk

解决方案


鉴于:

$ echo "$s"
ab_5.6.533.162665_84.kn
ab_5.6.550_prod342.6.165834_84.kn

如果感兴趣的领域是倒数第二个,您可以执行以下操作:

$ echo "$s" | awk -F "[._]" '{print $(NF-2)}'
162665
165834

或者,sed如果它是以下字段,则可以使用.[0-9]+_

$ echo "$s" | sed -nE 's/.*[.]([0-9][0-9]*)_.*$/\1/p'
162665
165834

或者您可以使用rev,以便您可以使用cut来倒数计算字段:

$ echo "$s" | rev | cut -d _ -f 2 | cut -d . -f 1 | rev
162665
165834

但我不得不承认你所追求的并不完全清楚。


推荐阅读