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 命令?
您可以使用单个awk:
rpm -qa |
awk -F- '/^kafka_/ && split($2, a, /\./) >= 1 {print a[1] "." a[2]}'
1.0
Run Code Online (Sandbox Code Playgroud)
重构你的代码
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