bash + 如何从 rpm 捕获版本

jes*_*ica 5 python perl awk grep sed

这是我尝试获取 Kafka 版本时的方式

rpm -qa | grep "^kafka_"
kafka_2_6_5_0_292-1.0.0.2.6.5.0-292.noarch
Run Code Online (Sandbox Code Playgroud)

Kafka 版本是 1.0 ,所以我做了以下操作以削减 Kafka 版本

 rpm -qa | grep "^kafka_" | sed s'/-/ /g' | awk '{print $2}' | cut -c 1-3
 1.0              <-----   results 
Run Code Online (Sandbox Code Playgroud)

上面的 cli 似乎没有那么优雅和冗长的语法

我们能不能做得更好,也许使用 Perl 或 Python one liner 命令?

anu*_*ava 5

您可以使用单个awk

rpm -qa |
awk -F- '/^kafka_/ && split($2, a, /\./) >= 1 {print a[1] "." a[2]}'

1.0
Run Code Online (Sandbox Code Playgroud)


Daw*_*weo 4

重构你的代码

rpm -qa | grep "^kafka_" | sed s'/-/ /g' | awk '{print $2}' | cut -c 1-3
Run Code Online (Sandbox Code Playgroud)

第一步:使用AWK's FS(字段分隔符)代替预处理sed

rpm -qa | grep "^kafka_" | awk 'BEGIN{FS="-"}{print $2}' | cut -c 1-3
Run Code Online (Sandbox Code Playgroud)

第二步:将{print $2}操作注册到与描述匹配的行,而不是使用过滤它grep

rpm -qa | awk 'BEGIN{FS="-"}/^kafka_/{print $2}' | cut -c 1-3
Run Code Online (Sandbox Code Playgroud)

第三步:使用AWK'ssubstr函数代替cut -c

rpm -qa | awk 'BEGIN{FS="-"}/^kafka_/{print substr($2,1,3)}'
Run Code Online (Sandbox Code Playgroud)

免责声明:我的答案假设您想要的行为与原始代码完全相同,即使可能是意外的,即它确实获得版​​本部分的前 3 个字符,无论第二部分中有多少位数字,例如它确实会1.15.0.2.6.5.0-292产生1.1