正则表达式与文件格式化处理
一、基础正则表达式
1、语系对正则表达式的影响
由于语系的编码数据并不相同,所以就会造成数据选取结果的区别。举例来说, 在英文大小写的编码顺序中,zh_CN.big5及C这两种语系的输出结果分别如下:
LANG=C时,0 1 2 ...A B C ... Z a b c...z
LANG=zh_CN时, 0 1 2...a A b B c C ... z Z
特殊符号表:
特殊符号 | 代表意义 |
[: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的数字与字符 |
2、grep的一些高级参数
grep [-A] [-B] [--color==auto] ‘搜寻字符串’ filename
-A: 后面可加数字,为after的意思,出了列出该行外, 后续的n行也列出来
-B: 后面可加数字,为befer的意思,出了列出该行外,前面的n行也列出来
注: ^在[]内代表“反向选择”, 在[]之外代表定位在行首的意义。
.(小数点): 代表一定有一个任意字符的意思
*(星号)‘:代表重复前一个0到无穷多次的意思, 为组合形态
“.*”: 代表零个或多个任意字符的意思。
限定连续RE字符范围{}:
因为{与}的符号在shell是有特殊意义的,因此我们必须用转义字符
如: grep -n 'o\{2\}' regular_express.txt 找到两个o的字符串
3、基础正则表达式字符(characters)
RE字符 | 意义 |
^word | 待查找的字符串(word)在行首 |
word$ | 将查找的字符串(word)在行尾 |
. | 代表一定有一个任意字符的字符 |
\ | 转义字符,将特殊符号得特殊意义去除 |
* | 重复零个到无穷多个的前一个字符 |
[list] | 从字符集合的RE字符里面找出想要选取的字符 |
[n1-n2] | 从字符集合的RE字符里面找出想要选取的字符范围 |
[^list] | 从字符集合的RE字符里面找出不要的字符串或范围 |
\{n,m\} | 连续n到m个的前一个RE字符, 若为\{n\}则是连续n个的前一个RE字符, 若为\{n,\}则是连续n个以上的前一个RE字符 |
二、sed工具
sed本身也是一个管道命令,可以分析standard input的, 而且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[动作行为]”
function有下面这些参数:
a: 新增,a的后面可以接字符串, 而这些字符串会在新的一行出现(目前的下一行)
c: 替换,c的后面可以接字符串, 这些字符串可以替换n1,n2之间的行
d: 删除,后面通常不接任何参数
i: 插入, i 的后面可以接字符串, 而这些字符串会在新的一行出现(目前的上一行)
p: 打印, 也就是将某个选择的数据打印出来。通常p会与参数sed -n一起运行
s: 替换,可以直接进行替换的工作。通常这个s的动作可以搭配正则表达式!
sed的几个功能:
a、以行为单位的新增/删除功能
b、以行为单位的替换与显示功能
c、部分数据的查找并替换的功能
除了整行的处理模式之外,sed还可以用行为单位进行部分数据的查找并替换的功能。基本行sed的查找与替换的与vi相当类似,它有点像这样:
sed 's//要被替换的字符串/新的字符串g'
d、直接修改文件内容(危险操作)
sed甚至可以直接修改文件的内容,而不必使用管道命令或数据流重定向。
例: sed -i 's/\.$/\!/g' regular_express.txt
sed的“-i”参数可以直接修改文件内容
三、扩展正则表达式
grep默认仅支持基础正则表达式,如果要使用扩展型正则表达式,可以使用grep -E 不过建议直接使用egrep
RE字符 | 意义与范例 |
+ |
意义:重复一个或一个以上的前一个RE字符 范例:查找(god)(good)(goood)等的字符串。那个o+代表一个以上的o,: egrep -n 'go+d' regular_express.txt |
? |
意义:零个或一个的前一个RE字符 范例: 查找gd或god这两个字符串: egrep -n 'go?d' regular_express.txt |
| |
意义: 用或(or)的方式找出数个字符串 范例:查找gd或good这两个字符串 egrep -n 'gd|good' regular_express.txt |
() |
意义:找出“组”字符串 范例: 查找(glad)或(good)这两个字符串 egrep -n 'g(la|oo)d' regular_express.txt |
()+ |
意义:多个重复组的判别 范例: echo 'AxyzxyzxyzC' | egrep 'A(xyz)+C' |
四、文件的格式化与相关处理
1、格式化打印: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代表floating(浮点)N代表数位,n代表有几个小数位
2、awk:好用的数据处理工具
awk:比较倾向于将一行分成数个‘字段’来处理,适合处理小型的数据数据处理
awk '条件类型1{动作1} 条件类型2{动作2}...' filename
如: last -n 5 | awk '{print $1 "\t" $3}'
整个awk的处理流程:
a. 读入第一行, 并将第一行的数据填入$0, $1,$2等变量中, $0代表一整行数据的意思
b. 依据条件类型的限制, 判断是否需要进行后面的动作
c. 做完所有的动作与条件类型
d. 若还有后续的“行”的数据, 则重复上面1~3的步骤,直到所有的数据都读完为止
awk是以行为一次处理的单位, 而以字段为最小的处理单位
awk的内置变量:
变量名称 | 代表意义 |
NF |
第一行($0)拥有的字段总数 |
NR | 目前awk所处理的是“第几行”数据 |
FS | 目前的分隔字符,默认是空格键 |
awk的条件类型: 逻辑运算符
运算符 | 代表意义 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
与bash shell 的变量不同,在awk中, 变量可以直接使用,不需要加上$符号
awk的动作内{}也是支持if(条件)的
3、文件比较工具
a、diff: 就是用在比较两个文件之间的区别的,并且是以行为单位来比较的,通常是用在同一的文件(或软件)的新旧版本区别上。
diff [-bBi] from-file to-file
参数: from-file: 一个文件名, 作为欲比较文件的文件名
to-file: 一个文件名, 作为目的比较文件的文件名
注意, from-file或to-file可以用-替换,代表standard input
-b: 忽略一行当中仅有多个空白的区别
-B: 忽略空白行的区别
-i: 忽略大小写的不同
diff 也可以比较整个目录下的区别
b、cmp: 主要也是比较两个文件,它主要利用“字节”单位去比较,也可以比较二进制文件
cmp [-s] file1 file2
参数:
-s: 将所有的不同点的字节处都列出来,因为cmp默认仅会输出第一个发现的不同点。
c、 patch: diff可以用来分辨两个版本之间的区别,而patch就可以将旧的文件升级为新的文件:
先将比较新旧版本的区别,并将区别文件制作成为补丁文件,再由补丁文件更新旧文件即可。
patch -pN < patch_file <==更新
patch -R -pN < patch_file <==还原
-p: 后面的N表示取消几层目录的意思
-R: 代表还原, 将新的文件还原成原来旧的版本
例:制作补丁文件:
diff -Naur passwd.old passwd.new > passwd.patch
将patch file用来更新旧的数据
patch -p0 < passwd.patch
恢复旧文件的内容
patch -R -p0 < passwd.patch
4、文件打印准备:pr