linux简介
linux 是一套操作系统
- Linux系统内核为linux。
- 内核是一个电脑程序组成操作系统的核心,链接系统硬件和应用程序。
- Linux系统是自由和开源的。
连接linux集群
- 将多个计算机(节点)连接在一起组成集群,我们可以登录到其中某个节点,通过这个节点向其它节点投 递任务。
- Windows 使用putty等支持ssh连接的工具(rna_192.168.48.100_22)
- mac 终端 ssh [email protected]
- password rna@2016
linux系统目录结构
(了解)
- / 根目录,有且只有一个根目录
- /etc: 系统配置文件存放目录
- /bin:/usr/bin: 可执行文件(命令)存放目录
- /sbin:供超级用户使用的可执行文件
- /home:存储普通用户的个人文件
- /lib:/usr/lib:/usr/local/lib:系统使用的函数库的目录
- /opt:给主机额外安装软件的目录
- /usr:应用程序存放目录。
/usr/bin 存放可执行文件。/usr/share 存放共享数据。/usr/lib存放程序运行所必需的一些函数库文件。/usr/local 软件默认安装目录。/usr/share/doc 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录 - /var:系统服务。
系统日志文件/var/log,/var/log/message 所有的登录文件存放目录,/var/spool/mail 邮件存放的目录,/var/run 程序或服务启动,/var/www web服务器目录
操作命令
命令一般有两部分组成:命令名称+命令参数,之间用空格隔开
目录操作命令
- pwd (print working directory)
查看当前目录完整路径,分为绝对路径和相对路径,即从根目录(/)or当前目录(./)
pwd /WORK/TRAIN/RNA
- cd (change directory) 切换目录
cd . 当前目录
cd .. 上级目录
cd - 返回上次访问的目录
cd ~ 进入home目录
- mkdir (make directory) 建立目录
mkdir -p test/test1 建立多级目录
mkdir Directory 建立目录
- ls (list)显示指定工作目录下的内容
ls -a 显示所有子目录和文件,包括隐藏文件
ls -l 以长格式显示文件详细信息
ls -h 表示大小一栏转为便于人类识别的形式,加上单位。 默认情况下单位为字节。
ls -lh
ls -i 同时展示inode号
文件操作命令
- vi 是一个文本编辑器,若文件存在则打开编辑,否则创建新的文件
vi filename 进入命令模式,i切换为编辑模式,esc退出返回命令模式
命令模式下:
:w 保存
:q! 强制退出
:wq 保存后退出
/pattern 向后查找
?pattern 向前查找
:%s///g 或:%s###g 全局替换
- touch 创建空文件
修改以后文件的日期([yyyyMMDDhhmm])
touch filename 新建文件
touch -t 201808080808.08 filename 修改文件修改时间和访问时间
touch -m filename 改变修改时间为当前时间
touch -a filename
改变访问时间为当前时间
touch -r file1 file2 将file2时间改成file1时间一样
- cp (copy) 对文件或者目录进行拷贝
cp -r 递归复制目录及目录中的文件
cp -r /Work Test
echo dirname* | xargs -n 1 cp -v filename
- ln -s (link -solf) 建立软连接。制作软连接的时候,最好使用绝对路径。硬链接除了文件名以外,其它的信息都是相同的,软连接则是一个新的文件。
ln -s souce.txt destination.txt
ln -s `pwd`/test1.txt test4.txt
- mv (move file)
对文件或者目录重命名 mv oldfile newfile
移动文件(夹)位置 mv file destination
- rm (remove files)删除文件和目录
rm -r 递归删除目录及文件
rm -f 强制删除
rm -rf test.txt
- stat 命令查看文件的附加属性,包括文件名,inode号等
stat test.txt
文件内容操作命令
- cat
一次性显示整个文件,查看文件内容 cat filename
合并文件 cat file1 file2 > file3
- less 查看一个文件的内容
显示行数 less -N file.fasta
行超过屏幕部分舍去 less -S unigene.fasta
查看文件 less file.txt
- head/tail 查看文件前几行/后几行
head -5 unigene.fa
tail -10 unigene.fa
- wc (wordcount)
wc -c print the byte counts 字节数
wc -w print the character counts 字数
wc -l print the newline counts 行数
- sort 排序
sort -kx,y 对第x列到y列进行排序
sort -n 按大小排列,作为数字
sort -r 按相反顺序排列
sort -k 1.2 对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序
sort -k 1.2,1.2 只对第一个域的第二个字符排序
sort -k 2,3 对第三列到第四列排序
sort -t $'\t' 指定以tab键分割
sort -t : test 以冒号分割
- 使用sort按1,2,4,3列排序,其中1,2,4是数字,同时使用tab作为分隔符,第4列逆序排列
sort -t $'\t' -k 1n,1 -k 2n,2 -k 4rn,4 -k3,3 file
- uniq 去重复
sort -u filename 等价于 sort filename | uniq
uniq -c 统计重复的数量
uniq -u 显示没有重复的行
uniq -d 显示重复的行
- grep 命令(global regular expression printer)
逐行对文件进行指定模式的搜索。
grep -c 查看行数
grep -i 忽略字母大小写
grep -v 输出不匹配的行
grep ^C test.txt 列出C开头的行
grep T$ test.txt 列出T结尾的行
ls -l | grep ^d ==列出所有文件夹==
- cut 显示行中指定部分
cut -f 显示指定字段内容
cut -d 指定默认的分隔符,默认是tab键
- split 分割文件
split -b 10k filename 按10kb分割文件
split -d filename 分割后文件数字为后缀
split -a 3 filename 分割后后缀长度
split -l 3 filename 按行分割
- >重定向
> 表示将标准输出重定向到指定文件,并将原文件覆盖
>> 表示将标准输出重定向并追加到指定文件,原文件不覆盖
| 表示重定向输出到下一个命令的标准输入
- 文件通配符
?和*
ls file? ? 表示任意 1 个字符
ls file* 表示任意个任意字符,包括 0 个
- 管道 |
很多linux的命令输出直接达到屏幕上,也就是输出到stdout,这些输出可以直接作为一些命令的输入,也 就是stdin。这时候中间用 | 链接,也就是管道。
ls -l | less
- 文件的权限
chmod =x test.txt #将user group other的权限都设成x即只可执行,---x--x--x
chmod u=w test.txt #user只读 --w---x--x
chmod u+r test.txt #user的权限增加r
chmod o-x test.txt #other的权限减少x
chmod 124 test.txt # ---x-w-r--
chmod 731 test.txt # -rwx-wx--x
chmod -R 775 test1 #递归文件夹中文件以及文件夹递归实现权限变更
数序为二进制的十进制值
x=2^0
w=2^1
r=2^2
- 帮助信息
ls --help
man ls
集群操作命令
- who 系统登录情况
who | wc -l 查看用户数量
whoami 查看自己登录用户名
- 任务投递
qsub -cwd -l vf=* -q all.q *.sh
- 查看已投递的任务状态
qstat –j job-id
查看某个具体任务的详细状态信息
vjob 查看任务状态,包括JOBID CPU Mnow Mmax node VF Hours CMD
- 节点状态查看
qhost 查看所有节点状态信息
qhost –j 查看所有节点状态信息,包含节点下面的任务列表
- 可用队列、节点查看
qselect –U username
压缩和解压缩
- gzip 压缩
gzip file
- gunzip 解压缩
gunzip file.gz
- tar 打包压缩与解压缩
-v 压缩过程显示文件
-c 创建新压缩文件的指令
-z 用gzip压缩
-f 使用文档名,后直接接文件
-x 解压缩
tar -zvcf test.tar.gz file1.txt file2.txt 压缩
tar -zvxf test.tar.gz 解压缩
shell脚本与流程控制
- shell优势:
简单性 效率高 开发容易
直接在命令行上测试;一旦找到适当语法,将其放入独立脚本中,设置可执行权限后,可以直接使 用该脚本。
- 规范格式
第一行: #!/bin/sh
基本元素:命令 参数
- 空白隔开命令行中各部分
- 命令名称为第一个项目
- 选项开头是一个减号,后面接字母
- 变量
- 本地变量
a=rna
$a vs a # rna vs a $a为本地变量
- echo 输出与printf 输出
a=please b=enter c=your d=name
g="$a $b $c $d"
echo $g # 本地变量 please enter your name
echo '$g' #纯文本 $9
printf $g #只输出please,第一个
echo -n 不换行输出
echo -e echo -e 处理特殊字符
eg1:
echo -e '1\ta\n2\tb\n3\tc\n4\td\n5\te\n6\tf\n7\tg\n8\th\n9\ti\n10\tj\n11\tk\n12\tl' > test1.tsv
eg2:
DATE=`date` #date的结果赋值给DATE
echo $DATE
- 定义不可变的变量
readonly Whome=sth
readonly 定义后整个脚本不再能更改
- 位置变量
$0 脚本本身
$1 第一个参数
- 特殊变量
$# 传递到脚本的参数个数,eg 3
$* 以一个单字符串显示所有脚本传递的参数,默认tab键分割 返回"$1 $2 $3"
$@ 与$#类似,但每个变量是独立的。返回 “$1”,"$2","$3"
$? 显示命令最后退出状态,0表示没有错,其他值表示有错
- 双引号
可以进行变量替换
a = helo
echo "$a world" # 输出hello world
- 单引号
不进行任何变量替换
- 反引号
执行系统命令赋给变量 等效于$()
a=ls *
echo $a
- 反斜线 转义元字符
4.1 布尔值
0表示false,1或者非零值表示true
4.2 条件测试
- test [condition]
test -e 判断是否存在
test -f 判断是否存在且为file
test -d 判断是否存在且为directory
test -r 判断是否存在且可读
test -w 判断是否存在且可写
test -x 判断是否存在且可执行
条件 与或非 -a -o !
test -r txt.sh -o -w txt.sh -a -x txt.sh |echo $?
- 测试字符串
相等 ==
不等 !=
空串 -z
非空串 -n
- 测试数字
-eq 等于
-ne 不等于
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数
test 5 -ne 10 && echo Yes || echo No
test -f /etc/resolv.conf && echo "File /etc/resolv.conf found." || echo "File /etc/resolv.conf not found."
5.流程控制
- if then else
if condition; then ...
elif condition; then ...
else
... fi
eg1:
#!/bin/sh
if [ ! -e "study" ]; then
mkdir study
fi
eg2:
#!/bin/sh
echo -n "Enter your login name: "
read NAME
if [ -z $NAME ] || [ "$NAME" = "" ]; then
echo "You did not enter a name"
elif [ "$NAME" = "root" ]; then
echo "Hello root"
elif [ "$NAME" = "rna" ]; then
echo "Hello rna"
else
echo "You are not root or rna but Hi $NAME"
fi
eg3:
#!/bin/bash
read -p "Enter a password" pass
if test "$pass" == "novo2017"
then
echo "Password verified."
else
echo "Access denied."
fi
eg4:
#!/bin/bash
read -p "Enter a number : " n
if [ $n -gt 0 ]; then
echo "$n is a positive."
elif [ $n -lt 0 ]; then
echo "$n is a negative."
elif [ $n -eq 0 ];then
echo "$n is zero number."
else
echo "Oops! $n is not a number."
fi
- case
case value in pattern1)
...
;;
pattern2)
...
;;
*)
...
;;
esac
eg1
#!/bin/sh
echo -n "Do you wish to proceed [y..n]: "
read ANS
case $ANS in
y|Y|yes|Yes)
echo "yes is selected"
;;
n|N)
echo "no is selected"
;;
*)
echo " $0: Unknown response"
;;
esac
- for
for var in list
do
...
done
eg1:
#!/bin/sh
for file in `ls $PWD`
do
echo $file
done
- while
while command
do
...
done
eg1:
#!/bin/sh
file=$1
while read Line
do
echo $Line
done < $file
eg2:
#!/bin/sh
count=0
while [ $count -lt 5 ]
do
count=`expr $count + 1`
echo $count
done
正则匹配
literal (逐字匹配) 匹配字符串的值
re1|re2 匹配表达式re1或re2
. 匹配任何字符(换行符除外)
^ 匹配字符串的开始
$ 匹配字符串的结尾
* 匹配前面出现的正则表达式零次或多次
+ 匹配前面出现的正则表达式一次或多次
? 匹配前面出现的正则表达式零次或一次
{N} 匹配前面出现的正则表达式N次
{M,N} 匹配重复出现M次到N次的正则表达式
.*? 非贪婪匹配
sed 命令
(stream editor), 用来对输入文件或者数据流进行编辑,逐行进行编辑,通常用来做替换。
sed -e 多次匹配
sed -i 对输入文件本身进行修改
sed -n 列出sed处理行,不加-n则列出所有行,重复处理行
==sed -f 加脚本文件使用脚本文件中的命令==
sed '1,5 s/\t/:/g' test.xls > result.xls
#一到五行全局替换
sed -i '1d' test.xls
#删除第一行
sed 's/T/U/g' input.txt
#这是一个将DNA序列转成RNA列的例子
sed -e 's/T/U/g' -e 's/A/a/g' input.txt #当想使用多个命令的时候,使用-e,每个-e后边跟一个命令,可以有很多
echo -e "s/T/U/g\ns/A/a/g" > edit.sed
sed -f edit.sed input.txt
#通过-f加脚本文件使用脚本文件中的命令
sed -n '/^A/=' input.txt
#返回以A开头的行。^表示开头,而 = 表示行号
sed 'y/ACGT/acgt/' input.txt
# y/.../.../ 字符转换,字符依次对应
sed '/^A/y/ACGT/acgt/' input.txt
sed '/^A/!y/ACGT/acgt/' input.txt
sed '2,4y/ACGT/acgt/' input.txt
sed '2,4!y/ACGT/acgt/' input.txt
#只对以A开头的行进行转换,/^A/ #不对以A开头的行进行转换,/^A/!
#只对2-4行进行转换
#不对2-4行进行转换
sed -i '1iAddThisBeforeThe1stLine' input.txt
#在第一行前加入一行
sed -i '$iAddThisBeforeTheLastLine' input.txt
#在最后一行前加入一行
awk 命令
awk 会对文件的每一行进行识别
- awk -F {s} '{pattern + action}' {filenames}
{s} 分隔符
pattern :查找的内容,一般为正则表达式,用斜杠括起来。
action :在找到匹配内容时所执行的一系列命令。
==awk -f address.awk address.tx
执行address.awk脚本==
- 内置变量
变量名 | 含义 |
---|---|
FS | 输入文件fields之间的分隔,-F指定内容 |
OFS | awk输出是fileds之间的分隔符 |
RS | 输入时记录(RECORD)之间的分隔符,默认\n |
ORS | 输出时RS |
NR | numbers of records |
FNR | 每个文件的records |
filename | 现处理的文件名 |
- 操作符
Operator | Description |
---|---|
> | is greater than |
>= | is greater than or equal to |
< | is less than |
<= | is less than or equal to |
== | is equal to |
!= | is not equal to |
&& | Both the conditional expressions are ture |
| | either one of the conditional expressions is ture |
+ | addition |
- | subtraction |
* | multipliction |
/ | division |
% | modulo division |
eg1:
who |awk -F ' ' 'BEGIN{print "name\ttime"} {print $1"\t"$3} END{print "haha"}'
eg2:查看每一行的列数
awk -F '\t' '{print NR ":" NF}' sed_sample.xls
eg3:查找特定行
awk '/ENSRNOT00000058031/' sed_sample.xls
eg4:提取特定的列,比如所有正在登录的用户名
awk -F: '/home/ {print $6}' /etc/passwd | awk -F / '{print $3}'
eg5:根据某一列的条件进行筛选
awk -F "\t" '{if ($9<=0.05)print $0}' RNT_vs_RNC.isoform.xls>diff.xls
awk 'NR>100 && NR<200' RNT_vs_RNC.isoform.xls
eg6:查看 gtf 文件中第三列不是 exon 的行
awk '$3 !~ /exon/' Niben101_annotation.gene_models.exon.gtf | les
ex1:
操作文件: /WORK/TRAIN/RNA/rna/HAOJING/part2/RNT_vs_RNC.isoform.xls 请完成以下操作:
1.查看该差异列表共展示多少转录本定量结果; 2.其中lncRNA明显标示的共有多少个(id为:LNC_****);
3.查看 RNT_vs_RNC.isoform.xls 文件中qvalue<=0.05的lncRNA,输出:
1)差异lnc的个数;
2)lncRNA来源基因列表;
3)lncRNA来源基因的个数(去重);
4)调参pvalue<=0.05后的结果; 5)筛除其中fpkm均为0的转录本(筛除所有样品表达量均小于0.5的转录本);
更多命令汇总
- tree
tree -C #颜色显示
tree -f #显示文件全路径
tree -L #显示路径层级
tree -P #只显示文件目录
tree -F #显示目录后面的\;显示可执行文件*;功能类似ls -F
tree -N 直接列出文件和目录名称,包括控制字符。
tree -p 列出权限标示
- read
-n(不换行) -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显)
-a :将内容读入到数值中
-n :用于限定最多可以有多少字符可以作为有效读入
-p :用于给出提示符
-r :在参数输入中,'/'表示没有输入完, /n 这类特殊字符生效
-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本
-s :不在terminal上打印
-d :表示delimiter,即定界符,一般情况下是以IFS为参数的间隔,但是通过-d,我们可以定义一直读到出现执行的字符位置。
eg1: 输入不在终端显示
read -p "Input passwd:" -s Passwd
echo $Passwd
eg2: 限时输入,否则退出
read -p "Input a number:" -t 5 Number
eg3: 读取限定字符
read -p "Input a word:" -n 5 Word
eg4:等待输出q退出
read -dq -p "Input some words end with q:" word