Shell之小tip (1)
1. 查看服务器的基本信息
CPU信息统计 mpstat 虚拟内存统计 vmstat 查看进程使用内存状况 pmap 报告设备CPU和I/O统计信息 iostat 显示所有PCI设备 lspci
2.后台运行任务
1. nohup 任务 & 2. ctrl+z放入后台 jobs查看工作号 bg %+任务号 disown -h %+任务号 相当于nohup
3. find的一些用法
find . -type f -size +100G 可以获取大小超过100G的文件 find . \( -name "*.png" -o -name "*.jpg" \)或者find . -regex ".*\(\.png\|\.jpg\)$" # 得到当前目录下所有png和jpg照片 find . -not -name *.log #查看不是log结尾的文件 find . -name *.log -exec grep -l 'Error' {} \;就可以返回所有包含Error单词的文件名 假设有个基因列表文件 (ID),有个单行序列的FASTA文件 (ehbio.fa), 运行如下命令grep -A 1 -Fw -f id ehbio.fa | grep -v -- '--'就可以批量提取序列了。 find logs -type f -mtime +5 -exec rm {} \; find . -name "*.bam" | xargs rm find . -name "*.conf" -mtime +5 -ok rm { } \; -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便 在有些操作系统中只允许-exec选项执行诸如ls或ls -l这样的命令。 exec选项后面跟随着所要执行的命令或脚本,然后是一对{},一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。 find logs -type f -mtime +5 -exec rm {} \; 在/etc目录下查找所有的目录,可以用: find /etc -type d -print 在当前目录下查找除目录以外的所有类型的文件,可以用: find . ! -type d -print 如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录 find /apps -path "/apps/bin" -prune -o -print 比如要在/home/itcast目录下查找不在dir1子目录之内的所有文件 find /home/itcast -path "/home/itcast/dir1" -prune -o -print 避开多个文件夹 find /home \( -path /home/itcast/f1 -o -path /home/itcast/f2 \) -prune -o -print 如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件 find . -name "[a-z][a-z][0-9][0-9].txt" -print 按照文件权限模式用-perm选项,按文件权限模式来查找文件的话 find . -perm 755 -print 在当前目录下查找文件长度大于1 M字节的文件 find . -size +1000000c -print 在/home/apache目录下查找文件长度恰好为100字节的文件: find /home/apache -size 100c -print 查看大的文件(例如500M以上) find . -type f -size +500M 在当前目录下查找长度超过10块的文件(一块等于512字节): find . -size +10 -print 在当前目录下查找除目录以外的所有类型的文件,可以用 find . ! -type d -print 用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。 为了在/var/adm目录下查找更改时间在3日以前的文件,可以用: $ find /var/adm -mtime +3 -print 希望在系统根目录下查找更改时间在5日以内的文件,可以用: $ find / -mtime -5 -print 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件: find . -name "*.XC" -mount -print 用grep命令在所有的普通文件中搜索hello这个词: find . -type f -print | xargs grep "hello" find . -name \* -type f -print | xargs grep "hello" #将所有以.txt结尾的文件重新命名为将.bak 结尾的文件 find . -name "*.txt" | sed "s/\.txt$//" | xargs -i echo mv {}.txt {}.bak | sh
4.文件压缩打包
tar -zcv -f folder.tar.gz folder #打包压缩文件夹(gzip格式) tar -jcv -f folder.tar.gz folder #打包压缩文件夹(bzip2格式) tar –ztv -f folder.tar.gz #查看压缩文件夹中的文件名(gzip格式) tar –jtv -f folder.tar.gz #查看压缩文件夹中的文件名(bzip2格式) tar -zxv –f folder.tar.gz #打开包并解压缩(gzip格式) tar -jxv –f folder.tar.gz #打开包解压缩(bzip2格式) gunzip命令用来解压缩文件。gunzip是个使用广泛的解压缩程序,它用于解开被gzip压缩过的文件,这些压缩文件预设最后的扩展名为.gz。事实上gunzip就是gzip的硬连接,因此不论是压缩或解压缩,都可通过gzip指令单独完成。 gzip -dc 1.gz > 1#不会删除源文件 解压缩 gzip -c 1>1.gz # 压缩 不会删除原文件
5.sed、grep、awk三剑客
grep
grep -wf 1.txt 2.txt 取两文件相同的行 grep -wvf 1.txt 2.txt 取 2 独有的文件 grep -v "NA" file.txt 反选 ***匹配**** 987-123-4567 123 456 7890 (123) 456-7890 grep -P '^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$' file.txt #正则 sed -n -r '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p' file.txt awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-([0-9]{4})$/' file.txt
sed
输出fasta中大于多少小于多少的序列: sed 'N;s/\n/\t/' test.fa | awk 'BEGIN{OFS="\t";} {if (length($2)>=18 && length($2)<=30) {print $1,"\n",$2}}' | tr -d "\t" sed N: 表示读入下一行;sed 命令每次只读一行,加上N 之后就是缓存了第2 行,所有的操作都针对第一行; # 删除每行前两个字符 sed 's/..//' tmp.txt 删除每行前k个字符,例如k=5 sed 's/.\{5\}//' tmp.txt sed -n '2~2 p' 1.txt 输出偶数行 sed -n 'n;p' 输出偶数行 sed -n '1~2 p' 1.txt 输出奇数行 类似于 sed 'n;d' 输出奇数行 sed '3{n;d}' 先匹配到第3行 再删除第4行 sed 'm, +n' 表示从m开始 向下n 行 sed ‘m~n’表示从m开始的每第n行 sed -n '/hello/, +5 p' 1.txt sed 'a$ haha' 1.txt 在文本末尾追加一句话 sed '$!N;s/\n/ /' 将相邻两行内容链接为一行 sed '/AAA/!d; /BBB/!d; /CCC/!d' 显示 包含AAA BBB CCC 的行 sed 's/bc/-&-/' testfile 123 a-bc- 456 pattern2中的&表示原文件的当前行中与pattern1相匹配的字符串 $ sed 's/\([0-9]\)\([0-9]\)/-\1-~\2~/' testfile -1-~2~3 abc -4-~5~6 sed 's/^[ \t]*//' file.txt #去除文件中开头的空格或者tab字符: sed -n '/abc/,$!p' file.txt #删除文件中行中包含abc的行及其这行以后的所有行:
awk
head -n1000 Homo_sapiens.GRCh37.75.gtf | awk '!/^#/{ print $1 "\t" $4-1 "\t" $5} ' | head -n 3 #gtf文件变bed文件 #转置文件 假如原始文本有m行n列(字段),那么转置后的文本应该有n行m列(空格分隔) awk '{for(i=1;i<=NF;i++){if(NR==1){row[i]=$i} else{row[i]=row[i]" "$i}}};END{for(i=1;i<=NF;i++){print row[i]}}' file.txt 输出fasta中大于多少小于多少的序列: sed 'N;s/\n/\t/' test.fa | awk 'BEGIN{OFS="\t";} {if (length($2)>=18 && length($2)<=30) {print $1,"\n",$2}}' | tr -d "\t" #fasta提取单个序列 awk 'BEGIN{OFS=FS="\t"}{if($0~/>/) {name=$0; sub(">", "", name);} else seq[name]=$0;}END{print ">SOX2"; print seq["SOX2"]}' test.fasta >SOX2 #求第二列百分比(只输出第二列) awk '{a[NR]=$2;sum+=$2}END{for(i=1;i<=NR;i++)printf "%.1f\n", a[i]*100/su;m}' 1.txt awk '!a[$1]++{print}' SSUnrblass.out > bestbit.blast blast #结果取最高的hit值 #重复值求和 awk '{pop[$1]+=$2}END{for (name in pop)print name "\t" pop[name]}' hekai.txt awk 'BEGIN{getline;a=$1;printf ("%s\t%s",$1,$2)}{if(a==$1){printf ","$2}else{printf "\n%s\t%s",$1,$2;a=$1}}END{printf "\n"}' hekai.txt #利用 getline 通过第一列信息判断,将第一列相同的第二列内容合并 相当于bingo的输入文件 awk '{{split($0,arrary,",");split($0,table,"\t");}{print table[1],length(arrary)}}' go2geneid.txt | sort -nr -k 2 | head #统计第二列的数量 awk 'BEGIN{OFS=FS="\t"}{if($0~/>/) {seq_name=$0;sub(">","",seq_name);}else {print seq_name,length;} }' test.fa #统计每条fasta的长度 awk '/^>/ {printf("\n%s\t",$0);next;} {printf("%s",$0);} END {printf("\n");}' test.fa | awk '{print $1,length($2)}' #fasta文件计算长度 awk '$1 ~/chr1/&& $3-$2 > 10' 1.txt awk '$1 ~/chr1|chr2/ {print $0"\t"$3-$2}' 1.txt awk 'BEGIN{s = 0};{s += ($3-$2)};END{print "mean: " s/NR};' example.bed #根据每个序列的ID中的染色体编号拆分数据 每个染色体的数据对应到各自的文件夹(>chr7:4029380-4033359 <unknown description>) awk 'BEGIN{FS = "[>:]"}{if(/^>/)(a[1]=$2);print $0 >> $2}else{print $0 >> a[1]}}'test.fa #多行转单行fasta awk '/^>/&&NR>1{print "";}{printf "%s",/^>/?$0"\n":$0}' test.fa awk '/^>/ { print n $0;} !/^>/ {printf "%s", $0, n="\n"} END {print ""}' test.fa 统计第几列为多少的有几行 awk '$6=="uncultured" {a++}END{print a}' 11.txt awk '{$NF="";print}' 删除最后一列 #去重以第一列和第二列重复的行: cat 2.txt |awk '!a[$1" "$2]++{print}' awk '!a[$0]++{print}'#去除重复的行 awk '!a[$1]++{print}'#去重第一列重复的行: awk 'BEGIN {FS="[-:\t]";OFS="\t"}{if(/^#/){print $0}else{$6=$6+$2-1;$7=$7+$2-1;$2=$3="";sub(/\t+/,"\t");print}}' target.gff|awk '!/^#/{print $0}'#输入间隔或是-:'\t' 取出单行FASTA 文件中序列长度大于40 的序列的名字 awk 'BEGIN{OFS="\t";}{if($0~/>/) {geneName=$0; sub(">","",geneName); } else \ {if (length($0)>40) print geneName;}}' test.fa 利用AWK 进行标准化 百分比 多列 awk 'ARGIND==1{if(FNR>1) {for(i=2;i<=NF;i++) sum[i]=sum[i]+$i;}}ARGIND==2{if(FNR>1) for(i=2;i<=NF;i++) {$i=$i/sum[i];} print $0;}' 1.txt 1.txt 单列 转化百分比 (需要有标题行) awk 'ARGIND==1{if(FNR>1) sum=sum+$2;}ARGIND==2{if(FNR>1) {$3=$2/sum;} print $0;}' test.expr test.expr 计算fastq文件中reads 长度的平均值: awk 'NR%4==2{sum+=length($0)}END{print sum/(NR/4)}' input.fastq #根据reads的名字,提取fastq中的reads: zcat a.fastq.gz | awk 'BEGIN{RS="@";FS="\n"}; $1~/readsName/{print $2; exit}' awk 'NR>=20&&NR<=80' input.txt 输出制定的行数: awk -F "\t" '{print NF; exit}' 1.txt 打印列数 column 可以格式化输出 使列对齐 awk '$1~ /chr1/ && $3-$2 > 10 ' 1.txt 统计一个文件中的空行数 awk '/^ *$/ {x=x+1;} END {print x;}' testfile 某种产品的库存量低于75则在行末标注需要订货: $ awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile