[ubuntu入门手册]-15-正则表达式与管道命令基础

引言

这篇文章介绍几个使用最频繁的正则表达式,配合管道命令进行简单的文字处理与统计,这仅仅是正则表达式的冰山一角,更多的使用方法和组合,还有待大家在工作中不断去发掘。

文章目录

0×1.正则表达式基础

首先介绍几个常用的正则表达式:

* 通配符,可以代替所有字符,表示一个或多个字符
? 通配符,可以代替单个字符,表示一个字符
! 不包含,感叹号后面是不被包含的字符
[] 中括号中可以指定字符范围,占一个字符位
\ 可以输出特殊字符,同样功能的还有单引号
^ 表示开头
$ 表示结尾

下面用一个实例来演示这些正则表达式:

					#a.显示以1或者2开头的文件,比如1sdsd,2333,2fd等
					qing@qingsword.com:~$ ls [12]* 

					#b.显示2和2之间只有一个字符的文件,比如212,222,2s2,2a2等
					qing@qingsword.com:~$ ls 2?2

					#c.删除当前目录下末尾不为1的文件或文件夹
					qing@qingsword.com:~$ rm *[!1]

					#d.删除点号前第二个不为a的文件
					qing@qingsword.com:~$ rm *[!a]?.* 

					#e.显示点号前第二位在1-8之间(包含1和8)的文件 
					qing@qingsword.com:~$ ls *[1-8]?.*  

					#f.查找当前文件夹下文件名第一位数字在1到5范围内的文件(包含1和5)
					qing@qingsword.com:~$ find . -name '[1-5]*' 

					#g.使用反斜杠可输出特殊字符,包括反斜杠本身,单引号也有相同功能,建议使用反斜杠
					qing@qingsword.com:~$ echo \\\\hello
					\\hello
					qing@qingsword.com:~$ echo '\\'hello
					\\hello
					qing@qingsword.com:~$ echo \"hello\"
					"hello"
					qing@qingsword.com:~$ echo "hello"
					hello 

					#h.查找当前文件夹下以"!字符开头的文件,使用touch创建文件时也需要使用反斜杠,例如touch \"\!filename
					qing@qingsword.com:~$ find . -name \"\!*
					

0×2.管道命令基础

命令中的管道符号|(键盘按住shift+\),它将前面一条命令的结果传递给后面一条命令处理,只要你愿意,可以连续使用N个管道符号来连接N+1条命令,请看下面的实例:

					#a.将ls的显示结果传递给grep通过正则表达式来筛选,显示当前目录以数字2到5开头的文件。
					qing@qingsword.com:~$ ls | grep ^[2-5]

					#b.显示当前目录以e结尾的文件
					qing@qingsword.com:~$ ls | grep e$    

					#c.不显示当前目录以字母o到z结尾的文件,注意^符号在中括号内和中括号外的区别
					qing@qingsword.com:~$ ls | grep [^o-z]$

					#d.不显示当前目录以单个字符e结尾的文件
					qing@qingsword.com:~$ ls | grep [^e]$
					

下面介绍几个配合管道使用最多的文字处理和统计命令:

wc 统计行数,字数,字符数
cut 对文本进行分块提取
sort 对文本排序,默认从小到大,先数字再字母
uniq 去除相邻重复行,先sort再uniq可以去除所有重复行
tee 将管道前面命令所得结果输出成为一个文件,再将结果传递给后面的命令
tr 字符操作,最常用的是大小写转换与删除文本中指定字符
split 分割文件,最常用的是使用行数或文件大小来分割
< 重定向符

使用演示:

					##wc实例演示
					#a.wc使用参数l计算,显示当前文件夹下数字1到3开头的文件的数量
					qing@qingsword.com:~$  ls | grep ^[1-3] | wc -l   

					#b.wc统计/etc/passwd文件的字符,文字,行数
					qing@qingsword.com:~$ cat /etc/passwd | wc -m  #多少字符
					qing@qingsword.com:~$ cat /etc/passwd | wc -w  #多少字
					qing@qingsword.com:~$ cat /etc/passwd | wc -l  #多少行

					##cut实例演示
					#a.将group文件每一行内容以":"分割并且提取第1块的内容显示,既用户名,如果要提取第二块显示就是-f2,以此类推
					qing@qingsword.com:~$ cat /etc/group | cut -d ":" -f1

					#b.提取group文件中每一行第3到第4个字符的内容显示  
					qing@qingsword.com:~$ cat /etc/group | cut -c3-4

					##uniq和sort实例演示
					#a.对testfile文件中的内容进行sort排序,然后再去除相邻重复行
					qing@qingsword.com:~$ more testfile | sort | uniq

					##tee命令实例
					#a.先对testfile文件内容进行sort排序,将排序结果tee输出到tee.sort文件中,再将sort排序后的结果传递给uniq去除相邻重复行,最后将uniq的结果再输出到另外一个文件tee.uniq中,最后在屏幕上输出uniq后的结果
					qing@qingsword.com:~$ more testfile |sort|tee tee.sort| uniq | tee tee.uniq

					##tr命令实例
					#a.将当前目录文件名,小写转换大写,反之大写转小写('[A-Z]' '[a-z]')
					qing@qingsword.com:~$ ls | tr '[a-z]' '[A-Z]' 

					#b.删除输出中的!号
					qing@qingsword.com:~$ ls | tr -d \! 

					#c.删除输出中的换行符(结果会输出成一行)
					qing@qingsword.com:~$ ls | tr -d '\n'

					##split命令实例
					#a.使用行数来分割/etc/group文件,每10行输出一个文件,输出的文件名在splitfile后面依次添加aa/ab/ac/ad..
					qing@qingsword.com:~$ split -l 10 /etc/group splitfile
					qing@qingsword.com:~$ ls
					splitfileaa  splitfileac  splitfileae  splitfileag
					splitfileab  splitfilead  splitfileaf 

					#b.使用-b参数可以使用大小size来分割文件,使用500M大小来分割家目录中的xx.iso文件,输出名称isofile[aa-az]
					#SIZE is an integer and optional unit (example: 10M is 10*1024*1024).  Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
					qing@qingsword.com:~$ split -b 500M ~/xx.iso isofile

					##重定向命令实例
					#a.将文件pp中的内容sort排序,再将结果保存成sortpp文件
					qing@qingsword.com:~$ sort < pp > sortpp

					#b.将文件pp中的内容送到sort进行排序,再将结果追加保存到sortpp文件末尾
					qing@qingsword.com:~$ sort < pp >> sortpp