正则表达式(Regular Expression)是通过一些特殊字符的排列,用以查找、替换、删除一行或多行文字字符串。简单地说,正则表达式就是用在字符串的处理上面的一项“表示式”。
正则并不是一个工具程序,它是一种字符串处理的标准依据,如果你想以正则表达式的方式处理字符串,就得要使用支持正则表达式的工具程序才行,如vi、sed、awk、grep
正则表达式对于系统管理员来说实在是很重要,可用此将重要信息选取出来,并产生便于查阅的报表来简化管理流程。到达更精简处理日常事物。
正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理之用。例如vi、grep、sed、awk等工具,因为它们有支持正则,所以这些工具就可以使用正则的特殊字符来进行字符串的处理。但如cp、ls等命令 并未支持正则,多依旧只能使用bash自身的通配符而已。
正则表达式的字符串表示方式依照不同的严谨度而分为 基础正则表达式 和 扩展正则表达式。
基础正则表达式
文件其实记录的仅有0和1(二进制文件),我们看到的字符文字都是通过编码表转换来的。由于不同语系的编码数据并不相同,所以就会造成数据选取结果的区别。使用正则表达式时,需要特别留意当时环境的语系为何,否则可能会发现与别人不相同的选取结果。
以下特殊符号需要我们了解下:
grep的一些高级用法:
dmesg | grep -n -A3 -B2 'eth' #列出关键字所在前两行和后三行
grep是一个很常见也很常用的命令,他最重要的功能就是进行字符串数据的对比,然后将符合用户需求的字符串打印出来。
需要说明的是,grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的!
基础正则表达式字符(characters):
扩展的正则表达式:
以上这些就是扩展的正规表示法的特殊字节。另外,要特别强调的是,那个 ! 在正规表示法当中并不是特殊字节, 所以,如果你想要查出来文件中含有 ! 与 > 的字行时,可以这样:
grep -n '[!>]' regular_express.txt
sed工具:
sed本身也是一个管道命令,可以分析standard input,而且sed还可以将数据进行替换、删除、新增、选取特定行等的功能。
以行为单位的新增/删除功能;
以行为单位的替换和显示功能;
部分数据的查找并替换的功能;
直接修改文件内容;
awk:好用的数据处理工具
awk是一个非常棒的数据处理工具。相比于sed常常作用于一整行的处理,awk比较倾向于将一行分成数字各”字段“来处理。因此,awk相当适合处理小型的数据。
awk主要是处理每一行的字段内数据,而默认的字段分隔符为空格键或tab键。
awk '条件1 {动作1} 条件2 {动作2} ......' filename
awk是以行为一次处理的单位,而以字段为最小的处理单位。
每一行的每个字段都是有变量名称的,那就是$1,$2...等变量名称。
$0代表这一行,$1$2$3代表这行的字段。
awk内建变量:
列出每一行的账号(就是$1);
列出目前处理的行数(就是awk内的NR变量);
并且说明,该行有多少字段(就是awk内的NF变量);
awk的逻辑运算符:
所有awk动作,即在 { } 内的动作,如果有需要多个命令辅助时,可利用“;”间隔,或者直接以【Enter】按键来隔开每个命令,例如上面的范例中,用了三个【Enter】;
逻辑运算当中,如果是“等于”的情况,则务必使用两个等号“==”;
格式化输出时,在printf的格式设置当中,务必加上\n,才能进行分行;
与bash,shell的变量不同,在awk当中,变量可以直接使用,不需要加上$符号。
格式化打印:printf
打印格式化这个printf命令,乍看之下好像也没什么很重要的。不过,如果你需要自行编写一些软件,需要将一些数据在屏幕上漂漂亮亮的输出的话,那么printf可也是一个很不错的工具。
文件比较工具:diff、cmp、patch
diff:通常用于比较同一软件的不同版本之间,比较配置文件与源文件的区别,并且是以行为单位来比较的。
用diff比较文件真的是很简单。不过,你不要用diff去比较两个完全不想干的文件,因为比不出个结果来!另外,diff也可以比较不同目录下相同文件名的内容。
cmp:主要也是比较两个文件,但它主要利用“字节”单位去比较,当然也可以比较二进制文件。
diff主要是以“行”为单位去比较,cmp则是以“字节”为单位去比较,这并不相同。
patch:patch与diff有密不可分的关系!比较新旧文件的区别,并将区别文件制作成为系统补丁文件,再由补丁文件更新旧文件即可。
一般由diff制作出的比较文件通常使用.patch扩展名。
重点回顾:
正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为;
正则表达式通过一些特殊符号的辅助,可以让用户轻易到达查找、删除、替换某特定字符串的处理程序;
只要工具程序支持正则表达式,那么该工具程序就可以用来作为正则表达式的字符串处理之用;
正则表达式与通配符是完全不一样的。通配符(wildcard)代表的是bash操作接口的一个功能,但正则表达式则是一种字符串处理的表示方式;
使用grep或其他工具进行正则表达式的字符串比较时,因为编码的问题会有不同的状态,因此,你最好将LANG等变量设置为C或者是en等英文语系;
grep与egrep在正则表达式里面是很常见的两个程序,其中,egrep支持更严谨的正则表达式的语法;
由于编码系统的不同,不同的语系(LANG)会造成正则表达式选取数据的区别,因此可利用特殊符号如[:upper:]来替代编码编码范围较佳;
由于严谨度的不同,正则表达式之上还有更严谨的扩展正则表达式;
基础正则表达式的特殊字符由 * ? [ ] [ - ] [ ^ ] ^ $等;
常见的正则表达式工具有 grep 、sed、vim、awk;
printf可以通过一些特殊符号来将数据进行格式化输出;
awk可以使用字段为依据,进行数据的重新整理与输出;
文件的比较中,可利用diff及cmp进行比较,其中diff主要用在纯文本文件方面的新旧版本比较;
patch命令可以将旧版数据更新到新版(主要由diff创建patch的补丁来源文件)。