如何用awk从HP UNIX文件中提取指定模式关联的可变长度数字?
使用AWK从HP-Unix文件中提取可变长度数字
没问题,针对你在HP-Unix环境下的需求,我来给你几个实用的awk方案——完美适配你提到的场景:从带(X rows)格式的文本里提取可变长度的数字,而且完全不需要依赖sed/grep的高级功能。
核心思路
我们的目标是定位文本中(数字 rows)这个固定模式片段,然后剥离掉非数字部分,提取出里面的数字。下面的方法都是基于awk的基础功能,在HP-Unix的旧版awk环境下也能正常运行。
方案1:遍历字段匹配(最稳妥,适配大多数场景)
如果(X rows)是作为一个独立的字段存在(就像你描述的示例文本那样),这个方法最可靠:
awk '{for(i=1;i<=NF;i++) if($i ~ /^\([0-9]+ rows\)$/) {sub(/^\(/,"",$i); sub(/ rows\)$/,"",$i); print $i}}' your_file.txt
解释:
- 遍历当前行的每一个字段(
NF代表当前行的字段总数) - 检查字段是否严格匹配
^\([0-9]+ rows\)$:也就是以(开头,跟着1个或多个数字,最后以rows)结尾的字段 - 匹配到后,用
sub命令分别去掉开头的(和结尾的rows),剩下的就是我们要的数字,直接打印即可
处理多个文件的话,直接把所有文件名追加到命令后面就行,还可以加上文件名标识方便溯源:
awk '{for(i=1;i<=NF;i++) if($i ~ /^\([0-9]+ rows\)$/) {sub(/^\(/,"",$i); sub(/ rows\)$/,"",$i); print FILENAME ": " $i}}' file1.txt file2.txt *.log
方案2:正则分组捕获(更简洁,需确认awk版本支持)
如果你的HP-Unix awk支持match函数的数组参数(用于捕获分组),可以用这个更简洁的写法:
awk '/\([0-9]+ rows\)/ {match($0, /\(([0-9]+) rows\)/, arr); print arr[1]}' your_file.txt
解释:
- 先筛选出包含
(数字 rows)模式的行 - 用
match函数把括号内的数字捕获到数组arr中,arr[1]就是我们要的数字分组 - 直接打印捕获到的数字即可
方案3:全局遍历替换(适配模式非独立字段的情况)
如果(X rows)和其他文本连在一起(不是独立字段),可以用这个全局遍历的方法:
awk '{while(match($0, /\(([0-9]+) rows\)/)) {print substr($0, RSTART+1, RLENGTH-7); $0=substr($0, RSTART+RLENGTH)}}' your_file.txt
解释:
match函数会定位到第一个匹配的位置,RSTART是匹配起始索引,RLENGTH是匹配的总长度substr($0, RSTART+1, RLENGTH-7):从(的下一个字符开始截取,长度为总匹配长度减去(和rows)的7个字符,刚好取出数字- 把已处理的部分从原行中移除,循环处理下一个匹配(你提到模式是唯一的,所以循环只会执行一次)
以上几个方法都完全基于awk的基础功能,在HP-Unix环境下应该都能正常工作,你可以根据自己文件的实际格式选择最合适的方案。
内容的提问来源于stack exchange,提问作者Minsec
相关产品推荐
相关产品推荐

