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 “ ”指定分隔符时,可以使用”[多个分隔符]”方括号来使用多个分隔符