Shell: 入门Linux

可以把 Linux 的学习过程分成6个阶段,一般来说,每个阶段都需要至少一天以上的学习:

  • 第1阶段:把linux系统玩得跟 Windows 或者 MacOS 那样的桌面操作系统一样顺畅,主要目的就是去可视化,熟悉黑白命令行界面,可以仅仅以键盘交互模式完成常规文件夹及文件管理工作。
  • 第2阶段:做到文本文件的表格化处理,类似于以键盘交互模式完成Excel表格的排序、计数、筛选、去冗余,查找,切割,替换,合并,补齐,熟练掌握awk,sed,grep``这文本处理的三驾马车。
  • 第3阶段:元字符,通配符及 shell 中的各种扩展,从此 linux 操作不在神秘!
  • 第4阶段:高级目录管理:软硬链接,绝对路径和相对路径,环境变量
  • 第5阶段:任务提交及批处理,脚本编写解放你的双手
  • 第6阶段:软件安装及 conda 管理,让 linux 系统实用性放飞自我

仅仅是以自己多年处理生物信息学数据经验给大家总结一下 Linux 该如何学,希望这个给初学者的知识点路线图能帮助到你。可以把Linux的学习过程分成 6 个阶段 ,一般来说,每个阶段都需要至少一天以上的学习:

第一阶段:常规文件夹及文件管理工作

1
2
3
4
5
6
7
8
9
$ ls ## list 列出当前路径下信息
$ pwd ## print working directory 打印工作目录,即当前所在目录
$ cd ## change directory 切换目录
$ mkdir ## make directory建立一个新的目录
$ touch ## 创建文本
$ mv ## Move 更改文件或目录,移动目录或文件
$ rm ## ReMove 删除目录或文件
$ cp ## copy and paste 将给出的文件或目录复制到另一个文件或目录中 tar ## Tape archive 解压文件
$ ln ## LINk 链接文件

比如ls命令,就是lst , 可以列出当前路径下信息,就有大量的参数:

1
2
3
4
5
6
7
8
## 常见参数
-a :全部的目录,连同隐藏文件夹一起列出来
-h :将目录容量转换为以易读的方式(例如 GB, KB 等等)
-l :列出目录的详细信息
-S :以文件大小排序
-t :以时间排序
-R : 递归目录列出文件
-d : 显示目录本身,而非目录下文件

第二阶段:文本文件处理大全

1
2
3
4
5
6
$ head # 功能:显示文档的开头至标准输出中,默认显示十行。
$ tail # 功能:显示文档的末尾至标准输出中,默认显示十行。
$ less # 功能:逐页查看文档内容。
$ more # 也是逐页查看文档内容,跟less类似
$ cat # cat 命令 (concatenate) 查看文本,输出到屏幕
$ tac # tac 命令 反向查看,是cat命令的补充

同样的,每个命令都是有着不同的参数,来扩展它们的功能,比如cat命令就可以加上:

1
2
3
4
5
6
-A:显示全部内容,包括特殊字符,可列出一些特殊字符而不是空白而已; 
-b:列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E:将结尾的断行字符$显示出来;
-n:打印出行号,连同空白行也会有行号,与-b的选项不同:
-T:将[tab]按键以I显示出来;
-v:列出一些看不出来的特殊字符
1
2
3
4
5
6
7
8
9
$ sort #排序, sort lines of text files 对文件的数据进行排序(默认根据ASCII表升序排列)
$ cut # 提取列,可以以列(字段)为单位处理数据
$ wc # 计数
$ grep # 筛选
$ uniq # 去冗余
$ grep # 查找
$ awk # 切割
tr,sed # 替换
cat, paste # 合并,补齐

初学者需要花费时间和精力来体验它们的各种参数效果。比如grep就可以进行查找和筛选,提供它这些功能的参数主要是:

1
2
3
4
5
6
-v ## 逆向匹配
-w ## 匹配上整个words
-B ## 输出匹配行之前的指定的行数 -A ## 输出匹配行之后的指定的行数 -E ## 指定支持扩展表达式
-C ## 对匹配到的行计数
-n ##输出计数后的一行
-o ## -n形式输出匹配的内容

值得一提的是,grep,awk,sed被我称为 linux 下的文本处理三驾马车,其中awksed命令, 还专门有一个 400 页的书籍来进行讲解,这里就不强调大家称为两个命令高手了,一定要是有需求再学习,但是需要对它有一定的基础认知,做到随学随用!

第三阶段:元字符,通配符及shell中的各种扩展

瞬间生成 1000 个文件夹

1
$ mkdir -p dir{1..1000}

这里就是{1..100}语法,是 shell 的扩展,shell 扩展有以下几种,并按以下顺序处理,当然如果没找到匹配的扩展格式,那就不处理

  • brace expansion 大括号({})扩展
  • tilde expansion ~字符扩展
  • parameter and variable expansion 参数和变量扩展
  • arithmetic expansion 算术扩展
  • command substitution 命令替换
  • process substitution 过程替换
  • word splitting
  • Filename Expansion 通配符扩展

以上扩展中,只有 brace expansion,word splitting,filename expansion 三种扩展可以改变 token 个数,我们演示的{1..100}语法就是这个大括号扩展(brace expansion)的序列输出功能,其中两个点是进行序列输出,然后外面套的大括号是进行扩展,这样我们就一下子新建了成百上千个文件夹。

linux shell 通配符(wildcard),实际上就是一种 shell 实现的路径扩展功能,就是前面提到的 Filename Expansion 通配符扩展。在 通配符被处理后, shell 会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

shell常见通配符不多,如下图:
TIM截图20190929122831

加快效率的最后一个必备知识点就是shell元字符(特殊字符 Meta),就是一系列自己的其他特殊字符。比如我们在演示 cd 这个命令的时候,提到过一系列高级操作,如下:

1
2
3
4
5
6
7
$ cd  ## 回到用户家目录
$ cd ~ ## 回到用户家目录
$ cd - # 回到前个目录
$ cd .. ## 切换到上层目录,相对路径
$ cd ../.. ## 切换到上上层目录
$ cd / ## 切换到根目录
$ cd /teach/ ## 切换到根目录下的teach,绝对路径

这里面的特殊字符就是shell元字符啦,还有一系列其它 shell 元字符,如下表:
character

熟练掌握这些特殊字符,就可以很容易看懂大神那些看起来是鬼画符一样的NGS流程啦,比如:
shortcut

第四阶段:高级目录管理

主要是理解软硬链接,绝对路径和相对路径,环境变量这些概念。

type命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。主要的命令类型:

  • alias:别名。
  • keyword:关键字,Shell 保留字。
  • function:函数,Shell 函数。
  • builtin:内建命令,Shell 内建命令。
  • file:文件,磁盘文件,外部命令。
  • unfound:没有找到。

你会发现很多命令,都存在于下面的目录:

1
2
3
4
5
6
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin

如果你 echo $PATH 就能发现这些目录都是存储在 PATH 这个变量,在 shell 里面的变量需要使用 这个美元符合来进行标识。这个 PATH 变量就是我们的环境变量啦,掌握它是 linux 的一个分水岭,我们生物信息学领域大名鼎鼎的 conda 软件,就是通过修改你的环境变量PATH值来进行软件管理。

不仅仅是PATH,linux 系统还预设了大量的变量,大全如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$SHELL     默认Shell 
$HOME 当前用户家目录
$IFS 内部字段分隔符
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 当前用户ID
$USER 当前用户
$HISTSIZE 历史命令大小,可通过HISTTIMEFORMAT变量设置命令执行时间
$RANDOM 随机生成一个0至32767的整数
$HOSTNAME 主机名

$0:保存当前程序或脚本的名称
$*:保存传递给脚本或进程的所有参数
$$:当前进程给脚本的PID号
$!:后台运行的最后一个进程的PID号
$?:用于返回上一条命令是否成功执行。如果成功执行,将返回数字0,否则返回非零数字(通常情况下都返回数字1)。
$#:用于保存脚本的参数个数
  • 绝对路径:从根目录 / 开始,用 / 隔开的各级目录,例如 /home/vip1 这个目录。
  • 相对路径:目标目录相对于当前目录的位置。主要是活学活用 . 和 .. 这两个特殊字符。

第五阶段:任务提交及批处理,脚本编写

任务提交在生物信息学领域是一个刚需,因为大量的NGS数据处理流程耗时都很长,如果仅仅是运行命令会面临电脑的命令行交互界面被占用几个小时以上时间,需要提交任务到其它节点,取决于大家的实际计算机资源,或者在单机上面直接提交到后台,就是格式是 nohup(要提交的任务) & , 比如我们提交一个命令:

1
2
3
4
5
6
sleep 100 
# 这个命令提交后系统进入睡眠状态,时间是100秒,它会占用我们的命令行,再输入任何命令也不起作用。
# 我们可以用下面的命令,来把任务提交到后台运行,这样我们就可以继续使用命令行。
nohup sleep 100 &
# 提交任务后可以通过 ps -ef | grep sleep 来查看后台sleep任务的运行情况
# 也可以提供fg等命令把挂在后台的命令拿回来

批处理更多的时候属于编程的概念了,我们前面演示的短小精悍的一句话即可1000个文件夹瞬间生成:

1
$ mkdir -p dir{1..1000}

就是一种批处理的概念,等价于循环,我们这里只推荐大家学习两个语法,for and while:

1
2
$ for i in {1..1000}; do (mkdir -p dir${i}); done 
$ echo {1..1000}|tr ' ' '\n'| while read id; do ( mkdir -p dir${id}); done

第六阶段:软件安装及conda管理

软件安装的规律我总结如下:

conda 的下载和安装见 conda 官网,我们也在生信技能树写过系列推文conda管理生信软件一文就够 , 主要是需要理清楚下面这些概念:

  • miniconda安装
  • miniconda配置镜像
  • 创建小环境
  • 查看小环境
  • 进入小环境
  • 查找软件
  • 安装软件
  • 指定软件安装版本
  • 更新软件
  • 查看已安装软件
  • 退出小环境
  • 移除小环境

大部分人的疑问集中在使用conda安装软件结束后,无法得心应手的管理它们,尤其有些需要调py的一些包的时候,会出错,或者python版本不兼容,在使用软件的时候,软件即会出现异常报错。

转自 - 生信技能树: 生信分析人员如何系统入门Linux(2019更新版)