Linux 文本处理

正则表达式(Regular Expression)


基础正则(Basic Regular Expression—–Basic RegEx)

元字符

字符 作用
* 前一个字符任意次
. 匹配除了换行符外的任意一个字符
^ 匹配行首
$ 匹配行尾
[ ] 匹配中括号中的任意一个
[^ ] 匹配中括号字符以外的任意一个字符—-相当于—–^[]的意思
{n} 表示前面的字符出现n次
{n,m} 前一字符最少出现n次最多出现m次
{n, } 前一字符最少出现n次
{ ,m} 前一字符最多出现m次
\ 转义字符

扩展正则

元字符

字符 功能  
+ 前面的字符重复一次或者一次以上  
? 前面的字符重复一次或者0次  
| 分支,注意这个符号实在表达式层面上运作,区别于[]运作于字符层面  
( ) 查找组  
( )+ 辨别多个重复组  
\数字 有多个分组时表明分组顺序,用对应顺序的分组来代替此序号  
(:? 内容) 非捕获分组,使用序号时,不会计入序号中  
\w pu查找字母、数字和下划线  
\w 匹配除字母、数字、下划线以外的字符(与上面的相反)  
\d 匹配数字,grep不支持  
\D 匹配数字以外的字符,grep不支持  
\s 匹配空白符  
\S 匹配非空白符  
xxx(?=条件) 正向先行断言,匹配xxx后面有指定字符的行  
xxx(?!条件) 负向先行断言,匹配xxx后面没有指定字符的行  
(?<=条件)xxx 正向后行断言,匹配xxx前面有指定字符的行  
(?<!条件)xxx 负向后行断言,匹配xxx前面没有指定字符  

grep


命令格式

  • grep [option] [PATTERN] [FILE…]
  • 如果没有指定FILE那么对当前工作目录搜索

常用选项

选项 功能
-E 此选项将使PATTERN支持扩展的正则—等价于—egrep
-F 将PATTERN理解成字符串而不是正则的表达式
-i 忽略大小写
-v 改变输出匹配行,转而输出非匹配行
-x 只需要整行匹配的行
-c 统计输出结果的行
-o 只输出匹配的内容本身
-w 只匹配过滤的单词
-n 输出行号
-H 输出文件名:匹配内容
-A 显示匹配行的后面的行数
-B before,显示匹配行前面的行数
-C 显示匹配行前面和后面的行数
–no-group-separator 使用前面的-A,B,C会在两个匹配行之间使用分隔行,此选项可以取消
–group-separator =’xxxx’指定分隔符号
-r 递归grep,此时不用指定文件
-l 只打印文件名,不打印匹配内容
-R 递归但是不输出符号链接和文件内容
-L 只打印没被选中行的文件名称
-z 数据行以0(NULL)结尾而不是换行符
-Z 在文件名后面打印null
–include=GLOB 只查找匹配 GLOB(含通配符的文件模式)的文件
–exclude=GLOB 跳过匹配 GLOB 的文件
–exclude-dir=GLOB 在进行递归匹配的时候排除的文件夹,用多次参数指定多个目录
-d 动作, –directories=动作 处理目录的方式:<动作> 可以是 "read"、"recurse" 或 "skip",<动作> 可以是 "read" 或 "ski,
-b 输出结果的同时打印字节偏移量

sed


操作、过滤和转换文本的强大工具

  • 一次读取一行,放入sed工作车间(模式车间,文本数据读入内存)
  • 模式匹配
    • 匹配失败(默认输出到屏幕)
    • 匹配成功(编辑,输出到屏幕)

语法

  • sed [ 选项 ] [ sed内置命令字符 ] [ 输入文件 ]
  • 注意内置命令字符需要单引号括起来
  • 内置命令中顺序为
    • [ 范围命令]
    • 注意范围与命令之间,命令与命令之间无需分隔

选项

参数 功能
-n 取消默认sed的输出,常与内置命令p一起使用
-i 直接将修改结果写入文件,不用-i,sed修改的是内存数据
-e 多次编辑,不需要再管管道符,一个命令脚本一个-e
-r 支持扩展正则

内置命令

命令 功能
s/正则/替换内容/g 匹配正则内容并替换(支持正则),结尾g表示全局匹配,将小写转换为大写s/[aeiou]/\u&/g或者y/aeiou/AEIOU/
a append,对文本追加,在指定行后面添加一行或者多行文本(可以使用换行符)
d Delete,删除匹配行
i insert,表示插入文本,在指定行前添加一行/多行文本
p print,打印匹配行的内容,通常与-n一起使用
s/正则/替换内容/g 匹配正则内容并替换(支持正则),结尾g表示全局匹配
Q sed立即退出,不再处理,之前的将输出
N 读取下一行并加入模式空间,即模式空间拥有当前行和下一行
P 打印模式空间第一行,当前行
D 删除模式空间第一行,并循环处理剩余部分,如果模式空间为空,则读取下一行

sed匹配范围

范围 解释
空地址(不加数字) 全文处理
单地址(一个数字) 指定文件的某一行
/pattern/ 被模式匹配到的每一行,如果不表示范围的话,在两个正则表达式之间需要分号隔开
范围区间 10,20 10到20行;10,+5第10行向下5行,/pattern1/, /pattern2/; ‘n,4’表示第n行到结尾,包括第n行
步长 1~2,表示1、3、5、7、9行,2~2表示2、4、5、6、8、10偶数行

注意

  • 在sed中,单引号和双引号有所不同,如果要在pattern,command中使用变量,那么最好使用双引号,如果不用变量可以使用单引号

awk


更适合编辑、处理匹配到的文本内容

使用语法

  • awk [ option ] ‘pattern[action]’ file …
  • awk 参数 ‘条件动作’ 文件
  • awk options ‘pattern {action}’ file
  • 参数中的模式代表,条件或者正则等模式,条件包括对行限定等

内置变量

形式 解释
$n 指定分隔符后,当前记录的第n个字段
$0 完整的输入记录,整行
FS 字段分隔符,默认是空格
NF(number of fields ) 分割后,当前行一共有多少个字段
NR ( Number of records) 当前记录数,行数

注意

  • 使用-F “ ”指定分隔符时,可以使用”[多个分隔符]”方括号来使用多个分隔符