Linux部分一直是我心头的大山,感觉很难翻过去了,那么学习愚公,一勺一勺的慢慢挖吧。
先从复习和回顾课堂上的内容开始。
文件目录命令
- mkdir 创建文件夹/目录
- -p 建立多层目录
mkdir -p test1/test2/test3
- -p 建立多层目录
- cd 目录切换
- ls 目录展示
- tree 树形展示
- -d 只看目录
- -L num 显示num层目录
- touch 创建文本 一般用它来判断该目录的写入权限
touch new.txt
- rm 删除文件
- rm -r 递归删除,删除目录
- rm -i 搞不清楚有没有删错前可以加上 删除前询问
- cp 复制/拷贝
- cp -i 覆盖前询问
- cp -r 复制目录及其内所有项目
- 目标路径必须提前建好,不带有新建目录的功能
- less 查看大文本
- -S 大写 单行显示,看表达矩阵是方便对齐
- -N 大写 加编号
- less之后的操作不会改变原文本
- vim 编辑文本
- 进入编辑器后,我们先按i,即切换到“插入”状态。就可以通过上下左右移动光标,或空格、退格及回车等进行编辑内容了。
- ESC退出编辑模式
shift+q 进入命令模式 - 在冒号后面写 q退出, w保存
wq 或者x:写入并退出 - q!:不保存退出
- !:直接退出
- cat 输出/入(小)文本/查看小文本
cat > newfile
cat file
- head 展示文件前几行
head -n 3 file
- tail 展示文件后几行
tail -n 4 file
- mv 移动文件/目录
- 也是不能新建目录
- > 重定向
- >>追加 通常用追加,避免覆盖清空原文件
- |管道符
- history查看历史命令
- history | rail -n 5 > history.txt
- ln 建立链接,相当于创建快捷方式
- 查看帮助文档 -- help (两个-)
进阶命令一
- cut 文件切割,配合管道符内容使用
- -d 定义分隔符,默认为
\t
- -f 制定分割后输出第几列
- eg
less -S | annotation.gtf.gz | cut -f 1,3-5 | less -S
- -d 定义分隔符,默认为
- paste 粘贴,文本按列合并,默认分隔符是
\t
- -s 文件按行合并
- sort 排序
- uniq 去除重复行
- find 寻找文本/目录
- tr
- 注意
tr [atcg] [tcga]
是把“a换成t,t换成c,c换成g,g换成a“,而不是字符串atcg去匹配
- 注意
- wc 计算文本大小,行数,字符数
进阶命令二
三大命令:sed
, grep
, awk
sed
个人理解:编辑文本,"替换",按条件打印包含模版的行
崔老师的讲解:https://www.jianshu.com/p/1a853a0315d5
可依照script的指令,来处理、编辑文本文件。 多用于对文本的行来操作,
常见 sed [option] 's///g' tmp.txt
为了方便理解,走一遍动作说明的代码,然后写出解释:
echo 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0|sed 's/Bcast.*$//g'
返回了192.168.1.100。输入到截止"Bcast"前面的内容
由于输出内容很多,密密麻麻的,替换的地方可能察觉不到,建议眼花如我的都先不要sed,看看原始的长什么样子,然后截屏比较命令的差别。
编辑文本,替换
nl /etc/passwd |sed 's/:/\t/'|less -S
把":"分割成"tab",只替换第一个。
**如果要全部都替换则加上gsed 's/:/\t/g'
**
nl
表示给列出的内容加上行号
nl /etc/passwd |sed '4,$s/:/\t/'|less -S
s和g分别表示开始和结束,所以这里表示从第4行到最后一行(4,$)执行上述替换
nl /etc/passwd | sed -e 's/root/#####/' -e 's/qmcui/###!!!/'|less -S
-e
:表示多次使用sed,这句里面执行了两个替换:root换成#####,qmcui换成###!!!
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
删除3-最后一行,d
表示删除动作;然后替换bash为blushell
nl /etc/passwd | sed -e 's/:/\t/;s/:/\t/'|less -S
用分号串联,替换了两次, 要想全部替换,+g,见上
nl /etc/passwd | sed 's/false$/&! ! !/' | less -S
在行末找到false后,在后面加三个叹号,&表示match的对象,也可以写成&&!!!,这样就又加了一个false
a
:新增,a 接字串,而这些字串会在新的一行出现(目前的下一行)~
nl /etc/passwd | sed '1a\llll llllllll \n lllllll'|less -S
在第1行下面新增一行(a),单引号''里面是新增的内容,\n表示换行
i
:相应的,i表示向上新增一行插入。
nl /etc/passwd | sed '2i drink tea' | cat -n
d
:删除, d 后面通常不接任何内容
nl /etc/passwd | sed '3,$d'
删除第3到最后一行
c
:取代, c接字串,这些字串可以取代 n1,n2 之间的行!
nl /etc/passwd | sed '2,5c No 2-5 number'
将第2-5行替换成"No 2-5 number"字符串。变化一下:sed '2,$c No End'
打印符合条件的/包含模版的行
-n
:输出包含模版的行
p
:打印,通常 p 会与参数 sed -n 一起运行~
nl /etc/passwd | sed -n '5,7p' # 输出5-7行
nl /etc/passwd | sed -n '2p;4,5p' #输出第2行和4-5行
nl /etc/passwd |sed -n '4,+5p' # 输出第4行,以及往下5行
nl /etc/passwd | sed -n '4~4p' # 输出第4行,以及每隔4行输出
nl /etc/passwd | sed -n '/root/p' # 只打印包含模式“root”的行,替换成别的字符串也行,类似于查找了
小结
- sed命令的标准句式是sed [option] 's///g' tmp.txt,也可以借由管道符使文件(tmp.txt)是从前面传递而来的。
- 其中参数放在[option]处,比如
-e
多次使用,-n
打印特定行(和动作命令p
配合使用) -
a
,c
,d
,i
,e
,s
,g
这些都是动作命令,放在单引号''内 -
$
表示末行或行末;&
表示匹配的对象,不要搞混了 - 处理区域的选择规则写在
's///g'
的"s"前面。- 可以是数字,"1,5"表示1-5行,与R语言区别;
- 可以是/pattern1/,选择含有pattern2的行;
- 还可以是/pattern1/,/pattern2/,表示选择以pattern1起始,到pattern2结束的区域。
grep
个人理解:文本搜索,抓取
崔老师的讲解:https://www.jianshu.com/p/22a4324ddfdf
即(global regular expression print);Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行/特定内容打印出来。
匹配特征:grep默认一些简单正则,如^,$等,
参数多;常用的也多
直接就输出了,还会把匹配的部分用颜色高亮
nl /etc/passwd | grep 'qmcui'
提取含有'qmcui'的行
-v 参数
-v
–invert-match:取没有匹配的行,反向选择
nl /etc/passwd | grep -v 'qmcui'
反向选择没有'qmcui'的行
-w 参数
-w
–word-regexp:只选择匹配上整个 words,完全匹配
nl /etc/passwd | grep -w "root"
这个不明显,比较一下下面这两个
nl /etc/passwd | grep "100"
nl /etc/passwd | grep -w "100"
[图片上传失败...(image-83f862-1555911189748)]
-i 参数
-i
,–ignore-case:忽略Pattern 和文件内容的大小写
nl /etc/passwd | grep -i VIP
-e 参数
-e
:多个-e 可以用来描述多个不同的匹配模式 ;or
和sed
命令里面的-e
一样
nl /etc/passwd | grep -ie 'Server' -e 'root' -e 'qmcui'
一下两个是等同的,正则表达式
nl /etc/passwd | grep -e 'root' -e 'qmcui'
nl /etc/passwd | grep 'root\|qmcui'
-o 参数
-o
:-n形式输出匹配内容,只输出匹配的内容
一般直接用似乎没有什么用,但是后面跟着wc可以计算匹配的数目或者行数,或者用-io
模糊查找,返回输出正确的格式等等
-A / -B / -C 参数
邻居参数,输出匹配行的前后邻居们
-A
:输出匹配行之后的num行
-B
:输出匹配行之前的num行
-C
:输出匹配行前后各num行
注意C的大小写!!!
-c 参数
-c
输出计数后的几行
自带计数参数
nl /etc/passwd | grep -c 'qmcui'
nl /etc/passwd | grep -ie 'Server' -e 'root\|qmcui' -c
-n 参数
-n
–line-number 显示行号
nl /etc/passwd | grep -n 'qmcui' # 这样用好没意义啊,nl本身就加了行号
-f 参数
-f
FILE ,–file=FILE 从FILE中获得匹配的数据
# $ cat match.txt # cat >match.txt
# root
# qmcui
less /etc/passwd | grep -f match.txt
把文件match.txt中的内容进行匹配。
awk
个人理解:在文本里面抓取元素,然后进行运算。
崔老师的讲解:https://www.jianshu.com/p/b6aec932adcf
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
另一个写的不错的博客
https://indexofire.gitbooks.io/notebook_of_analyzing_pathogen_ngs_data/content/appendix/awk.html
基本句式
awk [option] '{pattern + action}' {inputfilenames} # sometims muti file is ok
awk [option] 'BEGIN{初始代码} {循环代码} END{最后代码}' filename
也可以理解为'BEGIN{运行前} {运行中} END{运行后}'。
另一篇博客把句式写为awk 'pattern { action }' input_file
,他认为BEGIN也是一种pattern
awk 程序内容很简单,主要包括 pattern,action和输入文件:
- pattern 表示所要搜索的内容,可以用正则表达式
- { action } 则表示搜索匹配后要做的操作。
- 输入文件:所要搜索的输入内容
awk 可以不需要输入文件;对于pattern和action来说,2者至少要有一个才能运行。如果没有pattern,则默认匹配任何输入,按行输出并执行action。如果没有action,则匹配pattern并按行输出不做额外操作。
最简单的语句,最好理解awk的功能。输入1 2 3,用$来索引使用
echo 1 2 3 |awk '{ print "total pay for", $1, "is", $2 * $3 }'
# total pay for 1 is 6
-F参数: 指定分隔符
以':'分割,输出第一个元素。
echo $PATH | awk -F ':' '{print $1}'
awk -F '[;:]' 指定多个分隔符。
体会BEGIN和END
以下两命令都是截取第1和第7个元素输出,第二句在输出内容前面加一行"name,shell",后面加一行"blue,/bin/nosh"。
cat /etc/passwd |awk -F ':' '{print $1","$7}'
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
统计计数
对内容"/etc/passwd"计数并输出结果($0输出输入的内容).
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
对内容"/etc/passwd"进行":"分割,开始时定义count=0,定义action:输出改行第一元素,然后计数+1。利用循环来输出。
NR
表示行号。
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
生信分析应用场景
这一讲内容很多,命令的变化很多,更加复杂了。简单理解一下在做生信分析时的应用场景(举个):
对列的操作:提取、排序、插入
生成的bam文件提取后续分析需要的列,并调整排序:
awk -F '\t' '{print $1,$7,$8,$9,$10}' OFS='\t' Cr_DJ-osdrm2_fCount.out > WT_osdrm2_matrix.out
awk '{ print $3, $5, $7, $2, $1, $4, $6 }' infile.txt > outfile.txt
# insert
awk '{ print $1, $2 "gene expression", $3}' infile.txt > outfile.txt
去除重复行
awk '!x[$0]++' infile.txt > outfile.txt
根据阈值挑选差异基因
awk '{if(($10<-2)&&($11<0.001))print $3"\t"$8"\t"$9"\t"$10}' gene_exp.diff | grep -v 'inf' > down.txt
## 筛选出下调的基因(log2_fold_change < -2 & pvalue < 0.001)
awk '{if(($10>2)&&($11<0.001))print $3"\t"$8"\t"$9"\t"$10}' gene_exp.diff | grep -v 'inf' > up.txt
## 筛选出上调的基因(log2_fold_change > 2 & pvalue < 0.001