美文网首页
linux 小技能(持续更新)

linux 小技能(持续更新)

作者: caokai001 | 来源:发表于2019-04-19 10:22 被阅读0次

写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
image.png

36.如何创建用户及其密码

linux如何查看所有的用户和组信息?

[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 参数

image.png
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 你会了吗

image.png

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" " "
image.png
  • 下面克服的问题: 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$#,$*

image.png

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.如何提取字节

awk substr()
image.png

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

image.png

6.理解管道符与Xarsg 差异

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

image.png

快速切换到某个命令的上一级目录(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}'

相关文章

网友评论

      本文标题:linux 小技能(持续更新)

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