Linux正则表达式与通配符
正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。正则表达式这个概念最初是由Unix中的工具软件(例如d和grep)普及开的。
只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN d、 Awk 等) 的用法
grep、d、awk天然支持正则
grep -v代表反选,反向选择匹配到的内容
grep -E代表使用扩展正则
grep -P代表使用Perl正则
d -r 代表使用扩展正则
正则表达式分为三类(man grep可以看到,分别是basic RegExs,extended RegExs,perl RegExs)
1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
b. 处理过程:查找文本文件中是否包含要查找的 “关键字”(关键字可以是正则表达式) ,默认返回匹配的该行的内容
c. grep|egrep处理文件时,按行处理 |
| d | d | d -r | - | a. 处理对象:文本文件
b.处理操作:对文本文件的内容进行 查找、替换、删除、增加等操作
c. d 在处理文本文件的时候,按行处理 |
| awk | - | awk | - | a. awk 处理的对象:文本文件
b. awk 处理操作:主要是对列进行操作 |
注意:egrep 或 d -r 默认使用扩展正则表达式(EREs),一般特殊字符({})可以不转义
grep -E 以及egrep(Extend Regular Expression)
Linux通配符和三剑客的正则表达式是不一样的,因此,代表的意义也有较大的区别 。
通配符一般用户命令行bash环境,而linux正则表达式用于grep, d, awk场景。
通配符说明
示例:* 的使用:代表任意0-N个字符,代表所有字符
Linux系统通配符与ls命令的功能及用法
文件通配符
* 匹配零个或多个字符
? 匹配任何单个字符
~ 当前用户家目录
~mage 用户mage家目录
~+ 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字范围
[a-z]:字母(或的关系)就是表示中括号中的某一个字符
[A-Z]:字母
[a-c]:a A b B c
[A-C]:A b B c C,也就是[]在里面匹配字母时是以aAbB...这样排序的
[wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
{}花括号用来匹配一组用逗号分隔的字符串中的任一个。
左花括号之前的所有字符称为前文(preamble),右花括号之后的所有字符称为后文(preamble)。
前文和后文都是可选的。花括号中不能包含不加引号的空白符
预定义的字符类:man 7 glob(通配符)
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母[:lower:] 这个只相当于a-z,表示的时候必须要在加上中括号
[:upper:]: 任意大写字母
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符
ls命令的功能:
列出当前目录的内容或指定目录
ls命令的用法:
ls [options] [files_or_dirs]
示例:
ls -a 包含隐藏文件
ls -l 显示额外的信息
ls -r 倒转排序或者可以说是逆序排列
ls -R 目录递归通过(递归会进入到子目录)
ls -ld 目录和符号链接信息
ls -1 文件分行显示(列显示)
ls –S 按从大到小排序(按文件的大小排序)
ls –t 按mtime排序(按文件的修改时间排序)
ls –u 配合-t选项,显示并按atime从新到旧排序
ls –U 按目录存放顺序显示(以创建文件的次序进行显示)
ls –X 按文件后缀排序
ls -d 列出目录本身并不显示内容
ls -h 单位换算
ls -I --ignore(忽略)=PATTERN(模式)按着规定的模式去隐藏不进行显示
实例:
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数
字的文件或目录
ls -d /var/l*[0-9]*[[:lower:]]
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
ls -d /etc/[0-9]*[^0-9]
3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符
的文件或目录
ls -d /etc/[^[:alpha:]][[:alpha:]]*
4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符
的文件或目录
ls -d /etc/rc[0-6]*
5、显示/etc目录下,所有以.d结尾的文件或目录
ls -d /etc/*.d
6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
ls -d /etc/[mnrp]*.conf
7、只显示/root下的隐藏文件和目录
ls -d /root/.*
ls -aI "[^.]*" 当前目录为/root
l. ls -d .* --color=auto 当前目录为/root
8、只显示/etc下的非隐藏目录
ls -d /etc/*/
linux无法通过通配符查找文件
当使用通配符时,不加引号或(反斜线)的情况下,会报错。在Linux平台下find是常用命令,并且经常是配合通配符(wildcard)一起使用,毕竟我们只能记住某个文件一部分。我们需要寻找当前目录下所有的sh文件,随手敲一条命令。
在Linux中如何用通配符表达一连串不确定个数的数字?
ls | awk -F '[.]' '{if($1<100) print($0)}'
对于格式为 200.dat 这样的数据,可以用awk -F 分隔符,$1此时为200,$2此时为dat。awk可以使用if判断,从而获得序号小于100的所有文件。
linux 通配符%.c和*.c区别
%.c是GUNmake语法层,表示的是所有以".c"结尾的文件
而*.c则是linux shell 语法层的,比如:rm -f *.o 类似的。
意思基本是一样的,就是一个是GUNmake的一个是shell的
linux中 正则表达式和通配符的区别
通配符
它是由shell解析,并且一般用于匹配文件名,实际上就是shell解释器去解析的特殊符号,linux系统通配符有几下几种:
*:匹配任意多个字符
?:匹配任意一个字符
[...]:匹配中括号内出现的任意一个字符
[!...]:不匹配中括号内出现的任意一个字符
一般出现在要shell命令或脚本中,匹配特定的文件名
正则表达式
它是一个字符匹配标准,一些命令工具按此标准实现字符匹配,根据命令支持的匹配功能可分为基础正则表达式和扩展正则表达式,常用于支持正则表达式的工具,如d,grep,awk...
有如下一些常用的匹配元字符:
字符匹配
.:匹配任意单个字符
*:匹配其前面一个字符出现任意次
?:匹配其前面的字符1次或0次
+:匹配其前面一个字符出现至少一次(在扩展正则表达式中)
位置匹配
^:锚定行首
$:锚定行尾
\<或\b:锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b:锚定词尾,其前面的任意字符必须作为单词尾部出现
\B:非单词的开头或结尾
^$:空白行
分组() :
(ab)* : 匹配ab这个分组出现任意次
\1:引用第一个左括号以及与之对应的右括号所包括的所有内容,同理还有\2,\3
特殊子字符类:
[:alnum:] :任何字母和数字
[:alpha:] :任何字母
[:cntrl:] :控制字符. 在ASCII表中对应八进制000 到 037, 和177 ('DEL').
[:digit:] :任何数字
[:graph:] :匹配打印字符,相当于'[:alnum:]' +'[:punct:]'.
[:lower:] :小写字母
[:print:] :可打印字符,相当于 '[:alnum:]', '[:punct:]', 和space.
[:punct:] 标点符号,'! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ' { | } ~'
[:space:] 空白字符,tab, newline, vertical tab, form feed, carriage return, and space.
[:upper:] 大写字母
[:xdigit:] 任何16进制的数字,相当于[0-9a-fA-F]
所以:^[[:space:]]*$ :匹配没有任何内容的行
需要注意:[]中的特殊字符如.已经失去了其特殊含义,和方括号中的普通字符[abc]一样。