grep命令作用比较单一,用法也不复杂,但使用的场景非常多,如能灵活使用该命令,可以完成很多只有编程才能完成的任务。
显示匹配某一模式的行
grep [option] pattern [file]
-E 用扩展的正则表达式解释模式pattern(相当于egrep命令) -i 忽略大小写 -v 反向匹配(匹配不包含模式pattern的行) -c 输出匹配的行的数目,而不是输出匹配的行本身 -A n 输出匹配的行及该行后面n行 -B n 输出匹配的行及该行前面n行 -C n 输出匹配的行及该行前后各n行
1. 查找一个文件中包含某个模式的行:
[peter@ibi98 prac]$ ll 总用量 8 -rw-rw-r-- 1 peter peter 6453 3月 12 16:07 at_hap3_cds.fa [peter@ibi98 prac]$ head at_hap3_cds.fa >AT5G47670 ATGGAACGTGGAGGCTTCCATGGCTACCGCAAGCTGTCCGTGAACAACACCACTCCTTCTCCACCAGGAT TAGCAGCGAATTTTCTGATGGCAGAGGGCAGTATGCGTCCTCCAGAATTCAACCAGCCTAACAAAACCAG TAATGGTGGTGAGGAGGAGTGCACGGTGAGGGAGCAAGACAGGTTCATGCCTATTGCCAACGTGATACGG ATCATGCGGAGGATCTTACCTGCTCACGCCAAGATCTCAGATGACTCCAAGGAGACGATCCAAGAGTGTG TTTCGGAGTACATCAGCTTCATAACAGGGGAGGCTAATGAGCGGTGCCAGCGGGAACAGCGCAAGACCAT CACTGCTGAGGACGTCTTGTGGGCAATGAGCAAGCTCGGTTTTGATGACTACATCGAACCCCTCACGTTG TACCTCCACCGCTACAGAGAGTTGGAAGGTGAAAGAGGGGTTAGCTGCAGTGCTGGGTCCGTTAGTATGA CCAACGGCTTGGTGGTCAAGAGGCCTAATGGGACCATGACCGAGTATGGAGCCTACGGGCCTGTGCCAGG GATTCACATGGCGCAGTACCATTATCGTCATCAGAACGGGTTTGTTTTCAGTGGTAACGAACCTAATTCT [peter@ibi98 prac]$ grep '>' at_hap3_cds.fa >AT5G47670 >AT1G09030 >AT1G21970 >AT2G13570 >AT2G37060 >AT2G38880 >AT2G47810 >AT3G53340 >AT4G14540 >AT5G47640 >CrHAP3
由于“>”是重定向符号,因此搜索该符号时需要在两边添加引号(这里单引号和双引号都可以,后面我们将学习这两种引号的区别),否则系统会将“>”识别成重定向符号,导致命令缺少输入而停留在等待输入的状态。
2. 查找一个命令执行结果中包含某个模式的行,如查找ps命令(查看进程信息的命令)结果中某个进程的信息:
[peter@ibi98 prac]$ ps -ef |grep httpd
apache 14216 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
apache 14217 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
apache 14218 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
apache 14219 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
apache 14220 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
apache 14221 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
apache 14222 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
apache 14223 28046 0 03:18 ? 00:00:00 /usr/sbin/httpd -k start
peter 24327 23595 0 16:16 pts/19 00:00:00 grep --color=auto httpd
root 28046 1 0 2016 ? 00:05:14 /usr/sbin/httpd -k start
3. 去掉文件中包含某个模式的行:
[peter@ibi98 prac]$ cat at_LEC1_CDS.fa >AT1G21970 At_NM_102046 ATGGAACGTGGAGCTCCCTTCTCTCACTATCAGCTACCAAAATCCATCTCTGAATTGAACTTGGACCAGC ACAGCAACAACCCAACCCCAATGACCAGCTCAGTCGTAGTAGCCGGCGCCGGTGACAAGAACAATGGTAT CGTGGTCCAGCAGCAACCACCATGTGTGGCTCGTGAGCAAGACCAATACATGCCAATCGCAAACGTCATA AGAATCATGCGTAAAACCTTACCGTCTCACGCCAAAATCTCTGACGACGCCAAAGAAACGATTCAAGAAT GTGTCTCCGAGTACATCAGCTTCGTGACCGGTGAAGCCAACGAGCGTTGCCAACGTGAGCAACGTAAGAC CATAACTGCTGAAGATATCCTTTGGGCTATGAGCAAGCTTGGGTTCGATAACTACGTGGACCCCCTCACC GTGTTCATTAACCGGTACCGTGAGATAGAGACCGATCGTGGTTCTGCACTTAGAGGTGAGCCACCGTCGT TGAGACAAACCTATGGAGGAAATGGTATTGGGTTTCACGGCCCATCTCATGGCCTACCTCCTCCGGGTCC TTATGGTTATGGTATGTTGGACCAATCCATGGTTATGGGAGGTGGTCGGTACTACCAAAACGGGTCGTCG GGTCAAGATGAATCCAGTGTTGGTGGTGGCTCTTCGTCTTCCATTAACGGAATGCCGGCTTTTGACCATT ATGGTCAGTATAAGTGA [peter@ibi98 prac]$ grep -v '>' at_LEC1_CDS.fa ATGGAACGTGGAGCTCCCTTCTCTCACTATCAGCTACCAAAATCCATCTCTGAATTGAACTTGGACCAGC ACAGCAACAACCCAACCCCAATGACCAGCTCAGTCGTAGTAGCCGGCGCCGGTGACAAGAACAATGGTAT CGTGGTCCAGCAGCAACCACCATGTGTGGCTCGTGAGCAAGACCAATACATGCCAATCGCAAACGTCATA AGAATCATGCGTAAAACCTTACCGTCTCACGCCAAAATCTCTGACGACGCCAAAGAAACGATTCAAGAAT GTGTCTCCGAGTACATCAGCTTCGTGACCGGTGAAGCCAACGAGCGTTGCCAACGTGAGCAACGTAAGAC CATAACTGCTGAAGATATCCTTTGGGCTATGAGCAAGCTTGGGTTCGATAACTACGTGGACCCCCTCACC GTGTTCATTAACCGGTACCGTGAGATAGAGACCGATCGTGGTTCTGCACTTAGAGGTGAGCCACCGTCGT TGAGACAAACCTATGGAGGAAATGGTATTGGGTTTCACGGCCCATCTCATGGCCTACCTCCTCCGGGTCC TTATGGTTATGGTATGTTGGACCAATCCATGGTTATGGGAGGTGGTCGGTACTACCAAAACGGGTCGTCG GGTCAAGATGAATCCAGTGTTGGTGGTGGCTCTTCGTCTTCCATTAACGGAATGCCGGCTTTTGACCATT ATGGTCAGTATAAGTGA
这里,grep命令加了-v选项,会输出不包含“>”的行,实际上就是相当于把包含“>”的行过滤掉了。
4. 统计包含某个模式的行的数量:
[peter@ibi98 prac]$ grep -c '>' at_hap3_cds.fa
11
因为Fasta格式的序列数据每个序列均以“>”开头,所以“>”的个数就是序列的个数,因此可以用该命令统计一个Fasta格式文件中的序列的数目。
上面只是给出了grep命令的几种常见用法,该命令还有很多其他用法,以后的学习中还会经常用到该命令,希望能熟练掌握该命令。