3. BLAST 命令行工具:安装、配置与基本用法

好,到了第三章,我们终于要跟 BLAST 命令行工具正面打交道了。说实话,很多做生信的同学第一次在终端敲命令,心里多少有点发怵。我当年也一样,对着黑乎乎的窗口,不知道该从哪里下手。

别急,这一章我带你走一遍。从安装到跑出第一条比对结果,半小时内搞定。

3.1 安装方式的选择

BLAST 的官方版本是 NCBI 发布的,全称叫 BLAST+。目前主流安装方式有两种:conda 和 手动编译。我个人更推荐 conda,省心。但你若是要在超算上装,或者没联网权限,那就得走手动。

方式一:conda 安装(推荐)

Conda 装 BLAST 是最快的。我记得第一次用 conda 装 BLAST,输完命令泡杯咖啡回来就好了。实际上一两分钟的事。

conda install -c bioconda blast

如果你还没装 conda,先去 https://docs.conda.io 下个 Miniconda。装好之后建个环境,避免跟已有工具冲突:

conda create -n blast_env
conda activate blast_env
conda install -c bioconda blast

验证安装是否成功,跑一句:

blastn -version

# 输出类似这样:
# blastn: 2.15.0+
# Package: blast 2.15.0
我的小习惯:每次建新环境时,我会在名字里带上日期或者用途,比如 blast_202405。这样后续维护起来,哪套环境是干什么的一目了然。

方式二:手动安装

手动安装听起来麻烦,其实也不复杂。你去 NCBI 的 FTP 下载预编译的二进制包就行。项目里我遇到过客户要求离线环境,不联网,conda 用不了,那就只能手动。

# 下载 Linux 64 位的 BLAST+ 二进制包
wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/ncbi-blast-2.15.0+-x64-linux.tar.gz

# 解压
tar -zxvf ncbi-blast-2.15.0+-x64-linux.tar.gz

# 移动到常用目录
mv ncbi-blast-2.15.0+ /opt/

解压后的 bin/ 目录里全是可执行文件。接下来要做的是配置环境变量。

3.2 环境变量配置

BLAST 装好了,但你直接在终端敲 blastn 会提示「command not found」。为什么?系统不知道你把它放哪了。你需要把路径加到 PATH 环境变量里。

打开你的 shell 配置文件。现在大多数 Linux 和 macOS 用 ~/.bashrc 或 ~/.zshrc。我在项目里曾遇到有同事把 PATH 写错了,结果整个系统都炸了……所以这个坑你一定要避开。

# 用 vim 或 nano 打开配置文件
nano ~/.bashrc

# 在文件末尾添加以下内容(路径换成你自己的)
export PATH="/opt/ncbi-blast-2.15.0+/bin:$PATH"

# 保存退出后,使其生效
source ~/.bashrc
注意:$PATH 的位置不要搞反。一定要写成 /path/to/blast/bin:$PATH,而不是 $PATH:/path/to/blast/bin。后者会导致系统命令被你的 blast 目录覆盖,轻则找不到 ls,重则系统崩溃。我曾经亲眼见过因为这个错误,同事的服务器连 sudo 都跑不了。

验证一下是否生效:

which blastn
# 输出:/opt/ncbi-blast-2.15.0+/bin/blastn

另外,BLAST 还有一个重要的环境变量:BLASTDB。它告诉 BLAST 默认去哪找数据库。如果设置了,你跑比对时就不用每次都指定 -db 的全路径。

export BLASTDB="/path/to/your/databases"

3.3 基本用法概览

BLAST+ 工具包里包含很多子程序。你平时用得最多的就这几个:

命令 用途 查询类型
blastn 核酸 vs 核酸 DNA/RNA
blastp 蛋白 vs 蛋白 蛋白质
blastx 核酸翻译后 vs 蛋白 DNA→蛋白
tblastn 蛋白 vs 核酸翻译 蛋白→DNA
tblastx 核酸 vs 核酸(双向翻译) DNA→蛋白→DNA

初学者最容易搞混的是 blastx 和 tblastn。你想想看,前者是你有一段未知的 cDNA,想看看它编不编码已知蛋白;后者是你手里有蛋白序列,想从基因组里找它对应的基因位置。方向反了,结果就是一堆 garbage。

每个命令的参数结构差不多,核心就三个东西:查询文件(query)、数据库(db)、输出格式(outfmt)。

blastn -query my_sequence.fasta -db nt -out result.txt -outfmt 6

这句命令意思:拿 my_sequence.fasta 里的核酸序列,去检索 nt 这个库,输出成表格格式(-outfmt 6),结果存到 result.txt。

你可能注意到了,db 后面只写了个 nt。但你下载的数据库其实是一堆文件,比如 nt.00.nhd、nt.01.nhd……你只需要指定共同前缀就行。BLAST 会自动去找所有 nt.* 文件。

3.4 第一个实战:跑一条blastn

光说不练假把式。我们直接上手跑一次。先准备一个简单的查询序列,假设是从某个细菌里克隆出来的16S rRNA片段。

# 先建一个测试查询文件
echo ">test_16S
AGAGTTTGATCMTGGCTCAGATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAACGGTAACAGGAAGAAGCTTGCTTCTTTGCTGACGAGTGGCGGACGGGTGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGGAAACGGTAGCTAATACCGCATAACGTCGCAAGACCAAAGAGGGGGACCTTCGGGCCTCTTGCCATCGGATGTGCCCAGATGGGATTAGCTAGTAGGTGGGGTAACGGCTCACCTAGGCGACGATCCCTAGCTGGTCTGAGAGGATGACCAGCCACACTGGAACTGAGACACGGTCCAGACTCCTACGGGAGGCAGCAGTGGGGAATATTGCACAATGGGCGCAAGCCTGATGCAGCCATGCCGCGTGTATGAAGAAGGCCTTCGGGTTGTAAAGTACTTTCAGCGGGGAGGAAGGGAGTAAAGTTAATACCTTTGCTCATTGACGTTACCCGCAGAAGAAGCACCGGCTAACTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGAAAGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCGACTTGGAGGTTGTGCCCTTGAGGCGTGGCTTCCGGAGCTAACGCGTTAAGTCGACCGCCTGGGGAGTACGGCCGCAAGGTTAAAACTCAAATGAATTGACGGGGGCCCGCACAAGCGGTGGAGCATGTGGTTTAATTCGATGCAACGCGAAGAACCTTACCTGGTCTTGACATCCACGGAAGTTTTCAGAGATGAGAATGTGCCTTCGGGAACCGTGAGACAGGTGCTGCATGGCTGTCGTCAGCTCGTGTTGTGAAATGTTGGGTTAAGTCCCGCAACGAGCGCAACCCTTATCCTTTGTTGCCAGCGGTCCGGCCGGGAACTCAAAGGAGACTGCCAGTGATAAACTGGAGGAAGGTGGGGATGACGTCAAGTCATCATGGCCCTTACGACCAGGGCTACACACGTGCTACAATGGGCACTACAAAGAGAAGCGACCTCGCGAGAGCAAGCGGACCTCATAAAGTGCGTCGTAGTCCGGATCGGAGTCTGCAACTCGACTCCGTGAAGTCGGAATCGCTAGTAATCGTGGATCAGAATGCCACGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCA" > test_16S.fasta

现在我们随便用个小型数据库来演示。NCBI 提供了很多预构建库,你可以先下载 mini 版的 refseq_rna 来练手:

# 下载小数据库(大约 200 MB,第一次会慢一点)
update_blastdb.pl --decompress refseq_rna

# 跑 blastn
blastn -query test_16S.fasta -db refseq_rna -out test_blast_result.txt -outfmt 6

跑完看看结果文件前几行:

head test_blast_result.txt

# 输出类似这样:
# test_16S	NR_114481.1	98.12	456	8	1	1	456	153	608	1.2e-234	1245
# test_16S	NR_114482.1	97.81	412	7	1	2	413	89	500	3.4e-210	1120

每列含义(-outfmt 6 默认输出格式为标准的 12 列制表符分隔):qseqid、 sseqid、 pident、 length、 mismatch、 gapopen、 qstart、 qend、 sstart、 send、 evalue、 bitscore。

关键解读:
  • 第一行:pident=98.12%,说明比中序列相似度极高。
  • evalue=1.2e-234,极小的 E 值,显著匹配。
  • bitscore=1245,分数越高越好。

3.5 常用参数速查

除了 -outfmt 6,我在项目里最常用的还有这几个参数:

参数 含义 举例
-evalue 设置 E 值阈值,只保留小于该值的比对 -evalue 1e-5
-max_target_seqs 最多保留多少个目标序列 -max_target_seqs 10
-max_hsps 每个目标最多保留几个 HSP -max_hsps 5
-num_threads 使用几个 CPU 线程 -num_threads 4
-outfmt 输出格式(0=普通,6=表格,10=ASN.1) -outfmt 6
我自己的经验:初次比对时,-evalue 别设太严。我一般先用 1e-5,跑完后看结果分布再调。太严的话,可能把真的同源序列也过滤掉了。

3.6 本章知识图谱

下面这张 SVG 图,帮你把 BLAST 命令行工具的核心脉络串起来:

BLAST 命令行安装配置与基本用法流程图 BLAST 命令行工具部署与使用流程 选择安装方式 conda install -c bioconda blast 手动下载二进制包 配置环境变量 export PATH=... & export BLASTDB=... 选择对应子程序 (blastn / blastp / blastx ...) blastn -query query.fa -db db -out result -outfmt 6 核心三要素:查询文件、数据库、输出格式 常用参数:-evalue -max_target_seqs -num_threads 调节敏感度与性能 ⚡ 要点提醒 • conda 装最省事 • PATH 不要写反 • BLASTDB 设默认库 • -outfmt 6 最常用
千万注意:在超算集群上安装时,记得检查管理员是否已经装了 BLAST。进入终端后先敲 module avail blast 或 which blastn。我有个项目,因为没检查,自己装了一份,结果跟系统自带的版本冲突,折腾了两天才排查出来。