以下内容是参与【生信技能树-全球听第7期】的课程笔记,记录人:小瑛 ,有问题可在公众号后台留言
小白小白,请注意:笔记中出现的所有文件路径,仅作为参考,请勿模仿!
1. 登录服务器
● Mac电脑登录前的设置
对于 Mac pro 来说,经常出现一种情况是 :登录没问题,但是超过 5 分钟不操作就会出现问题,没法输入,不得不重启终端或者 iTerm 。解决方法是:
【1】在mac,打开终端,不要登录服务器
【2】然后在本地运行下面命令
cat >~/.ssh/config
Host *
ServerAliveInterval 120
TCPKeepAlive no
^C # Ctrl + C
● 登录服务器
打开邮箱找到曾老师给大家发的邮件,里面有用户名、密码和ip地址,登录方式为:ssh 用户名@ip地址
,如:
ssh vip28@94.191.82.93
回车,然后输入密码
● 修改命令行配色
复制粘贴下面两行代码:
echo 'export PS1="\[\033]2;\h:\u \w\007\033[33;1m\]\u \033[35;1m\t\033[0m \[\033[36;1m\]\w\[\033[0m\]\n\[\e[32;1m\]$ \[\e[0m\]"' >> ~/.bashrc
source ~/.bashrc
注意:如果管理员没有对你开放修改权限,可能你这次修改之后的内容,下次登录会失效。
● 查看帮助文档
man 命令,help 命令,或者某个命令的 --help 参数
man ls # 用 man 命令查看 ls 命令的帮助文档
help ls # 用 help 命令查看 ls 命令的帮助文档
ls --help # 用 --help 参数查看 ls 命令的帮助文档
● 文件属性
2. 命令格式
● ls
列出目录文件情况
ls # 列出当前目录的文件
ls ./ # 同上,‘.’号代表当前目录
ls ./*txt # 列出当前目录下以 txt 结尾的文件
ls ../ # 列出上层目录的文件
ls -a # 列出当前目录下的所有文件,包括隐藏文件
ls -l # 列出当前目录下文件的详细信息
ll # ls -la 的简写,这个需要管理员自定义
ls -lh # 加上 -h 参数,以 K、M、G 的形式显示文件大小
ls -lh / # 列出根目录下文件的详细信息
ls -S # 以文件大小排序
ls -t # 以时间排序
ls -R # 递归目录列出文件
ls -d # 显示目录本身,而非目录下文件
● cd
切换工作目录
cd .. # 切换到上层目录,相对路径
cd / # 切换到根目录
cd /teach/ # 切换到根目录下的teach,绝对路径
cd - # 返回上一次的工作目录
cd ~ # 回到用户家目录
cd # 同上,回到用户家目录
● mkdir
创建目录
mkdir dir # 创建一个叫dir的文件夹
mkdir dir/sub1 # 想要创建一个含有sub1子文件夹的文件夹dir,会报错
mkdir -p dir/sub1 # 想要递归创建文件夹必须加参数-p
mkdir f{1..3} # 批量创建 f1 f2 f3 文件夹
mkdir -p f{1..3}/f{1..3} # 批量递归创建 f1 f2 f3 文件夹分别包含f1 f2 f3
tree # 会显示文件夹树状结构图
● tree
查看目录结构
tree -L 1 # 查看当前目录的1层树结构
tree -L 2 # 查看当前目录的2层树结构,在一层的基础上再显示一层子目录
● touch
创建文件(文本文件)要区别于mkdir
touch file.txt new.txt # 创建个别文本文件
touch file{1..5} # 批量创建文本文件
● rm
删除文件或文件夹,不可撤销
-f # force不显示警告讯息,强制删除
-i # 在删除会先询问用户,交互性删除
-r # 递归删除文件夹,一层一层删除,系统默认不会删除文件夹,加上此参数即可
rm file.txt #文件是可以直接删除的
rm file* # 批量删除以file开头的文件,如果有file开头的文件夹可能会报错,因为文件夹不能直接删除
● mv
移动 / 重命名
mv file1 Data/ # 把file1移动到Data路径下
mv file1 file2 # 把file1重命名为file2
mv file1 Data/file2 # 把file1移动到Data路径下并且重命名file2
mv file* Data/ # 把file*来头的文件都移动到Data路径下
● cp
拷贝
-r # 递归拷贝,由于拷贝文件夹
cp readme.txt Data/ # 将readme.txt拷贝到Data/路径下
cp readme.txt Data/read # 将readme.txt拷贝到Data/路径下且重命名为read
cp -r dir Data/ # 将文件夹dir递归拷贝到Data/路径下
● ln
Link链接,分软链接(常用)和硬链接(默认)
# 不加参数即为硬链接
-s # 参数即为软链接,软链接的作用类似快捷方式
ln -s /teach/software/Miniconda3-latest-Linux-x86_64.sh ./
# 被链接的文件采用绝对路径会比较不容易出错
● tar
解压 & 压缩文件
-c # 创建一个新的tar归档文件(创建压缩文件)
-X # 从已有tar归档文件中提取文件(解压缩)
-f # 输出结果到文件或设备
-V # 在处理文件时显示文件(显示处理进度)
-j # 将输出重定向给bzip2命令
-Z # 将输出重定向给gzip命令
tar -zxvf Data.tar.gz # 解压.gz文件
tar -jxvf Data.tar.bz2 # 解压.bz2文件
tar -zcvf Data.tar.gz Data ...# 压缩多个文件为Data.tar.gz
____________________________________________________________
# 其他压缩和解压命令:只能处理一个文件
zip unzip # 用于压缩和解压*zip 文件
gzip gunzip # 用于压缩和解压*gz文件
bzip2 bunzip2 # 用于压缩和解压*bz2 文件
● cat
查看文本文件的内容,输出到屏幕,不会修改文件内容
-A # 列出所有内容,包括特殊字符,如制表符、隐藏文件等
-n # 打印出所有行号
-b # 仅打印非空白行行号
cat readme.txt # 查看readme.txt文件内容
cat -n readme.txt # 查看readme.txt文件内容并显示行号(包含空白行)
cat >file # 写入文件 ,如果文件存在就会覆盖原来的内容
Welcome to Biotrainee() ! # 写入的内容
^C # 这里是按Crtl+C
# cat 在写入内容时直接按backspace无效,必须 Crtl+ backspace
# 只能删除末尾的,如果前面还有问题,只能重写,覆盖写入
cat >>file # 追加写入文件
Welcome to Biotrainee() ! # 写入的内容
^C # 这里是按 Crtl+C
zcat # 可以查看压缩的文本文件
tac # 逆向查看,一行不会倒序,多行时倒序显示
● head - tail
查看文件的前/后n行,默认10行
head Data/example.fq # 查看example.fq文件的前10行(默认)
head -n 2 Data/example.fq # 查看example.fq文件的前2行
tail Data/example.fq # 查看Data/example.fq文件的最后 10 行
tail -n 2 Data/example.fq # 查看Data/example.fq文件的最后 2行,空白行也算一行也会显示
head -n 2 Data/example.fq | tail -1 # 只查看第2行
# 行数可以简写:-n 2 = -2
● less - more
逐页查看,按空格翻页,按回车换行,用的比较少,一般用 less 比较多,按 q 退出同样是查看文件内容,当不明确文件大小,cat 可能会导致刷屏,建议使用 less 命令。
less Data/example.fq # 默认格式没行号且会自动换行,一般比较凌乱
less -S Data/example.fq # 单行显示,格式会比较规整
less -N Data/example.fq # 显示行号
zless -N Data/reads.1.fq.gz # 查看压缩文件
● wc
统计文本
wc readme.txt # 默认形式是行数、单词数、字符数都统计
6 29 207 readme.txt # 上一步的返回结果
wc -l readme.txt # 统计文本行数
wc -w readme.txt # 统计文本字符串(单词)数,不管单词有没有含义
wc -l readme.txt # 统计文本字节(字符)数
cat readme.txt| wc -l # 合理利用计算资源
● cut
文本切割
-d # 指定分隔符,默认\t制表符
-f # 指定输出哪几列(字段fields)
cut -f 1,3-5 # 切割文件的第1列和第345列
cut -d 'h' -f 1 # 以'h'为分隔,取出第1列
● sort
排序
-n # 按照数值从小到大进行排序,默认是按照1 10 2 20排序
-V # 字符串中含有数值时,按照数值从小到大排序
-r # 逆向排序,20 2 10 1排序,不是从大到小
-nr # 实现从大到小排序
-k # 指定区域,不指定就按一整行排序
-t # 指定分隔符
sort -k 3 | less -S # 按文件第3列排序,方便查看结果使用less -S
sort -n -k 4 | less -S # 遇到数字排序一定要小心,记得加上-n
● uniq
去重复,==只去除相邻两行==,一般先排序,然后再去重复
-c ## 统计每个字符串连续出现的行数
less -S Data/example.gtf | cut -f 3 | sort | uniq # 对排序后的结果去重复,保留唯一值
less -S Data/example.gtf | cut -f 3 | sort | uniq -c # 会显示每个值重复的次数
● paste
文本合并,但数量不一致时,不会像R那样循环补齐,没有就空着
-d # 指定分隔符,默认是制表符
-s # 按行合并,默认是左右按列合并
less -S Data/example.fq | paste - - # 将1列变成2列(按行)
less -S Data/example.fq | paste - - - # 将1列变成3列(按行)
paste file1 file2 # 将 file1 file2 按左右合并 file1 左,file2 右
● tr
字符替换
-d # 删除指定字符
-s # 缩减连续重复字符
cat readme.txt | tr 'e' 'E' # 'e'被替换成'E'
cat readme.txt | tr 'abc' 'ABC' # 'abc'被替换成'ABC',一一对应。
cat readme.txt | tr '\n' '\t' # '\n'被替换成'\t'
cat readme.txt | tr -d 'e' # 删除字符'e'
3. 正则表达式
是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
符号 | 含义 | 符号 | 含义 |
---|---|---|---|
^ | 行首 | \ {n\ } | 匹配之前项n次 |
$ | 行尾 | \ {n,\ } | 匹配之前项至少n次 |
. | 换行符之外的任意单个字符 | \ {m,n\ } | 之前项至少m, 最多n |
? | 匹配之前项0次或者一次(?) | [ ] | 匹配[ ]内任意一个 |
+ | 匹配之前项1次或者多次(\ +) | [^ ] | 排除^后的字符 |
* | 匹配之前项0次或者多次 | | | 或者 |
cat readme.txt | grep '^T' # 匹配行首为T的行
cat readme.txt | grep ')$' # 匹配用)结尾的行
cat readme.txt | grep 'f.ee' # .可以是任意单词
cat readme.txt | grep 'f\?ee' # 匹配ee/fee,f出现0/1次
cat readme.txt | grep 're\+' # 匹配re/ree/reee...
cat readme.txt | grep 'f*ee' # f可以出现任意次
cat readme.txt | grep 'fe\{2\}l' # e匹配2次,花括号需要转义
cat readme.txt | grep [bB] # 可以匹配大写或者小写b
cat readme.txt | grep '[bB]' # 同上,有没有''都一样
cat readme.txt | grep [^Tt] # 匹配除了Tt以外的所有
4. 文本处理三驾马车
● grep
文本搜索工具,可匹配正则表达式使用
格式:grep [options] pattern file
参数 关键词 作用文件
-W # word精确查找某个关键词pattern
-C # 统计匹配成功的行的数量,不是个数!
-v # 反向选择,即输出没有没有匹配的行
-n # 显示匹配成功的行所在的行号
-r # 从目录中递归式地查找关键词pattern
-e # 指定多个匹配模式
-f # 从指定文件中读取要匹配的关键词pattern
-i # 忽略大小写
grep Biotrainee -r ./ # 在当前目录下递归式查找 Biotrainee 这个关键词
grep 'gene' # 包含'gene'的所有单词,不仅仅是单词 gene
grep -w 'gene' # 只查找单词 gene ,不包含gene_xxx
grep -v -w 'gene' # 除了单词 gene 以外的
grep -w -e 'gene' -e 'UTR' # 查找多个关键词用-e连接
grep -w -f file # 关键词太多,可以把它们写入一个文件file然后用文件查找
grep -w 'gene' | -w 'UTR' # 找完'gene'再找'UTR',注意和上面的-e区别
● sed
流编辑器,一般用来对文本进行 增删改查 !!!
格式:sed [-options] 'script' file(s)
参数 代码 作用文件
代码:[address] [ ! ] command
作用的行 取反 具体命令
1. address的表示方式
# 不指定具体的行就是对全局操作
2 # 第2行
2,4 # 第2行到第4行
2,+4 # 从第2行到2+4行
2,$ # 第2行到最后一行,$表示最后
2~3 # 从第2行开始,每隔3行取一行,不是2-3行
/pattern/ # 匹配上关键词pattern 的行
[!] # 表示否定,取反
2. 常用命令(增删改查)
i # insert,在指定行的前增加一行,内容为i的后面接的字串
a # append,在指定行的后面增加一行,内容为a后面接的字串
d # delete, 删除某一行或者某几行,也可以指定删除匹配上的行
c # change, 改变指定行的内容
s # 替换,使用格式为's/old/new/ [flags]', 把old替换成new,默认只替换一个,可以指定flags
y # 转换,实现字符一对一转换,格式'y/inchars/outchars/ '
p # print,把匹配或修改过的行打印出来,通常与-n参数合用
3. 常用参数
-n # 禁止显示所有输入内容,只显示经过sed处理的行(常用)
-e # 直接在命令模式上进行sed的动作编辑,接要执行的一个或者多个命令,和grep的-e参数很像
-f # 执行含有sed动作的文件
-r # sed的动作支持的扩展正则(默认基础正则)
-i # 直接修改读取的文件内容,不输出(慎用!)
cat readme.txt | sed '1i xxxxx ' # 在第一行前面插入xxxxx
cat readme.txt | sed '1a xxxxx ' # 在第一行后面插入xxxxx
cat readme.txt | sed '1,3d' # 删除1-3行都
cat readme.txt | sed '1c xxxxx ' # 第一行替换为xxxxx
cat readme.txt | sed 's/is/IS/' # 把每一行的is替换完为IS,每一行的第二个is不会改变
cat readme.txt | sed 's/is/IS/g' # 把每一行的is替换完为IS,flags为全局
cat readme.txt | sed '/^$/d' # 删除空白行
cat readme.txt | sed '/ww/ s/ee/EE' # 定位到含有ww的行,把ee替换为EE
cat readme.txt | sed -n '/ee/p' # 只输出含有ee的行,效果和 grep "ee" 一样
cat readme.txt | sed 'y/abc/ABC/' # 用ABCf分别替换abc,效果和 tr 'abc' 'ABC' 一样
cat readme.txt | sed 's/^../**/' # 把每一行的前两个字符替换为*
cat readme.txt | sed '1~2 s/^../*/' # 把奇数行的前两个字符替换为*
cat readme.txt | sed '2~2 s/^../*/' # 把偶数行的前两个字符替换为*
cat xxx.fa | sed '2,$ y/ATCG/TAGC' # 互补序列的转换
# Shell脚本获得核酸反向互补序列参考下方链接
# https://blog.csdn.net/qq_42491125/article/details/102718191
_____________________________________________________________________________________
## sed 大小写转换
sed 's/[A-Z]/\l&/g' # 大写转小写
sed 's/\b[a-z]/\u&/g' # 小写转大写
tr '[a-zA-Z]' '[A-Za-z]' # 大小写互相转换
● awk
也称gawk,编程语言,可对文本和==数据==进行处理
用法:awk [options] ' {script} ' file
参数 代码 文件
代码的结构类型:
基础结构:'{script}'
匹配结构:'/pattern/{script}'
扩展结构:'BEGIN{script} {script} END{script}'
热身 逐行执行 最后执行
运行原理:awk在读取一行文本时,会用预定义的字段分隔符划分每个数据字段(行),并分配给一个变量。
$0 # 代表整个文本行
$1 # 代表文本行中的第1个数据字段
......
$NF-1 # 代表文本行中倒数第二个数据字段
$NF # 代表文本行中的最后一个数据字段
参数及命令:
-F # 默认的字段分隔符是任意空白字符(如:空格or制表符),也可以用-F参数自定义分隔符
# 切割行的时候建议使用cut,以为在一列中包含空格或者制表符时awk只能切除某一列的部分
-v # var=value,定义awk程序中的一个变量及其默认值
## 基础结构
less -S Data/example.gtf | awk '{print $9}' | less -S # 切出第9行
less -S Data/example.gtf | awk '{print $9,$10}' | less -S # 切出第9、10行
less -S Data/example.gtf | awk -F '\t' '{print $9}' | less -S # 以制表符分割切出第9行
## 基础结构--加强版,加入条件判断和循环语句
less -S Data/example.gtf | awk '{if($3=="gene") print $0}' | less -S
less -S Data/example.gtf | awk '{if($3=="gene") {print $0} else{print $3 " is not gene "}}' | less -S
less -S Data/example.gtf | awk '{for(i=1;i<4;i++){print $i}}' | less -S # 打印多列
## 匹配结构:将含有gene关键词的行,整行打印
less -S Data/example.gtf | awk '/gene/{print $0}' | less -S
## 扩展结构标准版
less -S Data/example.gtf | awk 'BEGIN{print "find UTR feature"} /UTR/{print $0} END{print "end"}'
## 扩展结构省略END版
less -S Data/example.gtf | awk 'BEGIN{FS="\t"} {print $9}' | less -S
# {}内的多个代码可以用;分开
less -S Data/example.gtf | awk 'BEGIN{FS="\t";OFS="\t"} {gsub("gene","Gene",$3);print $0}' | less -S
awk内置变量:
FS # 定义输入字段分隔符, IField Separator,同-F
RS # 定义输入记录分隔符,Record Separator
OFS # 定义输出字段分隔符,0ut Field Separator,默认是 分隔符不是制表符
ORS # 定义输出记录分隔符,0ut Record Separator
NF # 数据文件中的字段总数,可以简单理解为列数
NR # 已处理的输入记录数,可以简单理解为行数
自定义 # 也可以通过-v参数自定义变量或传递外部变量
awk数学运算:
+ # (加)
- # (减)
* # (乘)
^ # (幂)
/ # (除)
** # (平方)
% # (取余)
int(x) # x的整数部分,取靠近零一侧的值
# 如要实现四合五入,可在原数据基础上+0.5,再取整
1og(x) # x的自然对数
5. 操作技巧
以下是老师在讲解过程中穿插的小技巧,可以让操作更流畅、更高效。
- 查看历史命令:↑键、history
- 文件名和路径的补齐:Tab键(每天100次)
- 选中文件:双击
- 选中行:三击
- 文件命名:不要有空格、不要涉及保留字、不要有中文
- 查看文件结构:tree
- 登录服务器的第一个命令:ls(每天100次)
- 查看帮助文档:--help
- 巧用管道符:|
- Linux操作系统中,严格区分大小写
- 直接到达行首:Home键 、Ctrl + a
- 直接到达行末:End键 、Ctrl + e
- 如果一个命令不想运行了就 Ctrl + c 结束掉
- 看到奇怪的结果也可以按 Ctrl + c 结束掉
- Ctrl + c 不要和 Windows 操作系统里的复制混淆,要复制用鼠标
- 操作过程中所有修改在不赋值的情况下,都是不会被保存的,也不会修改原文件
- 保存文件可以用 >文件 ,重定向
- 对文档操作前,先 less 初步查看文档
- 空格和制表符在正常情况下看不出来,cat -A 可以将制表符可视化,制表符是^I
- 加参数的时候要么-w -c 分开,要么-wc合并,-w-c会报错
- 单行命令太长可以用 \ 连接
- 在less不加参数 -S 时,可以用鼠标双击具体的命令,看谁和谁是一起的
- 代码最外层一般都是成对的 ' ',里面嵌套成对的 " "
- 出现串列,可以使用 column -t | less -S