Linux正则表达式与文件格式化处理

第十二章 总结

正则表达式

简单说,正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某些特定字符串的处理程序。

正则表达式基本是一种“表示法”,主要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理之用。如vi,grep,awk,sed等工具,因为他们支持正则表达,所以这些工具就可以使用正则表达式的特殊字符进行字符串的处理。但如cp,ls等命令并未支持正则表达式,所以就只能使用bash自身的通配符而已。

正则表达式对于系统管理员的用途

系统管理员要面对的是数据量很大的信息,如果不能使用正则表达式,则查找相关信息很慢,而通过正则表达式的功能,将一些信息进行处理,提取出有问题的信息进行分析,从而使系统管理工作更加方便。

正则表达式的广泛用途

正则表达式除了可以让系统管理员管理主机更方便外,在邮件服务器等方便也有广泛的应用。目前两大邮件服务器软件sendmail与postfix以及支持邮件服务器的相关分析软件都支持正则表达式的对比功能。

正则表达式与Shell在Linux当中都占用重要的角色地位,掌握其相关知识很重要。

扩展的正则表达

正则表达式的字符串表示依照不同的严谨度而分为基础正则表达式与扩展正则表达式。扩展正则表达式处理简单的一组字符串处理之外,还可以做组的字符串处理,进行或(or)与和(and)的处理,此时就需要扩展正则表达式的帮助了。通过特殊的“(”与“|”等字符的协助,就能够完成这样的目的。

注意:正则表达式与通配符是完全不一样的东西。因为通配符(wtilcard)代表的是bash操作接口的一个功能,但正则表达式是一种字符串处理的表达方式。

基础正则表达式

因为正则表达式是处理字符串的一种表示方式,那么对字符排序有影响的语系数据就会对正则表达的结果产生影响。此外,正则表达式也需要支持工具程序来辅助才行。

语序对正则表达式的影响

语序的数据会影响正则表达式的输出结果。原因是不同语序中的编码数据并不同,所以就会造成数据选取结果的区别。举例如下:

²  LANG=C时:0 1 2 3 4 … A B C D … Z a b c d … z

²  LANG=zh_CN时:0 1 2 3 4 … a A b B c C d D … z Z

上面的顺序是编码顺序,故可以明显发现两种语系是不一样的。故使用正则表达式时,需要特别留意当时环境的语系为何,否则可能会发现与别人不相同的选取结果。

由于一般使用的正则表达式都是兼容POSIX的标准,故使用C这个语系。故下面主要依据LANG_C 进行学习。为了要避免这样编码所造成的英文与数字的选取问题,先对其特殊的符号进行了解。这些特殊符号如下:

特殊符号

代表意义

[:alnum:]

代表英文大小写字符及数字,即0-9 A-Z a-z

[:alpha:]

代表任何英文大小写字符,即A-Z a-z

[:blank:]

代表空格键与Tab键

[:cntrl:]

代表键盘上面的控制键,即包括CR,LF,Tab,Del

[:digit:]

代表数字而已,即0-9

[:graph:]

除了空格键(空格键与Tab按键)外的其他所有按键

[:lower:]

代表小写字符,即a-z

[:print:]

代表任何可以被打印出来的字符

[:punct:]

代表标点符号(punctuation symbol),即“ ‘ ? ! ; : # $

[:upper:]

代表大写字符,即A-Z

[:space:]

任何会产生空白的字符,包括空格键Tab CR等

[:xdigit:]

代表十六进制的数字类型,因此包括0-9 A-F a-f的数字与字符

grep的一些高级参数

grep [-A] [-B] [--color=auto] ‘搜索字符串’filename

参数:

²  -A:后面可加数字,为after的意思,除了列出该行外,后续的n行也列出来

²  -B:后面可加数字,为before的意思,除了列出该行外,前面的n行也列出来

²  --color=auto:可将正确的那个选取数据列出颜色

用dmesg列出内核信息,再以grep找出内含eth的那行

dmesg | grep ‘eth’

将要找的关键字显色,且加上行号来表示

dmesg | grep –n –color=auto ‘eth’

在关键字所在行的前两行与后三行也一起找出来显示

dmesg | grep –n –A 3 –B 2 –color=auto ‘eth’

grep是一个很常用的命令,它最重要的功能就是进行字符串数据的对比,然后将符合用户需求的字符串打印出来。需说明的是grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的。如一个文件共有10行,其中两行具有所查找的字符串,则将那两行显示在屏幕上,其他的丢弃。

在关键字显示上,grep可以使用—color=auto来将关键字部分使用颜色显示。如果每次都使用grep都要自行加上—color=auto显得很麻烦,此时可以用alias来处理。可以在~/.bashrc内加上这行即可:alias grep=‘grep –color=auto’,再以source ~/.bashrc来立即生效即可。这样每次执行grep它都会自动加上颜色显示。

基础正则表达式练习

首先从网上下载对应的regular_express.txt文件

wget http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt

编辑regular_express.txt文件

vi regular_express.txt

该文件共有22行,最下面一行为空白行。

查找特定字符串

在regular_express.txt文件中取得the这个特定字符串

grep –n ‘the’ regular_express.txt

查找不存在the这个字符串的字符串

grep –nv ‘the’ regular_express.txt

想要取得不论大小写的the字符串

grep –in ‘the’ regular_express.txt

利用中括号[]来查找集合字符

如果想要查找test或tast这两个但是,可以发现,二者有共同的’t?st’存在。此时,可以如下查找:

grep –n ‘t[e|a]st’ regular_express.txt

[]里面不论几个字符,它都只代表某一个字符。

想要查找oo的字符

grep –n ‘oo’ regular_express.txt

查找有oo,但oo前不存在g的字符串,可以利用集合字符的反向选择[^]来完成

grep –n ‘[^g]oo’ regular_express.txt

查找有oo,且oo前不能有小写的字符,可以写成[^a-z]oo,具体如下:

grep –n ‘[^a-z]oo’ regular_express.txt

当在一组集合字符中,如果该字符组是连续的,如大写英文/小写英文/数字等,可以使用[a-z],[A-Z],[0-9]等方式来写,如果要求字符串是数字与英文,就可以将它全部写在一起,变成[a-zA-Z0-9]。

取得有数字的那一行

grep –n ‘[0-9]’ regular_express.txt

[:lower:]代表的是a-z

grep –n ‘[^[:lower:]]oo’regular_express.txt

grep –n ‘[[:digit:]]’ regular_express.txt

行首与行尾字符^$

查找the只出现在行首列的信息

grep –n ‘^the’ regular_express.txt

查找开头出现小写字符的行信息

grep –n ‘^[a-z]’ regular_express.txt

grep –n ‘^[[:lower:]]’ regular_express.txt

查找开头不是英文字母的行信息

grep –n ‘^[^a-zA-Z]’ regular_express.txt

注意:^字符在字符集合符号(中括号[])之内与之外是不同的。[]内代表反向选择,在[]之外则代表定位在行首的意义。

查找行尾结束为小数点. 的那行信息

grep –n ‘\.$’ regular_express.txt

特别注意:因为小数点具有其他意义,所以必须要使用转义字符(\)来加以解除其特殊意义。

查看5~9行信息的尾端使用

cat –An regular_express.txt | head –n 10 |tail –n 6

寻找空白行信息

grep – n ‘^$’ regular_express.txt

去除空行和#开头的行信息

grep –v ‘^$’ /etc/syslog.conf | grep –v‘^#’

任意一个字符 . 与重复字符 *

通配符 * 可以用来代表任意(0或多个)字符,但是正则表达式并不是通配符,两者之间是不相同的。至于正则表达式当中的. 则代表绝对有一个任意字符的意思,这两个符号在正则表达式的意义如下:

²  . (小数点):代表一定有一个任意字符的意思

²  * (星号):代表重复前一个0到无穷多次的意思,为组合形态

找存在g??d,即共四个字符的字符串

grep –n ‘g..d’ regular_express.txt

*代表的是重复0个或多个前面的RE字符的意义,因此”o*”代表的是具有空字符或一个o以上的字符,特别注意,因为允许为空字符(即没有字符),因此grep –n ‘o*’ regular_express.txt’将会把所有的数据都打印出来。

查找至少两个o以上的字符串,需用ooo*

grep –n ‘ooo*’ regular_express.txt

查找字符串开头和结尾都是g,但是两个g之间仅能存在至少一个o,即gog,goog,gooog等

grep –n ‘goo*g’ regular_express.txt

找出字符串以g开头,g结尾,中间字符可有可无的字符信息

grep –n ‘g.*g’ regular_express.txt

.*:代表零个或多个任意字符的意思。

找出任意数字的行列

grep -n ‘[0-9]’ regular_express.txt

grep –n ‘[0-9][0-9]*’ regular_express.txt

限定连续RE字符范围{}

因为 { 与} 的符号在shell是有特殊意义的,因此,必须使用转义字符 \ 来让它失去特殊意义才行。

查找o出现2次的字符串

grep – n ‘o\{2\}’ regular_express.txt

查找g后面接2到5个o,然后接g的字符串

grep –n ‘go\{2,5\}g’ regular_express.txt

查找2个o以上的gooo…g的字符串

grep –n ‘gooo*g’ regular_express.txt

grep –n ‘go\{2,\} regular_repress.txt

基础正则表达式字符(characters)

基础正则表达式总结如下:

RE字符

意义与范例

^word

意义:待查找的字符串(word)在行首

范例:查找行首为#开始的那一行,并列出行号

grep –n ‘^#’ regular_express.txt

word$

意义:待查找的字符串(word)在行尾

范例:将行尾为!的那一行打印出来,并列出行号

grep –n ‘!$’ regular_express.txt

.

意义:代表一定有一个任意字符的字符

范例:查找的字符串可以是(eve)(eae)(eee)(ee),但不能仅有(ee)!即e与e中间一定仅有一个字符,而空格也是字符

grep –n ‘e.e’ regular_express.txt

\

意义:转移字符,将特殊符号的特殊意义去除

范例:查找含有单引号的那一行

grep –n \’ regular_express.txt

*

意义:重复零个到无穷多个的前一个字符

范例:找出含有(es)(ess)(esss)等的字符串,注意,因为*可以是0个,所以es也是符合待查找的字符串。另外,因为*为重复前一个RE字符的符号,因此在*之前必须要紧接着一个RE字符,如任意字符则为 .*

grep –n ‘ess*’ regular_express.txt

[list]

意义:从字符集合的RE字符里面找出想要选取的字符

范例:查找含有(gl)或(gd)的那一行,需要特别留意的是,在[]当中代表一个待查找的字符,如a[afl]y代表查找的字符串可以是aay,afy,aly即[alf]代表a或f或l的意思

grep –n ‘g[ld]’ regular_express.txt

[n1-n2]

意义:从字符集合的RE字符里面找出想要选取的字符范围

范例:查找含有任意数字的一行。需特别留意,在字符集合[]中的减号-是由特殊意义的,它代表两个字符之间的所有连续字符。但这个连续与否与ASCII编码有关,因此,你的编码需要设置正确(在bash中,需要确定LANG与LANGUAGE的变量是否正确)如所有大写字符则为[A-Z]

grep –n ‘[0-9]’ regular_express.txt

[^list]

意义:从字符集合的RE字符里面找出不要的字符串或范围

范例:查找的字符串可以是(oog)(ood)但不能是(oot),那个^在[]内时代表的意义是反向选择的意思。如不要大写字符,则为[^A-Z]。但是,要特别注意,如果grep –n ‘[^A-Z]’ regular_express.txt来查找,则发现该文件内的所有行都被列出来,因为这个[^A_Z]是费大写字符的意思,因为每行均有非大写字符,故全列出来。

grep –n ‘oo[^t]’ regular_express.txt

\{n,m\}

意义:连续n到m个的前一个RE字符,若为\{n\}则是连续n个前一个RE字符,若为\{n,\}则是连续n个以上的前一个RE字符

范例:在g与g之间有2个到3个o存在的字符串,即(goog)(gooog)

grep –n ‘go\{2,3\}g’ regular_express.txt

特别注意:正则表达式的特殊字符与一般在命令行输入的通配符并不相同,如在通配符中,*代表的是零到无穷多个字符的意思,但在正则表达式中,*则是重复0到无穷多个前一个RE字符的意思,但意义并不相同。

在不支持正则表达式的命令中:

ls –l * 代表任意文件名的文件

ls –l a* 代表以a开头的任何文件名

ls搭配正则表达式:ls | grep –n’^a.*’

ls配合grep找出/etc/下面文件类型为链接文件属性的文件名

ls –l /etc | grep ‘^l’

sed工具

sed本身也是一个管道命令,可以分析标准输入信息,此外,sed还可以将数据进行替换、删除、新增、选择特定行等的功能。

sed [-nefr] [动作]

参数:

²  -n:使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者操作)才会被列出来

²  -e:直接在命令行模式上进行sed的动作编辑

²  -f:直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作

²  -r:sed的动作支持的是扩展型正则表达式的语法(默认是基础正则表达式语法)

²  -i:直接修改读取的文件内容,而不是由屏幕输出。

动作说明:[n1][,n2] function

²  n1, n2:不见得会存在,一般代表选择进行动作的行数。举例:如果动作需要在10到20行之间进行,则”10,20[动作行为]”

funciton有下面这些参数:

²  a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)

²  c:替换,c的后面可以接字符串,这些字符串可以替换n1, n2之间的行

²  d:删除,因为是删除,所以d后面通常不接任何参数

²  i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行)

²  p:打印,即将某个选择的数据打印出来,通常p会与参数sed –n一起运行

²  s:替换,可以直接进行替换的工作。通常这个s的动作可以搭配正则表达式,如1, 20s/old/new/g即可。

以行为单位的新增/删除功能

将/etc/passwd的内容列出并且打印行号,同时删除第2~5行。

nl /etc/passwd | sed ‘2,5d’

注意:原本应该是要执行sed –e才对,没有-e也行。同时,sed后面接的动作,务必以’’两个单引号括住。

如果要删除第2行,使用如下命令:

nl /etc/passwd | sed ‘2d’

如果要删除第3到最后一行,使用如下命令:

nl /etc/passwd | sed ‘3,$d’

其中的$代表最后一行

在第二行后(即加在第三行)加上drink tea的字样

nl /etc/passwd | sed ‘2a drink tea’

在第二行前(即加载第二行)加上drinl tea的字样

nl /etc/passwd | sed ‘2i drink tea’

增加两行

nl /etc/passwd | sed ‘2a drink tea or \

Drink milk’

新增不只一行,可以新增好几行,但是每一行之间都必须要以反斜杠\来进行新行的增加。

以行为单位的替换与显示功能

将第2~5行的内容替换称为”No 2-5 number”

nl /etc/passwd | sed ‘2,5c No 2-5 number’

显示11到20行,使用如下命令

head –n 20 | tail –n 10

利用sed取出文件内的5-7行

nl /etc/passwd | sed –n ‘5,7p’

注意:上面操作需要加上-n参数,否则返回很多信息

部分数据的查找并替换功能

sed可以用行为单位进行部分数据的查找并替换的功能。基本上sed的查找与替换与vi相当类似,格式如下:

sed ‘s/要被替换的字符串/新的字符串/g’

查看源信息,利用/sbin/ifconfig查询IP

/sbin/ifconfig eth0

利用关键字配合grep选取出关键的一行数据

/sbin/ifconfig eth0 | grep ‘inet addr’

将IP前面的部分予以删除

/sbin/ifconfig eth0 | grep ‘inet addr’ |sed ‘s/^.*addr://g’

将IP后面的部分予以删除

/sbin/ifconfig eth0 | grep ‘inet addr’ |sed ‘s/^.*addr://g’ | sed ‘s/Bcast.*$//g’

使用grep将关键字MAN所在行取出

cat /etc/man.config | grep ‘MAN’

删除掉批注之后的数据

cat /etc/man.config | grep ‘MAN’ |sed‘s/#.*$//g’

将空白行删除

cat /etc/man.config | grep ‘MAN’ | sed‘s/#.*$//g’ | sed ‘/^$/d’

直接修改文件内容(危险操作)

sed可以直接修改文件内容,而不必使用管道命令和数据流重定向。不过这个操作会直接修改文件,建议不要操作系统配置文件。

利用sed将regular_express.txt内的每一行结尾 . 换成 !

sed –I ‘s/\.$/\!/g’ regular_express.txt

利用sed直接在regular_express.txt最后一行加入”HeHe”

sed –i ‘$a HeHe’ regular_express.txt

sed的–i参数可以直接修改文件内容,对比较大的文件,处理起来很方便。

扩展正则表达式

删除空白行或行首为#的行列

基本方式:grep –v ‘^$’ regurlar_express.txt | grep –v ‘^#’

扩展方式:grep –v ‘^$|^#’ regular_expreass.txt

常用扩展表达式如下:

RE字符

意义与范例

+

意义:重复一个或一个以上的前一个RE字符

范例:查找(god)(good)(goood)等的字符串。那个o+代表一个以上的o,故可以执行如下命令:

egrep –n ‘go+d’ regular_express.txt

?

意义:零个或一个的前一个RE字符

范例:查找(gd)(god)这两个字符串。那个o?代表空的或1个o。(go+d与go?d)的结果集合是go*d。

egrep –n ‘go?d’ regular_express.txt’

|

意义:用或(or)的方式找出两个字符串

范例:查找gd或good这两个字符串。注意:是或

egrep –n ‘gd|good’ regular_express.txt

egrep –n ‘gd|good|dog’ regular_express.txt

( )

意义:找出”组”字符串

范例:查找(glad)或(good)这两个字符串,因为g与d是重复的,故可以la或oo列在()当中,并以|来分割。

egrep –n ‘g(la|oo)d’ regular_express.txt’

( )+

意义:多个重复组的判别

范例:将AxyzxyzxyzxyzC用echo显示,然后使用如下方法查找

echo ‘AxyzxyzxyzxyzC’ | egrep ‘A(xyz)+C’

上面意思:找出开头是A结尾是C,中间一个以上的xyz字符串

特别注意:!在正则表达式中不是特殊符号,想要查找出文件中含有!与>的自行,可以这样

grep –n ‘[!>]’ regular-express.txt

文件的格式化与相关处理

格式化打印:printf

printf可以帮我们将数据输出的结果格式化,而且支持一些特殊的字符。

printf ‘打印格式’ 实际内容

参数:

关于格式方面的几个特殊样式

²  \a:警告声音输出

²  \b:退格键(backspace)

²  \f:清除屏幕(form feed)

²  \n:输出新的一行

²  \r:亦即Enter按键

²  \t:水平的Tab按键

²  \v:垂直的Tab按键

²  \xNN:NN为两位数字,可以转换数字为字符

关于C程序语言内常见的变量格式

²  %ns:那个n是数字,s是string,即多少个字符

²  %ni:n是数字,i是integer,即多少整数字数

²  %N.nf:那个n与N都是数字,f代表float(浮点),如果有小数字数,假设共10位,小数点两位,此时为%10.2f

printf不是管道命令,故在显示时,需先读取文件内容来作为printf作为后续的数据才行。

列出十六进制数值45代表的字符

printf ‘\x45\n’

awk:好用的数据处理工具

awk也是数据处理工具,相比于sed常常用作于一整行的处理,awk则比较倾向于将一行分成数个字段来处理。故awk适合处理小型的数据处理。awk的运行模式如下:

awk ‘条件类型1{动作1} 条件类型2{动作2} …’filename

awk后接两个单引号并加上大括号{}来设置想要对数据进行的处理动作。awk可以处理后续接的文件,也可以读取来自前个命令的标准输出。awk主要是处理每一行的字段内的数据,而默认的字段的分隔符为空格键或Tab键。

用last显示登录者的数据信息

last –n 5

取出账号与登录这的ip且账号与ip之间以tab键隔开

last –n 5 | awk ‘{print $1 “\t” $3}’

在每一行的每个字段都是有变量名称的,那就是$1,$2等变量名称。$0代表一整行数据的意思。

整个awk的处理流程如下:

²  读取第一行,并将第一行的数据填入$0,$1,$2等变量中

²  依据条件类型的限制,判断是否需要进行后面的动作

²  做完所有的动作与条件类型

²  若还有后续的行数据,则重复上面的步骤,直到所有的数据都读完为止。

awk是以行为一次处理的单位,而以字段为最小的处理单位。

awk内置变量如下:

变量名称

代表意义

NF

每一行($0)拥有的字段总数

NR

目前awk所处理的第几行数据

FS

目前的分割字符,默认是空格键

列出每一行的账号(就是$1);列出目前处理的行数(就是awk的NR变量);并且说明该行有多少个字段(就是awk的NF变量)。

last -n 5 | awk '{print $1 "\t lines:" NR " \t columes: "NF}'

awk的逻辑运算符

运算符

代表意义

大于

小于

>=

大于或等于

<=

小于或等于

==

等于

!=

不等于

逻辑运算上面也就是所谓的大于、小于、等于等判断式上面,习惯上是以==来表示

如果是直接给予一个值,如变量的设置,就直接使用=。

在/etc/passwd当中是以冒号“:”来作为字段的分割,该文件中的第一字段为账号,第三字段则是UID。要查阅第三列小于10以下的数据,并且仅列出账号与第三列,执行如下命令:

cat /etc/passwd | awk ‘{FS=”:“} $3 < 10{print $1 “\t “ $3}’

但是第一行没有正确显示,因为读入第一行的时候,那些变量$1,$2….默认还是以空格键分割的,所以定义FS=”:”了,但是却仅能在第二行后才开始生效。解决办法:可以预先设置awk的变量,利用BEGIN这个关键字,具体如下:

cat /etc/passwd | awk ‘BEGIN {FS=”:”} $3< 10 {print $1 “\t” $3}’

除了BEGIN外,还有END。

²  所有的awk的动作,即在{}内的动作,如果有需要多个命令辅助时,可利用分号“;”间隔,或者直接以Enter按键来隔开每个命令。

²  逻辑运算当中,如果是等于情况,务必使用==

²  格式化输出时,在printf的格式当中,务必加上\n才能进行分行

²  在bash,shell的变量不同,在awk当中,变量可以直接使用,不需加上$符号。

awk还可以进行循环计算。

文件比较工具

文件比较用途:通常是同一个软件的不同版本之间,比较配置文件与源文件的区别。

diff

diff就是用在比较两个文件之间的区别,并且是以行为单位来比较的。一般是用在ASCII纯文本文件的比较上。由于是以行为比较的单位,因此diff通常是用在同一文件(或软件)的新旧版本区别上。

要将/etc/passwd处理成为一个新的版本,处理方式是删除第四行,第六行替换为no six line,新的文件放置到/tmp/test里面。

mkdir –p /tmp/test

cd /tmp/test

cp /etc/passwd passwd.old

cat /etc/passwd | sed –e ‘4d’ –e ‘6c no sixline’ > passwd.new

diff [-bBi] from-file to-file

参数:

²  From-file:一个文件名,作为欲比较文件的文件名

²  To-file:一个文件名,作为目的比较文件的文件名

²  注意from-file与to-file可以-替换,其中-代表标准输入之一

²  -b:忽略一行当中仅有多个空白的区别

²  -B:忽略空白行的区别

²  -i:忽略大小写的不同。

比较passwd.old与passwd.new区别

diff passwd.old passwd.new

不可以用diff比较两个好不相干的文件,因为会比不出来结果。diff也可以比较两个目录。比价开机等级3与5的启动脚本不同

diff /etc/rc3.d/ /etc/rc5.d/

cmp

cmp主要比较两个文件,也可以比较二进制文件。注意:diff是以行为单位比较,cmp则是以字节为单位去比较。

cmp [-s] file1 file2

参数:

²  -s:将所有的不同点的字节处都列出来,因为cmp默认仅仅会输出第一个发现的不同点。

用cmp比较passwd.old与passwd.new

cmp passwd.old passwd.new

patch

pathch制作为补丁文件,其与diff联合使用。通过两个文件的不同,可以将区别文件制作为补丁文件,最后由补丁文件更新就文件。

以/tmp/test内的passwd.old与passwd.new制作补丁文件

diff –Naur passwd.old passwd.new >passwd.patch

cat passwd.patch

一般来说,使用diff制作出来的比较文件通常使用扩展名为.patch。其是以行为单位,看那边有一样与不一样的,找到一样的地方,然后将不一样的地方替换掉。文件中-代表删除,+代表加入。将旧文件更新为新文件,方法如下:

patch –pN < patch_file 更新

patch –R  -pN < patch_file 还原

参数:

²  -p:后面的N表示取消几层目录的意思

²  -R:代表还原,将新的文件还原成旧的版本

将刚才制作出来的patch file用来更新旧版数据

patch –p0 < passwd.patch

ll passwd*

恢复旧文件的内容

patch –R –p0 < passwd.patch

ll passwd* 恢复文件

使用p0因为新旧版的文件是在同一个目录下,故不需减去目录。如果使用整个目录,则需要依据新建的patch文件所在目录进行目录的删减。

文件打印准备:pr

pr /etc/man.config

Pr处理会产生标题,标题中存在文件时间,文件名,页码等。

重点

²  正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为。

²  正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找、删除、替换某些特定字符串的处理程序。

²  只要工具程序支持正则表达式,那么该工具就可以用来作为正则表达式的字符串处理之用。

²  正则表达式与通配符是完全不一样的。通配符代表的是bash操作接口的一个功能,但正则表达式则是一种字符串处理的表达方式。

²  使用grep或其他工具进行正则表达式的字符串比较时,因为编码的问题会有不同的状态,因此最好将LANG等变量设置为C或者是en等英文语系。

²  grep和egrep在正则表达式里面是很常见的两个程序,其中egrep支持更严谨的正则表达式语法。

²  由于编码系统的不同,不同的语系(LANG)会造成正则表达式选取数据的区别,因此可利用特殊符号如[:upper:]来替代编码范围较佳

²  由于严谨度的不同,正则表达式之上还有更严谨的扩展正则表达式。

²  基础正则表达式的特殊字符有*,?,[],[-],[^’,^,$等。

²  常见的正则表达式工具有grep,sed,vim等。

²  printf可以通过一些特殊符号来将数据进行格式化输出。

²  awk可以使用“字段”为依据,进行数据的重新整理与输出。

²  文件的比较中,可利用diff及cmp进行比较,其中diff主要用在纯文本文件方面的新旧版本比较。

²  patch命令可以将旧版数据更新到新版(主要由diff创建patch的补丁来源文件)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值