[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