grep, sed, awk 的用法

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 的话, 使用正则时, 需要使用 \ 符号进行转译特殊字符.

  • 指定开头和结尾

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 脚本是由各种模式和操作组成,
  1. 模式

模式可以是以下几种

  • 正则表达式: 使用通配符的扩展集
  • 关系表达式: 使用运算符进行操作, 可以是字符串或数字比较测试
  • 模式匹配表达式: 用运算符 ~(匹配)和 ~!不匹配
  • BEGIN 和 END 语句块以及 pattern 语句块
  1. 操作 操作是 一個或多個命令, 函數, 表達式組成的, 之间you换行符或者分号隔开, 并位于大括号内, 主要是由 变量, 数组赋值, 输出命令, 和内置函数, 控制语句 组成.

3.4 awk 执行过程

  1. 第一步指执行 BEGGIN { commands } 语句块
  • BEGIN语句:
    • 在awk 开始输入输出流中读取行之前执行, 在 BEGIN 语句块执行如变量初始化, 打印头信息 等操作
  1. 从文件或标准输入读取一行, 然后执行 parttern{ commands } 语句块
  • parttern 语句块:
    • parttern 语句块中通用的命令是最重要的部分, 如果没有提供该块语句, 则默认执行 { print }, 即打印读取到的行, 该语句块会在每次读取新的一行时 都会执行一次, 直到行结束
  1. 第一步指执行 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

转载于:https://my.oschina.net/nikoF/blog/2874815

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值