Shell之小tip (1)

简介: Shell之小tip :1. 查看服务器的基本信息。2.后台运行任务。3. find的一些用法。4.文件压缩打包5.sed、grep、awk三剑客。

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


相关文章
|
6月前
|
Shell
Shell | Hello World
Shell | Hello World
30 0
|
Shell
shell之case用法
shell之case用法
98 0
|
Shell 应用服务中间件 nginx
shell脚本-find
find查询服务器内文件
109 0
|
Shell Linux 开发工具
shell 之hello world
shell 之hello world
137 0
|
Shell 网络安全
shell expect简单用法
#!/usr/bin/expect -f spawn ssh-keygen -t rsa expect "*(/root/.ssh/id_rsa):" send "\r" expect "*(empty for no passphrase):" sen...
1228 0
|
Shell Linux
shell之if和case
语法 image.png if样例1 image.png 赋权并运行 image.png if样例2 说明:if 和中括号之间没有空格 if样例2 说明:if 和中括号之间没有空格 运行 运行 if样例3 说明:else后面没有then image.
1047 0
|
Shell Python Ubuntu