首页 > 代码库 > 正则表达式及Linux三大文本处理工具
正则表达式及Linux三大文本处理工具
一、正则表达式
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:指定文件名,将动作写在新的文件内
定位:
①数字定位(输入行序号定位)
- 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,代表把一行中所有匹配项替换
命令:
- a ∶ 追加append,
- c ∶ 改变change,
- d ∶ 删除delete,
- i ∶ 插入insert, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
- p∶ 列印print
- s∶ 取代substitute,可以直接进行替换的工作。通常这个 s 的动作可以搭配正则表达式。例如 1,20s/old/new/g
*s命令特别说明:
使用{命令1:命令2:命令3}可增加使用多个命令
s命令语法:sed -r ‘替换命令s/正则表达式/替换内容/贪婪选项g‘ 文件名
3、awk 文本分析工具
由命令、正则(需要用//包围起来)、比较和关系运算组合而成
使用option中的-F参数定义间隔符号
用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域,NF变量表示当前记录的字段数
语法
awk -选项 参数 ‘逻辑判断{命令 变量1,变量2,变量3}‘ 文件名
选项
- -F 定义字段分隔符,默认的分隔符是连续的空格或制表符
- -v 定义变量并赋值 也可以借用次方式从shell变量中引入
AWK变量
- NR 当前记录的个数(全部文件连接后的统计)
- FNR 当前记录的个数(仅为当前文件的统计,非全部)
- FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
- OFS 输出字符的分隔符 默认是空格
【OFS例】
# awk -F: ‘OFS="=====" {print $1,$2}‘ /etc/passwd
root=====x
- NF 当前读入行的字段个数
- ORS 输出记录分隔符 默认是换行
【ORS例】
# awk -F: ‘ORS="=====" {print $1,$2}‘ /etc/passwd
root x=====bin x=====
- FILENAME 当前文件名
【例1】使用AWK变量
# awk ‘{print NR,FNR,$1}‘ file1 file2
1 1 aaaaa
2 2 bbbbb
3 3 ccccc
4 1 dddddd
5 2 eeeeee
6 3 ffffff
#
【例2】引用shell变量的方法
# a=root
# awk -v var=$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 取消换行
更多详细资料参考:
http://www.cnblogs.com/linhaifeng/p/6596660.html#_label3
正则表达式及Linux三大文本处理工具