今天的主要任务是练习linux基础命令,然后结合实例练习一下三个重要的命令awk、sed、grep
基础命令:
-
pwd
显示当前目录。print word directory
-
ls
我一般常用的是ll
(ll=ls -l
mac下是没有这个的噢,要自己手动添加的. 添加方法参考这个: https://blog.csdn.net/sway_wu/article/details/82992359)
后来经常用ll -th
:
-l
列出详细信息
-t
按修改时间排序
-h
文件大小按照适合人阅读的方式显示
其他可考虑参数:
-r
倒序排序 reverse
--color=auto
根据输出结果类型上色
-
cd
常用的是:
cd ~
因为~
代表家目录,这条命令能快速回到家目录(如果是root的话就是到 /root
,如果是普通用户的话就到/home/用户名
)
cd -
回到刚才那一层目录,就像电视机遥控器上的返回按钮,能在固定的两个台之间左右横跳
cd ..
切换到上一级目录
-
mkdir
今天新学会了一个命令:
mkdir $(date +%F)
可以创建以今天日期为名称的目录
$ mkdir $(date +%F)
$ ll
drwxrwxr-x. 2 n1806171b n1806171b 0 Jun 4 18:10 2019-06-04
太酷了!谢谢豆花!
-
rmdir
这是个我不常用的命令。
如何一次性删掉当前目录下的所有空文件夹:
find . -type d -empty -print | xargs rmdir
这条命令说了啥呢?
find .
查找当前目录下的所有文件。
那接下来的问题就是,按照什么条件来查找呢?
-type d
d就是directory,就是文件夹啦。那是什么样的文件夹呢?
-empty
空的文件夹噢。找到之后呢
|
管道符交给后面的命令咯
| xargs
就是把前面的输出当作后面的命令的输入。输入到哪里去呢?
rmdir
删除掉空的文件夹。相当于执行了rmdir ManyEmptyDir
这样的命令。
看懵了吗?懵了也没关系噢,多用就会啦,不难哒。
-
rm
啊哈。删库警告⚠️!
rm -rf /
千万别用这个噢,特别是当你有root权限的时候,除非你决定要删库跑路了 ( •̀ ω •́ )✧
-r
recursive, 就是会把文件夹下的内容一起递归删除
-f
force, 强制删除。
-
touch
“摸”一个文件出来
-
mv
这个命令有两个功能:一个是移动,一个是重命名。那啥时候是移动啥时候是重命名呢?
视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。
参考自: https://blog.csdn.net/mosesmo1989/article/details/51094378/
I hope I make myself clear enough.
-
cat
把文件内容在标准输出(即屏幕上)全部打印出来。
今天新学会一个功能:重定向输出文件
$ cat > test.txt
Moran, can you hear me?
loving you~
在这个模式下,如果打错了字想要删掉,按backspace是不够的,你会发现不但要删的东西没删掉,反而还多了一些奇怪的字符
$ cat > test.txt
I made a typo heree^H^H^H^H^H
那个^H
就是按退格产生的,这时候不要慌,按住Ctrl
再按退格就能正常删除啦。
-
less
less -SN
-S
--chop-long-lines Chop (truncate) long lines rather than wrapping.
-N
加上行号
-
head & tail
望文生义,这俩命令一个是看文件的头,一个是看文件的尾的。
一般会加一个 -n
参数来设定看头(尾)的多少行,默认是10行。
也可以更偷懒一些, 直接把-n 12
合并成-12
, 例如:
head -n 12 <MYFILE>
head -12 <MYFILE>
tail -20 <MYFILE>
-
|
管道符。这个特有意思,特别是结合xargs
的时候。管道呢,就是把前一个命令的结果当作后一段命令的输入,例如
ls *.bam | xargs -l -I {} echo samtools flagstat {} \> {}.stat > flagstat.sh
这个一大串的命令说了啥呢?首先,ls *.bam
是显示出了当前目录下所有以.bam
为结尾的文件,把它交给下面这一段命令作为它的输入。
下面这个xargs -l
是把输入变成一行一个文件的格式,之后-I {}
是用{}
这个作为符号,代替输入的文件。echo
到后面的内容则是输出命令。
练习题
- 在主目录下面创建/tmp文件夹,并且使其中包含 1/2/3/4/5 格式的文件夹系列
- 在创建好的文件夹下面,比如我的是 /home/u1239/tmp/1/2/3/4/5 ,里面创建文本文件 xi.txt,并输入内容,例如Hello world, Welcome to bioinfoplanet, Nice to see you。三句话分行显示
- 在tmp/下创建 1~5这5个文件夹,然后每个文件夹下面继续创建 1~5这5个文件夹, 并查看
- 增加一点难度:我想在练习三的每个目录中都放进去一个文件xi.txt,内容还是练习二的内容
- 下载 http://www.biotrainee.com/jmzeng/igv/test.bed 文件,统计该文件总共有几行,含有 H3K4me3 的是第几行
- 下载 http://www.biotrainee.com/jmzeng/rmDuplicate.zip 文件,并且解压,查看里面的文件夹结构 (提示:了解tree命令)
- 考察的是mkdir的-p参数
(怎么查看参数呢?敲mkdir --help
或者man mkdir
就好啦,man是manual,也可以理解成有困难找男人来帮忙( •̀ ω •́ )✧)
-p --parents no error if existing, make parent directories as needed
$ mkdir -p tmp/1/2/3/4/5
$ tree tmp/
tmp/
└── 1
└── 2
└── 3
└── 4
└── 5
5 directories, 0 files
- 考察的就是今天新学的
cat > xi.txt
命令啦。
$ cat > tmp/1/2/3/4/5/xi.txt
Hello world
Welcome to bioinfoplanet
Nice to see you
^C
$ cat tmp/1/2/3/4/5/xi.txt
Hello world
Welcome to bioinfoplanet
Nice to see you
- 这道题考察的是批量创建,关键是用
{1..5}
来一次性批量生成文件夹。文件夹得一级一级来创建,否则会报错噢。
$ mkdir tmp
$ mkdir tmp/{1..5}
$ mkdir tmp/{1..5}/{1..5}
$ tree tmp/
tmp/
├── 1
│ ├── 1
│ ├── 2
│ ├── 3
│ ├── 4
│ └── 5
├── 2
│ ├── 1
│ ├── 2
│ ├── 3
│ ├── 4
│ └── 5
├── 3
│ ├── 1
│ ├── 2
│ ├── 3
│ ├── 4
│ └── 5
├── 4
│ ├── 1
│ ├── 2
│ ├── 3
│ ├── 4
│ └── 5
└── 5
├── 1
├── 2
├── 3
├── 4
└── 5
30 directories, 0 files
- 这个问题确实有点点难,查了一下才找到思路。
就是借助管道符,把本来要做25次的命令一次性生成好。
把要移动的文件夹作为管道符的输入,输入的内容会被补充到最命令的后面。
所以其实最基础的命令就是cp xi.txt tmp/1/1
这样的模式,只是借助管道符一次全部做完而已。看起来有点难,想清楚就不难。用tree查看的时候,增加一个-h
参数能够显示出文件的大小,可以看到确实是把生成的xi.txt
文件放进去了(大小为53字节的文件),而不是在每个文件夹下面创建一个空的xi.txt
$ ll xi.txt
-rw-rw-r--. 1 n1806171b n1806171b 53 Jun 4 22:08 xi.txt
$ cat xi.txt
Hello world
Welcome to bioinfoplanet
Nice to see you
$ echo tmp/*/* | xargs -n 1 cp xi.txt
$ tree -h tmp/
tmp/
├── [ 95] 1
│ ├── [ 24] 1
│ │ └── [ 53] xi.txt
│ ├── [ 24] 2
│ │ └── [ 53] xi.txt
│ ├── [ 24] 3
│ │ └── [ 53] xi.txt
│ ├── [ 24] 4
│ │ └── [ 53] xi.txt
│ └── [ 24] 5
│ └── [ 53] xi.txt
├── [ 95] 2
│ ├── [ 24] 1
│ │ └── [ 53] xi.txt
│ ├── [ 24] 2
│ │ └── [ 53] xi.txt
│ ├── [ 24] 3
│ │ └── [ 53] xi.txt
│ ├── [ 24] 4
│ │ └── [ 53] xi.txt
│ └── [ 24] 5
│ └── [ 53] xi.txt
├── [ 95] 3
│ ├── [ 24] 1
│ │ └── [ 53] xi.txt
│ ├── [ 24] 2
│ │ └── [ 53] xi.txt
│ ├── [ 24] 3
│ │ └── [ 53] xi.txt
│ ├── [ 24] 4
│ │ └── [ 53] xi.txt
│ └── [ 24] 5
│ └── [ 53] xi.txt
├── [ 95] 4
│ ├── [ 24] 1
│ │ └── [ 53] xi.txt
│ ├── [ 24] 2
│ │ └── [ 53] xi.txt
│ ├── [ 24] 3
│ │ └── [ 53] xi.txt
│ ├── [ 24] 4
│ │ └── [ 53] xi.txt
│ └── [ 24] 5
│ └── [ 53] xi.txt
└── [ 95] 5
├── [ 24] 1
│ └── [ 53] xi.txt
├── [ 24] 2
│ └── [ 53] xi.txt
├── [ 24] 3
│ └── [ 53] xi.txt
├── [ 24] 4
│ └── [ 53] xi.txt
└── [ 24] 5
└── [ 53] xi.txt
30 directories, 25 files
- 考察下载的wget命令,统计行数的wc命令,还有查找的grep命令。
wc -l
统计行数
grep
查找,-n
显示行号。
$ wget http://www.biotrainee.com/jmzeng/igv/test.bed
$ cat test.bed | wc -l
10
$ grep -n 'H3K4me3' test.bed
8:chr1 9810 10438 ID=SRX387603;Name=H3K4me3%20(@%20HMLE);Title=GSM1280527:%20HMLE%20Twist3D%20H3K4me3%20rep2%3B%20Homo%20sapiens%3B%20ChIP-Seq;Cell%20group=Breast;<br>source_name=HMLE_Twist3D_H3K4me3;cell%20type=human%20mammary%20epithelial%20cells;transfected%20with=Twist1;culture%20type=sphere;chip%20antibody=H3K4me3;chip%20antibody%20vendor=Millipore; 222 . 9810 10438 0,226,255
- 考察wget,unzip和tree
$ wget http://www.biotrainee.com/jmzeng/rmDuplicate.zip
$ unzip rmDuplicate.zip
$ tree -pghD rmDuplicate
rmDuplicate
├── [drwxrwxr-x n1806171b 48 Nov 12 2016] picard
│ ├── [drwxrwxr-x n1806171b 244 Nov 12 2016] paired
│ │ ├── [-rw-rw-r-- n1806171b 351 Nov 12 2016] readme.txt
│ │ ├── [-rw-rw-r-- n1806171b 3.0K Nov 12 2016] tmp.header
│ │ ├── [-rw-rw-r-- n1806171b 2.7K Nov 12 2016] tmp.MarkDuplicates.log
│ │ ├── [-rw-rw-r-- n1806171b 2.0K Nov 12 2016] tmp.metrics
│ │ ├── [-rw-rw-r-- n1806171b 952 Nov 12 2016] tmp.rmdup.bai
│ │ ├── [-rw-rw-r-- n1806171b 4.8K Nov 12 2016] tmp.rmdup.bam
│ │ ├── [-rw-rw-r-- n1806171b 11K Nov 12 2016] tmp.sam
│ │ └── [-rw-rw-r-- n1806171b 4.4K Nov 12 2016] tmp.sorted.bam
│ └── [drwxrwxr-x n1806171b 281 Nov 12 2016] single
│ ├── [-rw-rw-r-- n1806171b 351 Nov 12 2016] readme.txt
│ ├── [-rw-rw-r-- n1806171b 16K Nov 12 2016] tmp.header
│ ├── [-rw-rw-r-- n1806171b 3.1K Nov 12 2016] tmp.MarkDuplicates.log
│ ├── [-rw-rw-r-- n1806171b 969 Nov 12 2016] tmp.metrics
│ ├── [-rw-rw-r-- n1806171b 3.9K Nov 12 2016] tmp.rmdup.bai
│ ├── [-rw-rw-r-- n1806171b 9.5K Nov 12 2016] tmp.rmdup.bam
│ ├── [-rw-rw-r-- n1806171b 11K Nov 12 2016] tmp.sam
│ └── [-rw-rw-r-- n1806171b 10K Nov 12 2016] tmp.sorted.bam
└── [drwxrwxr-x n1806171b 48 Nov 12 2016] samtools
├── [drwxrwxr-x n1806171b 213 Nov 12 2016] paired
│ ├── [-rw-rw-r-- n1806171b 354 Nov 12 2016] readme.txt
│ ├── [-rw-rw-r-- n1806171b 3.0K Nov 12 2016] tmp.header
│ ├── [-rw-rw-r-- n1806171b 4.3K Nov 12 2016] tmp.rmdup.bam
│ ├── [-rw-rw-r-- n1806171b 1.8K Nov 12 2016] tmp.rmdup.vcf.gz
│ ├── [-rw-rw-r-- n1806171b 11K Nov 12 2016] tmp.sam
│ ├── [-rw-rw-r-- n1806171b 4.4K Nov 12 2016] tmp.sorted.bam
│ └── [-rw-rw-r-- n1806171b 1.8K Nov 12 2016] tmp.sorted.vcf.gz
└── [drwxrwxr-x n1806171b 213 Nov 12 2016] single
├── [-rw-rw-r-- n1806171b 355 Nov 12 2016] readme.txt
├── [-rw-rw-r-- n1806171b 16K Nov 12 2016] tmp.header
├── [-rw-rw-r-- n1806171b 8.8K Nov 12 2016] tmp.rmdup.bam
├── [-rw-rw-r-- n1806171b 4.8K Nov 12 2016] tmp.rmdup.vcf.gz
├── [-rw-rw-r-- n1806171b 11K Nov 12 2016] tmp.sam
├── [-rw-rw-r-- n1806171b 10K Nov 12 2016] tmp.sorted.bam
└── [-rw-rw-r-- n1806171b 4.8K Nov 12 2016] tmp.sorted.vcf.gz
6 directories, 30 files
顺便查了一下unzip和gunzip的区别
zip 压缩的后文件是 *.zip ,而 gzip 压缩后的文件 *.gz
附录:
tree命令行参数:
-a 显示所有文件和目录。
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-d 显示目录名称而非内容。
-D 列出文件或目录的更改时间。
-f 在每个文件或目录之前,显示完整的相对路径名称。
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-I 不显示符合范本样式的文件或目录名称。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P 只显示符合范本样式的文件或目录名称。
-q 用"?"号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
-t 用文件和目录的更改时间排序。
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。
参考自:https://www.jianshu.com/p/15a96c1de695