1. grep 和 egrep 工具
1.1 简介
grep (global search regular expression and print out the line) 全面搜索正则表达式并把匹配的行打印出来 , 是一种很强大的文本搜索工具, egre 是 grep 的扩展, 支持更多的 re 元字符, 还有fgrep 是把所有的字母当做单词, 也就是说正则表达式中的元字符表示晦气自生的字面意义, 不在特殊, linux 使用的是 GUN 版本的 grep, 可以通过 -G, -E, -F 命令来使用 egrep 和 fgrep 的功能
1.2 grep 常用用法
-
语法:
grep [OPTIONS]
-
选项
-a: --text 不忽略二进制的数据
-A<N>: --after-context=<N> 除了显示匹配到的行外, 还会显示该行后面的<N>行
-b: --byte-offset 在显示该行内容前 会列出该列第一个字符在文件中的字符偏移量
-B <N>: --before-context=<N> 显示匹配到的行, 还会显示该行前面 <N>行的内容
-c: --count 统计符合匹配的行数
-C<N>: --context=<N> 除了显示匹配行外, 会显示该行前后各<N> 行的内容
-d<动作> 指定查找的是目录而非问阿金时, 必须使用该参数, 否则 grep 会停止动作
-e<范本>: 指定需要作为查找文件内容的范本.
-E --extended-regexp 将范本作为扩展表示方法来使用, 等同于使用 egrep
-f <范本>: 指定范本文件, 其内容包含一个或多个范本, 让grep 查找符合条件的内容
-F: --fixed-regexp 将范本规则视为固定字符串的列表
-G: 将范本视为普通的表示方法来使用
-h: 显示符合范本样式的一列前, 不标该列所属的文件名称
-H: 显示符合范本 一列之前, 标识该列所属文件名称
-i: 忽略大小写
-l: 列出内容符合指定范本的文件名
-L: 累出文件内容不符合指定的样式的文件名称
-n: 显示符合样式的一行之前, 标出该行的 行号
-q: 不显示任何信息
-r: 此参数的效果和 -d resurce 相同
-s: 不显示错误信息
-v: 显示不包含匹配文件的所有行
-V: 显示版本信息
-w: 只显示全符合的列
-x: l只显示全列的符合的列
y: 该参数与 -i 相同
1.3 示例
- 从passwd 文件检索 'root', 显示行号
- 检索内容, 不区分大小写
- 检索不包含root 的行
- 检索到内容并显示该行内容前后各两行.
- 使用正则表达式检索文件内的内容
- 如果如果不适用 egrep 或 grep -E 的话, 使用正则时, 需要使用
\
符号进行转译特殊字符.
- 如果如果不适用 egrep 或 grep -E 的话, 使用正则时, 需要使用
- 指定开头和结尾
2. 正则表达式
2.1 什么是正则表达式
Regular expression(正则表达式) 是由一类特殊字符以及文本字符编写的模式, 其中某些字符(元字符)具有特殊的含义, 可以控制或通配功能
2.2 那些程序正则表达式
linux 中常用的文本工具都是支持正则表达式的, 比如 grep, sed, awk, vim, less. 某些服务也是支持使用正则作为匹配方式的, 如 nginx, carnish 几乎所有的编程语言都是支持使用正则的.
2.3 正则表达式字符分类
1. 元字符
正则中常常使用元字符来表示一类字符, 而不用直接指明该字符. 常用元字符有:
^ 以某一个字符(串)为行首,
$ 匹配某个字符为结尾
. 表示一个任意字符
\b 不会消耗任何字符, 只是匹配一个字符的单词边界, 比如 \bis\b 表示一个完整单词is, 两侧都是空白
\d 匹配数字
\w 匹配字母, 数字, 下划线
\s 匹配空格, 多个空格可以使用 \s+
[] 匹配中括号范围内的一个内容, 比如 [ab1] 表示只匹配, a或b或1, 可以使用 [a-z] 匹配一个范围
() 将一段表达式, 作为整体
x|y x或y, | 表示左边内容或右边内容
# 几种反义
\W 匹配非字母,数字,下划线
\S 匹配非空格字符
\D 匹配任意非数字字符
\B 匹配不是单词开头的字符
[^] 匹配非中括号内的内容
# 字符类
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何空白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]
2. 重复次数
* 前一个子表达式出现 0次或者更多次
+ 前一个子表达式出现 1次或更多次
? 重复 0次或1次
{n} 重复 n次
{n,} 最少重复 n次
{n,m} 最少重复 n次, 最多m次
3. sed 命令用法
3.1 sed 是什么
sed 是一种流编辑器, 用于处理文本的工具, 能够完美的配合正则表达式使用, 功能非常强大, sed 是非交互式的编辑(编辑过程不需要用户参与), 使用预设定的指定对文本进行编辑, 完成后输出结果.
- 工作原理 sed 在处理文件时, 会将处理的行存储在临时缓冲区内, 称为'模式空间', 接着sed 会处理缓冲区 内的内容, 处理完成后会将该行内容输出到屏幕上, 接着处理下一行, 知道文件结束, 这样处理 文件本身内容是不会被修改的, 除非指定修改源文件.
3.2 sed 命令的语法, 选项, 命令, 替换标记
-
语法:
sed [opitons] 'command files
-
选项
-e <script> 用选中的指定 script 来处理文本文件
-f <script> 使用script 文件来处理文件
-h: 帮助信息
-i [扩展名] 直接修改文件, 如果指定了扩展那名, 则备份文件
-l N: 指定'l' 命令的换行期望周期
-n 不会自动打印全部内容
--posix: 关闭 GUN 扩展
-r: 在脚本中使用 扩展的表达式
-s: 将输入文件视为各个独立的文件, 而不是一个长的连续输入
- 命令
a\\ 在当前行下面插入文本
i\\ 当前行上面插入
c\\ 选定的行跟新
d 删除选择的行
D 删除模板的第一行
s 替换指定的字符
h 拷贝模板内容到缓冲区
H 追加模块内容到缓冲区
g 获得内存缓冲区的内容, 并替换当前模板块中的文本
G 获得内存缓冲区的内容, 并追加到当前模板块文本后面
l 列表不能打印字符的清单
n 读取下一行输入, 用下一个命令处理新的行 而不是第一个命令
N 追加下一输入行到模板后面并在二者之间嵌入一个新行
p 打印模板行
P 打印模板 的第一行
q 退出 sed
b lable 分支到脚本带有标记地方, 如果不存在, 则分支到脚本末尾
r file 从 file 读取行
t label 错误分支, 从最后一行开始, 一旦发生错误, 导致分支到标记命令处
w file 写并追加模板到 file 末尾
W file 写并追加模板的第一行 到file 末尾
! 表示某明命令对所选没有选定的行发生作用
= 打印当前行号
# 把注释扩展到下一个换行符前面
- 替换标记
g 行内全体换
p 打印行
w 把行写入一个文件
x 表示互换模板中的文本和缓冲区中的文本
y 把一个字符翻译为另一个字符(不用于正则表达式)
\\1 子串匹配标记
& 已匹配的字符串
- 元字符集
^ 匹配行开始, 如: /^a/ 匹配所有a 开头的行
$ 匹配行结束
. 任意一个字符
* 匹配 0个或更多个字符
[] 匹配 一个指定范围内的字符, 如[ab] 表示匹配a或b
[^] 匹配指定范围 外的字符
& 保存搜索的字符串用来替换其他字符, 如: /abc/--&--/ 会将 abc替换成--abc--
\(\)/\1 后项引用, 如: /s/\(abc\)def/\1XXX/ 这一段会匹配 abcdef 字段, 并将其替换成 abcXXX, 这里的 \1 就是后项引用了前面的 第一个() 内的内容,
\b 匹配单词边界, 如\babc\b 表示匹配abc 这个词
x{n} 匹配 x 字符 出现 n 次
x{n,} 匹配 x 字符, 最少出现 n 次
x{n,m} 匹配 x 字符, 最少出现 n 次, 最多 m 次
3.3 示例
- 将passwd 文件内的 root 替换成 fangfc
- 将所有数字替换成000
- 仅显示被修改过的行
- 修改 test开头的行, 将其home 修改为
3. awk 工具
3.1 awk 是什么
awk 是一种便于使用且表达力强的工具, 是一种变成语言, 用于linux/unix 下的文本处理, 数据可以是来自标准输出或文件, 支持用户自定义函数 和正则表达式, 多出场景是作为脚本内的文本处理工具来使用.
3.2 语法和选项
-语法:
-
awk [options] 'script' file
-
awk [options] 'BEGIN{command} partten{ commands } END { commands }' file
-
常用选项
-F fs 指定文件内的分隔符, 可以指定一个正则表达式
-v 赋值一个用户定义的变量
-f FILE 从文件中读取 script 或者直接是一个 awk script 脚本
3.3 模式和动作
- awk 脚本是由各种模式和操作组成,
- 模式
模式可以是以下几种
- 正则表达式: 使用通配符的扩展集
- 关系表达式: 使用运算符进行操作, 可以是字符串或数字比较测试
- 模式匹配表达式: 用运算符 ~(匹配)和 ~!不匹配
- BEGIN 和 END 语句块以及 pattern 语句块
- 操作 操作是 一個或多個命令, 函數, 表達式組成的, 之间you换行符或者分号隔开, 并位于大括号内, 主要是由 变量, 数组赋值, 输出命令, 和内置函数, 控制语句 组成.
3.4 awk 执行过程
- 第一步指执行
BEGGIN { commands }
语句块
- BEGIN语句:
- 在awk 开始输入输出流中读取行之前执行, 在 BEGIN 语句块执行如变量初始化, 打印头信息 等操作
- 从文件或标准输入读取一行, 然后执行
parttern{ commands }
语句块
- parttern 语句块:
- parttern 语句块中通用的命令是最重要的部分, 如果没有提供该块语句, 则默认执行 { print }, 即打印读取到的行, 该语句块会在每次读取新的一行时 都会执行一次, 直到行结束
- 第一步指执行
END { commands }
语句块
- END语句:
- 在awk 读取完所有行时 被执行的语句块, 通常用于打印分析结果, 信息汇总.
3.5 awk 内置变量
$N 当前记录的第 N个字段
ARGC 命令行元组数
ARGIND 命令行中当中文件的位置,( 用于处理多文件时, 记录当前文件的偏移量)
CONVFMT 数字转化格式,(默认 %.6g)
ERRNO 最后一个系统错误描述
FIELDWIDTHS 字列宽度(用空格分割)
FILENAME 当前键入的文件名
FNR 当前文件中记录号
FS 输入域 的分隔符, 默认是空格
RS 输入域 记录分隔符
NF 当前记录域的个数
NR 目前为止的记录数
OFS 输出域的分隔符
ORS 输出与的 记录分割符
4 示例
- 列出 passwd 中uid 大于1000 的用户
- 显示 passwd 文件中 fangfc 用户和 root 描述和 家目录
- 显示本地两块网卡的IP
END