Bash脚本获取2022年世界幸福国家无输出问题排查
问题:提取2022年全球幸福报告前5国家的Bash脚本无输出
我尝试通过curl获取维基百科世界幸福报告的原始数据,编写Bash脚本提取2022年排名前5的全球最幸福国家。以下是我的代码:
#!/bin/bash content=$(curl -s "https://en.wikipedia.org/wiki/World_Happiness_Report?action=raw") lines=$(echo "$content" | grep '^\|' | sed -n '/2022/{n;p;}') top_5=$(echo "$lines" | awk '{print $3}' | sort | head -n 5) echo "$top_5"
但在Ubuntu中运行该脚本时无任何输出,终端显示空白:
....(My computer server).....:~$ bash happy_countriesnew.sh #(I'm expecting there to be a list here) ....(My computer server).....:~$
我期望得到前5的国家列表:
Finland Norway Denmark Iceland Switzerland
问题分析与修复方案
错误点说明
- grep正则无效:原脚本中
grep '^\|'的正则逻辑错误,无法筛选维基百科表格的有效行,应改为匹配以|开头的表格行。 - sed定位逻辑错误:
sed -n '/2022/{n;p;}'仅能打印包含"2022"行的下一行,无法覆盖整个2022年表格的数据块。 - awk列数与排序逻辑错误:维基表格中国家名称是分割后的第三列(而非原脚本的
$3),且表格本身已按排名排序,sort命令会打乱原有顺序,完全多余。
修改后的脚本
#!/bin/bash # 获取维基百科幸福报告原始内容 content=$(curl -s "https://en.wikipedia.org/wiki/World_Happiness_Report?action=raw") # 提取2022年幸福报告表格的前5个国家 echo "$content" | awk ' /2022/ {in_table=1; next} # 定位到2022表格表头,标记进入表格模式 in_table && /^|/ { # 仅处理表格内的行 split($0, cols, /\|/); # 按|分割表格列 if (cols[2] ~ /^[0-9]+/) { # 筛选带排名的有效数据行(排除表头) gsub(/^[[:space:]]+|[[:space:]]+$/, "", cols[3]); # 去除国家名称前后空格 print cols[3] } } in_table && !/^|/ {exit} # 离开表格区域时退出 ' | head -n 5
脚本说明
- 用
awk精准定位2022年表格块:匹配到包含"2022"的行后,进入表格处理模式; - 按
|分割表格行,筛选出带数字排名的有效数据行,排除表头; - 去除国家名称前后的空格,确保输出格式整洁;
- 直接取前5行,得到按排名排序的前5个幸福国家;
- 遇到非表格行时自动退出,避免处理无关内容。
内容的提问来源于stack exchange,提问作者Deezel
相关产品推荐
相关产品推荐

