详解正则表达式及Linux三大文本处理工具
grep、sed和awk都是文本处理工具,虽然都是文本处理工具但却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。
一、正则表达式
1、匹配字符的类型
[a-z]:小写字母
[A-Z]:大写字母
[a-Z]:小或大写字母
[0-9]:数字
[a-zA-Z0-9]:表示匹配一个为字母或数字的字符
.:匹配1个任意字符,空格除外
[0-f]:16进制数
abc|def:abc或def
a(bc|de)f:abcf或adef
\<:单词头单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
\>:单词尾
[^表达式]:除小写字母以外的所有字符,如此类推。
2、后跟以下符号控制匹配的数量
此类符号的左侧要有上面第一点的表达式
表达式*:0或n个字符
表达式+:1或n个字符
表达式?:0或1个字符
表达式{n}:n个字符
表达式{n:m}:n到m个字符
表达式{n,}:至少n个字符
【例】[a-z]*表示匹配0个或多个小写字母
3、将匹配的字符控制在头尾
^表达式:头部符合
表达式$:尾部符合
二、Linux三大文本处理工具
1、egrep筛选工具
grep的扩展版,可以使用正则表达式
语法:
egrep-选项 '正则表达式' 文件名
选项:
-n:显示行号
-o:只显示匹配的内容
-q:静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l:如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep-rl'root'/etc
-A:如果匹配成功,则将匹配行及其后n行一起打印出来
-B:如果匹配成功,则将匹配行及其前n行一起打印出来
-C:如果匹配成功,则将匹配行及其前后n行一起打印出来
--color
-c:如果匹配成功,则将匹配到的行数打印出来
-i:忽略大小写
-v:取反,不匹配
-w:匹配单词
2、sed流编辑器
语法:
语法1:sed -选项 '数字定位+命令' 文件名
选项:
-n:静默模式,不输出
-e:多项编辑,这个不是很清楚
-i:直接修改文件内容,而不是输出
-r:扩展模式,可使用正则表达式
-f:指定文件名,将动作写在新的文件内
命令:
a∶追加append,
c∶改变change,
d∶删除delete,
i∶插入insert,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p∶列印print
s∶取代substitute,可以直接进行替换的工作。通常这个s的动作可以搭配正则表达式。例如1,20s/old/new/g
*s命令特别说明:
使用{命令1:命令2:命令3}可增加使用多个命令
语法2:sed -r '替换命令s/正则表达式/替换内容/贪婪选项g' 文件名
定位的两种方法:
①数字定位(输入行序号定位)
十进制数
1:单行
1,3:范围从第一行到第三行
2,+4:匹配行后若干行
4,~3:从第四行到下一个3的倍数行
2~3:第二行起每间隔三行的行
$:尾行
1!:除了第一行以外的行
【例】sed-n'1p'/etc/passwd
②正则表达式定位
正则必须用//包裹起来
扩展正则需要用-r参数或转义
替换可使用正则表达式的子模式,即小括号(),可以\1、\2代表子模式
【例】sed-r's/(.)(.)/\2\1/file1表示将匹配到的第一部分和第二部分替换
*贪婪选项:填上g,代表把一行中所有匹配项替换
3、awk文本分析工具
由命令、正则(需要用//包围起来)、比较和关系运算组合而成
使用option中的-F参数定义间隔符号
用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域,NF变量表示当前记录的字段数
语法
awk-选项参数 '逻辑判断{命令变量1,变量2,变量3}'文件名
选项
-F定义字段分隔符,默认的分隔符是连续的空格或制表符
-v定义变量并赋值也可以借用次方式从shell变量中引入
AWK变量
NR当前记录的个数(全部文件连接后的统计)
FNR当前记录的个数(仅为当前文件的统计,非全部)
FS字段分隔符默认为连续空格或制表符,可以使用多个不同的符号做分隔符-F[:/]
OFS输出字符的分隔符默认是空格
#awk-F:'OFS="====="{print$1,$2}'/etc/passwd
root=====x
NF当前读入行的字段个数
ORS输出记录分隔符默认是换行
#awk-F:'ORS="====="{print$1,$2}'/etc/passwd
rootx=====binx=====
FILENAME当前文件名
【例1】使用AWK变量
#awk'{printNR,FNR,$1}'file1file2 11aaaaa 22bbbbb 33ccccc 41dddddd 52eeeeee 63ffffff #
【例2】引用shell变量的方法
#a=root #awk-vvar=$a-F:'$1==var{print$0}'/etc/passwd 或者把整个命令拆开传递,让shell变量外露, #awk-F:'$1=="'$a'"{print$0}'/etc/passwd #a=NF #awk-F:'{print$'$a'}'/etc/passwd
逻辑运算(可直接引用域进行运算)
=+=-=/=*=赋值
&&||!逻辑与逻辑或逻辑非
~!~ 匹配正则或不匹配,正则需要用/正则/包围住
<<=>>=!=== 关系比较字符串时要把字符串用双引号引起来
$字段引用:字段引用需要加$,而变量引用直接用变量名取
+-*/%++-- 运算符
转义序列
\\\自身
\$转义$
\t制表符
\b退格符
\r回车符
\n换行符
\c取消换行
以上所述是小编给大家介绍的正则表达式及Linux三大文本处理工具,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!