
简介本资源为SACSeismic Analysis Code地震数据分析工具的Linux x86_64版本安装包主要面向地震学研究者、地球物理专业学生及需要处理地震波形数据的科研人员。SAC是地震学领域广泛使用的软件支持SAC、MiniSEED、SEED等格式之间的相互转换便于数据在不同分析平台与数据库间流通。压缩包共包含550个文件以m、z、e、n、c、f等源码与头文件为主辅以csh、sh脚本、readme说明文档及makefile编译文件整体约3.59MB解压后可获得完整的SAC程序、库文件与配置脚本。目前已有689人学习下载。借助该资源读者可搭建本地SAC运行环境完成地震数据的格式转换、滤波、谱分析、绘图等常规处理并参考随包文档与示例脚本快速上手适合需要跨格式处理波形数据的研究场景。1. 从 sac-101.5c-linux_x86_64.tar.gz 说起一个地震波形处理工具在 Linux 上的落地路径如果你在地震学、地球物理观测或者结构健康监测领域做过数据处理大概率见过 SAC 这个名字。Seismic Analysis Code一套从上世纪八十年代延续至今的波形分析工具至今仍是很多台网日常处理的首选。而当你从某台老服务器或者内部共享目录里翻出一个叫sac-101.5c-linux_x86_64.tar.gz的文件时问题就来了这东西怎么在当前的 Linux 环境里跑起来它和sac-101.6a-linux又是什么关系本文面向的是手里已经拿到这个 tar.gz 包、需要在 x86_64 Linux 上把它跑通的人。我会把安装路径、环境变量、依赖补齐、版本差异和常见翻车点按实际操作顺序讲清楚让你从解压到能读波形文件全程可复现。2. 解压之前先搞清楚SAC 的目录结构与 Linux 发行版适配2.1 tar.gz 包里到底装了什么拿到sac-101.5c-linux_x86_64.tar.gz之后不要急着tar -zxvf一把梭。先看一眼包内结构这决定了你后面把SACAUX和SAC环境变量指向哪里。# 先列出包内顶层目录不解压 tar -tzf sac-101.5c-linux_x86_64.tar.gz | head -30典型输出会包含sac-101.5c/这样的顶层目录下面分bin/、aux/、inc/、lib/等子目录。bin/里是sac主程序aux/里是台站响应文件、速度模型等辅助数据。有些打包方式会把可执行文件直接放在顶层有些则嵌两层。先看清楚再决定解压目标路径。# 解压到 /opt 下保持目录整洁 sudo mkdir -p /opt/sac sudo tar -zxvf sac-101.5c-linux_x86_64.tar.gz -C /opt/sac --strip-components1--strip-components1的作用是去掉顶层目录把内容直接铺到/opt/sac下。如果你不确定顶层有几层先不加这个参数解压一次看结构再决定要不要重新解。2.2 x86_64 架构与 glibc 版本的隐性约束包名里的linux_x86_64说明这是为 64 位 x86 架构编译的二进制。但“能跑”和“跑得稳”之间还隔着一个 glibc 版本。SAC 101.5c 这个年代的二进制通常链接的是较老的 glibc在 CentOS 7 上一般没问题但在更新的发行版比如 Ubuntu 22.04 及以上上可能遇到GLIBC_2.xx not found的报错。# 查看二进制依赖的动态库 ldd /opt/sac/bin/sac如果输出里有not found项说明缺少对应的共享库。常见缺失的是libX11、libXmMotif和libncurses。在 Debian/Ubuntu 系上补齐sudo apt-get install libx11-6 libxm4 libncurses5 libncurses5-dev在 RHEL/CentOS 系上sudo yum install libX11 libXm ncurses ncurses-devel注意如果你的系统只有libncurses6而没有libncurses5SAC 可能会报找不到libncurses.so.5。这时可以建一个软链接指向libncurses.so.6但要注意 ABI 差异可能导致终端交互异常。更稳妥的做法是从系统仓库里找兼容包。2.3 环境变量SACAUX 和 SAC 的指向逻辑SAC 运行时依赖两个关键环境变量。SACAUX指向辅助数据目录SAC指向可执行文件所在目录。很多新手只加了PATH却忘了设SACAUX结果一读台站文件就报错。# 写入 ~/.bashrc 或 ~/.bash_profile export SAC/opt/sac/bin export SACAUX/opt/sac/aux export PATH$SAC:$PATH改完之后source ~/.bashrc然后验证# 检查环境变量是否生效 echo $SACAUX which sacwhich sac应该输出/opt/sac/bin/sac。如果输出为空说明PATH没写对或者没重新加载配置文件。2.4 验证安装用 sac 读一个示例波形SAC 安装好之后最快的验证方式是进交互模式读一个内置示例文件。# 进入 SAC 交互终端 sac在 SAC 提示符下SAC read /opt/sac/aux/demo/II.SAC SAC plot如果能看到波形窗口弹出或者终端绘图输出说明安装基本成功。如果read报错说找不到文件检查SACAUX是否指向了正确的aux目录。如果plot报错多半是 X11 转发或图形库的问题在无头服务器上可以改用plotr或者直接write成文本格式检查数据。提示在纯 SSH 无图形界面的环境下SAC 的plot命令会失败。这不是安装问题是显示环境缺失。可以用xgterm或者配置 X11 forwarding也可以先用list命令查看头段信息确认数据读取正常。3. 从 101.5c 到 101.6a版本差异与升级决策3.1 两个版本号背后的实际变化标题里同时出现了sac-101.5c-linux_x86_64和sac-101.6a-linux这不是偶然。101.5c 和 101.6a 是 SAC 发展过程中两个常见的发行标记。101.6a 通常修复了 101.5 系列中一些已知的数值计算边界问题并在 I/O 模块上做了调整。但版本号跳跃并不意味着你必须升级——如果你的 101.5c 已经能满足日常的波形读取、滤波和震相拾取升级的紧迫性并不高。真正需要关注升级的场景是你处理的数据格式涉及较新的 SEED 块ette 版本或者你需要用到 101.6a 中新增的transfer函数改进。否则101.5c 在稳定性上反而因为经过更长时间检验而更让人放心。3.2 升级时最容易丢的东西从 101.5c 换到 101.6a 时最容易翻车的地方不是二进制本身而是辅助文件。101.6a 的aux目录结构和 101.5c 有细微差别特别是台站响应文件和速度模型文件的命名规则。如果你直接把旧版的SACAUX指向新版目录某些命令会静默失败——不报错但结果不对。# 对比两个版本的 aux 目录差异 diff -rq /opt/sac-101.5c/aux /opt/sac-101.6a/aux这个命令会列出哪些文件只存在于一边。重点关注.sac和.dat结尾的辅助数据文件。如果差异较大建议保留两套环境用不同的环境变量切换而不是直接覆盖。3.3 多版本共存的目录规划在一台机器上同时保留 101.5c 和 101.6a 是完全可行的关键是目录隔离和切换脚本。# 目录规划示例 /opt/sac/101.5c/bin /opt/sac/101.5c/aux /opt/sac/101.6a/bin /opt/sac/101.6a/aux然后写两个切换函数放到~/.bashrc# 切换到 101.5c sac15() { export SAC/opt/sac/101.5c/bin export SACAUX/opt/sac/101.5c/aux export PATH$SAC:$PATH echo SAC switched to 101.5c } # 切换到 101.6a sac16() { export SAC/opt/sac/101.6a/bin export SACAUX/opt/sac/101.6a/aux export PATH$SAC:$PATH echo SAC switched to 101.6a }这样在终端里敲sac15或sac16就能快速切换。注意每次切换后PATH会叠加长期使用建议在函数里先清理旧的 SAC 路径。3.4 版本选择建议什么场景用哪个场景推荐版本理由日常波形查看与滤波101.5c稳定社区资料多台站响应去除与仪器校正101.6atransfer 函数有修复批量脚本自动化处理101.5c命令行行为更可预测新格式 SEED 数据读取101.6aI/O 模块更新这张表不是绝对的但可以作为一个起步参考。实际选择时先用你的真实数据在两个版本下各跑一遍对比输出结果是否一致。如果一致用哪个都行如果不一致以你的科学目标为准来判断哪个结果更合理。4. 避坑与排查SAC 在 Linux 上最常见的五类翻车4.1 现象执行 sac 报 “cannot execute binary file”原因下载或传输过程中文件损坏或者 tar.gz 包本身不是为当前架构编译的。有些包名写着 x86_64实际内容是 i386 或者 ARM 的。解决先用file命令确认二进制架构。file /opt/sac/bin/sac输出应该包含ELF 64-bit LSB executable, x86-64。如果是ARM aarch64或者32-bit说明包不对需要找对应架构的版本。如果架构正确但仍报错重新下载或重新传输一次传输时用scp或rsync而不是 FTP 文本模式。4.2 现象read 命令报 “cannot open file” 但文件明明存在原因SAC 对路径中的空格和特殊字符处理不好或者SACAUX没设对导致相对路径解析错误。解决先用绝对路径测试。如果绝对路径能读相对路径不能读检查当前工作目录和SACAUX的设置。另外SAC 的read命令对文件名大小写敏感II.SAC和ii.sac是两个不同的文件。4.3 现象plot 命令无反应或报 “X11 error”原因SSH 会话没有 X11 转发或者本地没有运行 X server。解决在 SSH 连接时加-X或-Y参数。Windows 上需要安装 X server 软件如 VcXsrv 或 Xming。如果不想折腾图形界面用plotr输出到文件或者用list查看数据。# 无图形环境下的替代方案 sac SAC read II.SAC SAC list header SAC write alpha /tmp/output.txt4.4 现象滤波结果和预期不符波形像是被“吃掉”了一段原因SAC 的filter命令默认使用递归滤波边缘效应处理方式和某些其他软件不同。如果你不设置passes参数默认单次滤波可能在数据两端产生伪影。解决明确指定滤波参数并在滤波前后检查数据长度。SAC read II.SAC SAC filter bw butter 0.5 2.0 SAC plot如果边缘效应明显可以先用taper命令在两端加窗再滤波。另外注意filter会直接修改内存中的数据如果不想破坏原始数据先copy一份。4.5 现象从 101.5c 换到 101.6a 后同样的脚本输出不同原因两个版本在默认参数上有细微差异特别是transfer和rotate命令的默认行为。解决不要假设版本间行为一致。在升级前用同一组数据在两个版本下跑一遍关键脚本用diff对比输出。如果差异在可接受范围内再切换生产环境。如果差异显著查阅 101.6a 的更新说明确认是 bug 修复还是行为变更。5. 进阶技巧用脚本批量处理波形并做质量检查5.1 批量读取与头段信息导出日常工作中很少只处理一个文件。把 SAC 命令写成脚本批量跑才是正路。下面这个脚本读取一个目录下所有 SAC 文件导出每个文件的头段信息到 CSV。#!/bin/bash # sac_batch_header.sh # 用法./sac_batch_header.sh /path/to/sacfiles /path/to/output.csv SACDIR$1 OUTCSV$2 echo filename,stla,stlo,evla,evlo,dist,az,baz $OUTCSV for f in $SACDIR/*.SAC; do fname$(basename $f) # 用 sac 的 list 命令导出头段再解析 sac EOF read $f list header stla stlo evla evlo dist az baz quit EOF done这个脚本的输出需要进一步解析才能变成规整的 CSV。更高效的方式是用 SAC 的write命令直接输出头段到文件然后用awk处理。# 在 SAC 内部批量导出头段 sac EOF read /data/*.SAC write header /tmp/headers.txt stla stlo evla evlo dist az baz quit EOFwrite header会把所有读入文件的指定头段变量写成一个文本文件每行对应一个文件。这个文件可以直接导入 Excel 或 Python 做后续分析。5.2 用 Python 做波形质量快速筛查SAC 本身不擅长做统计和可视化把数据导出后用 Python 处理更灵活。下面这段代码读取 SAC 文件计算信噪比并标记异常。# sac_qc.py # 依赖pip install obspy numpy from obspy import read import numpy as np import glob def estimate_snr(tr, noise_window5.0, signal_window10.0): 粗略估计信噪比取前 noise_window 秒为噪声之后 signal_window 秒为信号 sr tr.stats.sampling_rate n_noise int(noise_window * sr) n_signal int(signal_window * sr) noise tr.data[:n_noise] signal tr.data[n_noise:n_noise n_signal] rms_noise np.sqrt(np.mean(noise**2)) rms_signal np.sqrt(np.mean(signal**2)) if rms_noise 0: return float(inf) return rms_signal / rms_noise for f in glob.glob(/data/*.SAC): st read(f) for tr in st: snr estimate_snr(tr) flag OK if snr 3.0 else LOW_SNR print(f{f} {tr.stats.station} {tr.stats.channel} SNR{snr:.2f} {flag})这段代码用 ObsPy 读取 SAC 格式计算一个简单的信噪比指标。noise_window和signal_window需要根据你的数据采样率和事件持续时间调整。对于地震事件波形通常噪声窗取 P 波到达前几秒信号窗取 P 波到达后一段。这里为了简化直接用文件开头作为噪声段实际使用时应该结合震相到时。5.3 把 SAC 命令嵌入 Shell 脚本的注意事项在 Shell 脚本里调用 SAC 时最常见的坑是 heredoc 的变量展开。如果你在 EOF里用了$符号Shell 会尝试展开它而 SAC 命令里可能也需要$作为变量前缀。# 错误写法$f 会被 Shell 展开但 SAC 内部的 $ 也会被影响 sac EOF read $f plot quit EOF # 正确写法用 EOF 禁止 Shell 展开然后手动传入文件名 sac EOF read FILE_PLACEHOLDER plot quit EOF更稳妥的方式是把 SAC 命令写成一个独立的.sac脚本文件然后用sac script.sac执行。这样 Shell 和 SAC 的变量作用域完全隔离不容易出玄学问题。5.4 一个我常用的检查习惯每次批量处理完我会随机抽 3 到 5 个文件手动在 SAC 里read然后plot看一眼。脚本跑一万个文件不出错不代表第一万个文件的结果是对的。自动化的效率优势只有在结果可信的前提下才有意义。这个习惯帮我抓到过好几次因为头段变量缺失导致滤波参数被静默忽略的情况——脚本不报错但输出全是错的。希望帮到你。本文还有配套的精品资源点击获取