美文网首页
Shell之小tip (1)

Shell之小tip (1)

作者: 凯凯何_Boy | 来源:发表于2020-06-14 17:11 被阅读0次

    1.查看服务器的基本信息

    CPU信息统计  mpstat
    虚拟内存统计    vmstat
    查看进程使用内存状况  pmap
    报告设备CPU和I/O统计信息  iostat
    显示所有PCI设备  lspci
    

    2.后台运行任务

    1. nohup  任务 &
    2. ctrl+z放入后台
       jobs查看工作号
       bg %+任务号 
       disown -h %+任务号 相当于nohup
    
    1. 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
    

    相关文章

      网友评论

          本文标题:Shell之小tip (1)

          本文链接:https://www.haomeiwen.com/subject/dmoxxktx.html