1. 问题背景与现象描述
最近在分析服务器性能数据时,遇到了一个看似简单却令人困惑的问题:当我尝试用sort命令对包含百分比的数值进行排序时,结果完全不符合预期。作为一名运维工程师,这类数据处理本应是基本功,但这次经历让我深刻认识到,即使是基础工具的使用也藏着不少学问。
具体场景是这样的:我需要从top命令的输出中提取CPU使用率最高的5个进程。按照常规思路,先用awk提取关键字段,再用sort排序,最后用head取前几条记录。老师的示例代码是这样的:
bash复制awk 'NR>7 {
printf "%-8s %-15s %6.1f%%\n", $1, $12, $9
}' top_output.txt | sort -k3 -rn | head -5
理论上,sort -k3 -rn应该按照第三列的数字值降序排列。但实际运行后发现,输出结果明显是乱序的——CPU使用率高的进程并没有排在前面。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题排查过程
2.1 初步验证数据格式
首先我怀疑是原始数据格式有问题,于是先检查awk提取后的数据:
bash复制awk 'NR>7 {print $1, $12, $9}' top_output.txt
输出看起来完全正常:
code复制1234 mysqld 45.2
2345 java 23.4
3456 httpd 12.8
4567 redis-server 8.9
5678 dockerd 5.6
数据格式很干净,都是"PID 进程名 CPU使用率"的结构,数值也没有异常。这让我更加困惑了。
2.2 创建简化测试用例
为了缩小问题范围,我创建了一个更简单的测试文件:
bash复制cat > test_sort.txt << 'EOF'
A 10%
B 5%
C 20%
D 15%
EOF
然后尝试排序:
bash复制sort -k2 -rn test_sort.txt
期望结果是C(20%)排第一,但实际却是A(10%)排在了第一位。这证实了问题确实存在,而且与原始数据无关。
2.3 关键发现:百分比符号的影响
经过反复测试,我意识到问题可能出在百分号(%)上。当数值带有%符号时,sort命令会将其视为字符串而非数字
