写shell语法细则
42. linux 加减乘除
- 处理整数运算,推荐echo $((5/2))
- 处理小数运行,推荐bc
41.加速你的sort
LC_ALL=C sort | LC_ALL=C uniq -c | sort -k2
## step1:
time less test_1000000 |sort -k 2,2n >test_1000000_sort
## step2:
(base) [19:36:43] kcao@comput17:~
$ time less test_1000000 |sort -k 2,2n >test_1000000_sort
real 0m22.362s
user 0m22.134s
sys 0m0.750s
## step3:
(base) [19:40:20] kcao@comput17:~
$ time less test_1000000 |LC_ALL=C sort -S 50% -k 2,2n >test_1000000_sort
real 0m3.148s
user 0m2.925s
sys 0m0.744s
40.查询目录及其子目录某种后缀文件
(base) [16:10:32] kcao@localhost:~/Storage_PC/other/化疗放疗3D/2020_8_4_RNA-seq/1.rawdata
$ find -type f -print |grep "1a.txt" |xargs -i cat {} >sum.txt
39.安装Seurat 缺少库文件解决
Error: package or namespace load failed for ‘png’ in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/root/R/lib64/R/library/png/libs/png.so':
libpng16.so.16: cannot open shared object file: No such file or directory
38.修改时间为北京时间
[04:09:40] root@localhost:/etc/cron.hourly
$ date
Fri Jul 31 04:10:18 EDT 2020
[04:10:18] root@localhost:/etc/cron.hourly
$ rm -rf /etc/localtime
[08:10:32] root@localhost:/etc/cron.hourly
$ ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[16:11:05] root@localhost:/etc/cron.hourly
37.如何使用docker 安装Rstudio
su ## 切到root
docker pull rocker/rstudio ## 拉取官方Rstudio
docker run -d -p 8787:8787 rocker/rstudio ## 设置端口IP
docker ps -a ## 查看镜像是否加载
xxx.xx.xx.xxx:8787 ## 浏览器登录Rstudio,密码账号都是rstudio

36.如何创建用户及其密码
[root@localhost hg38]# useradd -d /home/kcao -m kcao
[root@localhost hg38]# passwd kcao
Changing password for user kcao.
New password:
BAD PASSWORD: The password contains the user name in some form
Retype new password:
passwd: all authentication tokens updated successfully.
35.全部文件迁移到新服务器

scp -rp /home/kcao/. kcao@218.199.68.189:~
34.linux下杀死进程(kill)的N种方法
33.linux 如何对文件倒序排列
sed '1!G;h;$!d' filename
32.linux 取差集另一种方法 sort
[Linux] 取两个文件的并集/交集/差集
uniq -d是只打印重复行 -u是只打印独一无二的行
31.不知道GUN parallel?
15分钟神器gnu parallel 入门观止
如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
(atac) [14:26:56] kcao@login:~/tools/GUN_Parallel/parallel-20200522
$ wget ftp://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
$ extract parallel-latest.tar.bz2
$ cd ~/tools/GUN_Parallel/parallel-20200522
$ ./configure --prefix="/public/home/kcao/tools/GUN_Parallel"
$ make
$ make install
## 把bin 添加到环境变量
30. 万能 linux 解压缩命令
参考链接:https://github.com/AlexdeMendoza/oneliners
- 将下面命令添加到 .bashrc 文件中。
# as suggested by Mendel Cooper in "Advanced Bash Scripting Guide"
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.tar.xz) tar Jxvf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know how to extract '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
29.添加引号不同的方法
python,sed,awk ,xargs
## sed
cat input.txt | sed 's/^/"/;s/$/",/'
## awk
cat input.txt | awk '{print "\""$0"\","}'
## xargs
cat input.txt | xargs printf '"%s",\n'
28.比较两个文件不同
https://www.runoob.com/linux/linux-comm-cmp.html
- cmp
27.去除文件第一列
## 删除文件 text中第一列
# 方式一
awk '{$1="";print $0}' text
#方式二
sed -e 's/[^ ]* //' text
26.批量修改名称
(rna) [21:58:57] kcao@login:~/Work/CoBATCH/Fig1_dir/01_raw_data
$ head test
SRR8850007_1.fastq.gz
SRR8850007_2.fastq.gz
SRR8850008_1.fastq.gz
SRR8850008_2.fastq.gz
SRR8850009_1.fastq.gz
SRR8850009_2.fastq.gz
SRR8850010_1.fastq.gz
SRR8850010_2.fastq.gz
SRR8850011_1.fastq.gz
SRR8850011_2.fastq.gz
(rna) [21:59:04] kcao@login:~/Work/CoBATCH/Fig1_dir/01_raw_data
$ cat test | while read id;do A=${id%_*};B=`grep $A match.csv |awk '{print $2}' `;echo ${id/$A/$B};done |head
H3K4me3_E6.5_embryo_rep1_1.fastq.gz
H3K4me3_E6.5_embryo_rep1_2.fastq.gz
H3K4me3_E6.5_embryo_rep2_1.fastq.gz
H3K4me3_E6.5_embryo_rep2_2.fastq.gz
H3K4me3_E7.0_embryo_rep1_1.fastq.gz
H3K4me3_E7.0_embryo_rep1_2.fastq.gz
H3K4me3_E7.0_embryo_rep2_1.fastq.gz
H3K4me3_E7.0_embryo_rep2_2.fastq.gz
H3K4me3_E7.75_embryo_rep1_1.fastq.gz
H3K4me3_E7.75_embryo_rep1_2.fastq.gz
25.如何用grep 来匹配双引号
单引号所见及所得,将双引号放到单引号里面。
cat test.txt |while read id;do grep '"'$id'"' mm10_gene_tmp ;done
24.将多行变成一行展示
#mapping
echo -e "sample\tmapping\trmdup\tuniq" >align.stat; for f in *.sam.bam;do file=${f/.sam.bam/};echo $file;for type in sam rmdup uniq;do grep "properly" $file.$type.flagstat|sed "s/ .*//";done|sed ':a;N;s/\n/\t/;ta;' ;done|sed 'N;s/\n/\t/ '>>align.stat
说明:sed默认只按行处理,N可以让其读入下一行,再对\n进行替换,这样就可以将两行并做一行。但是怎么将所有行并作一行呢?可以采用sed的跳转功能。:a 在代码开始处设置一个标记a,在代码执行到结尾处时利用跳转命令t a重新跳转到标号a处,重新执行代码,这样就可以递归的将所有行合并成一行。
23.Linux Shell 只列出目录的方法
## 简单的方法,列出所有的SRR目录
ls -d SRR*/
22.修改命令行颜色
PS1="\e[0;34;1m[\u@\h \W]\$ \e[m"
## 推荐vi ~/.bashrc
export PS1="[\[\033[01;33m\]\t\[\033[00m\]]\[\033[01;31m\] \u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n$ "
21.Linux shell 从文件中随机选择内容
# 使用sort 命令将文件随机排序,选择前100行
sort --random-sort file | head -n 100
20.Linux curl与wget 命令的区别和联系
- 1、curl支持的通讯协议更多、更好。
- 2、curl需要libcurl库。
- 3、wget 可以递归抓数据(作为简单的爬虫)。还支持断点续传。
- 4、curl支持变量,可以批量抓页面。
19.find 详细实例
18.等待提交后台任务跑完,执行下一条命令 ---wait
如下:
# cat test.sh
test(){
echo $1 "is begin ";
sleep $1;
wait;
echo $1 "is finished";
}
for i in {5..1};do
test $i &
done ;
wait
echo "all finished"
sh test.sh
5 is begin
4 is begin
3 is begin
2 is begin
1 is begin
1 is finished
2 is finished
3 is finished
4 is finished
5 is finished
all finished
17.sort 你会了吗

16.批量kill 任务- 参考孟浩魏snakemake
(py3) [kcao@h1-lgl 10-2019_AR_sklearn]$ ps|cut -d ' ' -f 1|xargs kill
15.匹配两个pattern 之间内容
替换换行符
两行并一行 sed 'N;s/\n/ / '
全部并一行 sed ':a;N;s/\n/ /;ta;'
全部并一行 cat ttt |tr "\n" " "

- 下面克服的问题: awk '//,//' 1.txt 中匹配项不能是变量。
#! bin/bash
meme="HOCOMOCOv11_full_HUMAN_mono_meme_format.meme"
head -n 9 ${meme}> tf_list.meme
## meme
cat TF_list.txt |while read id;do
echo $id
echo ${id}|xargs -i awk '/{}/,/URL/' HOCOMOCOv11_full_HUMAN_mono_meme_format.meme >>tf_list.meme
echo >>tf_list.meme
done
14.${} 用法
- linux默认值设定 :VCF_DIR
#
# Note: Put all vcf.gz files at VCF_DIR
#
ARRAY=($(ls ${VCF_DIR:-.}/*.vcf.gz))
#数组每个元素添加"-i "
EXPANDED=()
for E in "${ARRAY[@]}"; do
EXPANDED+=("-i ${E}")
done
EXPANDED=()
for E in "${ARRAY[@]}"; do EXPANDED=(${EXPANDED[*]} "-i ${E}"); done
13.特殊符号$0
,$#
,$*

12.输出文件最后一行多种方法
1.awk 'END {print}'
2.sed -n '$p'
3.sed '$!N;$!D'
4.awk '{b=a"\n"$0;a=$0}END{print b}'
5.tail -n 1
11.find 查找
[kcao@comput16 001.CTCF]$ find ./ -name "*peak*" -type f |while read id;do echo `dirname $id`/fastq;done
./1.Diff_peak_total/fastq
./2.LNCaP_private_peak/fastq
./3.PC3_private_peak/fastq
10. linux 大括号功能

还有如下:
字符串长度:echo ${#id}
正则匹配:echo ${id/s*s/}
9.提取字符串最后一个字符
echo ${A:0-1:1}
https://blog.51cto.com/green906/1791108
8 awk 提取多个分隔符方法;如vcf 文件
[kcao@login LNCaP_generate_peak]$ echo $A
1 3552841 . G . 32.995 . DP=1;MQ0F=0;AF1=0;AC1=0;DP4=1,0,0,0;MQ=40;FQ=-29.9912 GT:PL:DP 0/0:0:1
[kcao@login LNCaP_generate_peak]$ echo $A|awk 'BEGIN{FS=" |;|="}{print $9}'
1
##或者split函数
$ grep -v "#" XXX.vcf.snpeff|grep -v "INDEL" |head|awk '{split($8,array,";|=");print array[2]} '
$ grep -v "#" XXX.vcf.snpeff|grep -v "INDEL" |awk '{split($8,array,";|=");if (array[2]>=30 && $6>=200)print $0} '|wc -l
7.如何提取字节


tips:当我们从Ensembel 中下载,toplevel 参考基因组fa文件,我们需要将该文件拆分,之后再合并。

6.理解管道符与Xarsg 差异
可以看到 echo '--help' | cat 该命令输出的是echo的内容,也就是说将echo的内容当作cat处理的文件内容了,实际上就是echo命令的输出通过管道定向到cat的输入了。然后cat从其标准输入中读取待处理的文本内容。这等价于在test.txt文件中有一行字符 '--help' 然后运行 cat test.txt 的效果。

快速切换到某个命令的上一级目录(cd 居然不能接管道符)
(py3) [kcao@h1-lgl ~]$ which wapiti
~/test/Bio-TM/kcao/Wapiti/wapiti
(py3) [kcao@h1-lgl ~]$ cd `echo $(which wapiti)|xargs dirname `
(py3) [kcao@h1-lgl Wapiti]$
5.1>&2;2>&1,&>xx.txt
(py3) [kcao@h1-lgl 2019SpringTextM]$ echo log > /dev/null 2>&1
(py3) [kcao@h1-lgl 2019SpringTextM]$ echo log > /dev/null 1>&2
log
4. 正则表达式linux
cut -b1-3
3.如何删除误提交到后台的命令(赶紧kill哦)
方法一:killall命令
-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。
此命令很直接粗暴,操作简单。
killall -name yourname 或者
killall R 杀掉所有R进程
方法二:ps+grep+xargs+kill
比如kill yourname 的所有进程
ps au|grep yourname|awk '{print $2}' |xargs kill
ps:输出所有进程
grep:提取yourname的进程
awk:获取对应的PID
xargs+kill :杀掉获得的PID
2.Linux报错:bash:vi:command not find 如何解决
1.shell计算中使用除法,基本默认上都是整除。
比如:
num1=2
num2=3
num3=`expr $num1 / $num2`
这个时候num3=0 ,是因为是因为expr不支持浮点除法
解决的方法:
num3=`echo "scale=2; $num1/$num2" | bc`
使用bc工具,scale控制小数点后保留几位
还有一种方法
awk 'BEGIN{printf "%.2f\n",’$num1‘/’$num2‘}'
如果用百分比表示
awk 'BEGIN{printf "%.2f%\n",(’$num1‘/’$num2‘)*100}'
网友评论