目录
grep
awk
工具介绍
awk 命令
awk 常见的内置变量可直接用
awk 命令使用举例
打印磁盘已经使用情况
打印字符串
打印字符串确定文件有多少行
提取 ip地址
打印 /etc/passwd 所有用户名
打印多列内容
提取 /etc/passwd 以 root 开头的行
打印倒数第二行
当前处理的行的行号
NR==n 代表行号,取第几行
NR%2==0 取偶数行;NR%2==1 取奇数行
NR==m,NR==n 取 m到n 区间行
取 uid 数值范围
统计 /etc/fstab 文件中每个文件系统类型出现的次数
提取主机名并放入原文件
统计 /etc/fstab 文件中每个单词出现的次数
提取字符串 Yd$C@M05MB%9&Bdh7dq+YVixp3vpw 中的所有数字
sed
sed 命令
搜索替代
sed 命令使用举例
查看文件,打印全部内容
打印指定行内容
根据地址,打印指定多行内容
打印多行后退出
打印最后一行,使用通配符 $
过滤关键字
#,/关键字/p’ 从第 #行 开始匹配
‘/关键字/,#’ 找到第 #个 关键字为止
打印文本的奇数/偶数行
删除指定行
删除指定的多行
删除汇总
插入
变量
分组调用
提取ip地址
grep
—— 格式:grep 选项 查找条件 目标文件
选项 | 作用 |
---|---|
-color=auto | 对匹配到的文本着色显示,自带的功能 |
-m 数字 | 匹配 多少次后停止 (多个匹配只取第一个) |
-v | 显示不被 pattern 匹配到的行,即取反 |
-i | 忽略字符大小写 |
-n | 显示匹配的行号 |
-c | 统计匹配的行数 |
-o | 仅显示匹配到的字符串 |
-q | 静默模式,不输出任何信息 |
-A | 匹配到的行后 n 行显示出来 |
-B | 前 n 行 |
-C | 前后各 n 行 |
-e | 实现多个选项间的逻辑或者关系 |
-E | 使用ERE,相当于 egrep |
-F | 不支持正则表达式,相当于 fgrep |
-f | file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件 |
-r | 递归目录,但不处理软链接 |
-R | 递归目录,但处理软链接 |
-w | 匹配整个单词 |
awk
工具介绍
-
awk 是一种处理文本文件的语言,是一个强大的文本分析工具
-
可以在无交互的模式下实现复杂的文本操作
-
相较于 sed 常作用于一整个行的处理,awk 则比较倾向于一行当中分成数个字段来处理,因为awk 相当适合小型的文本数据
awk 命令
—— 格式:awk 选项 '表达式{处理动作}'
选项 | 作用 |
---|---|
-F | 指定分隔符 |
-v | 自定义变量 |
-f | 脚本 |
awk 常见的内置变量可直接用
选项 | 作用 |
---|---|
FS | 列分割符;指定每行文本的字段分隔符,默认为空格或制表位;与 "-F" 作用相同 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第n个字段(第n列) |
FILENAME | 被处理的文件名 |
RS | 行分隔符;awk 从文件上读取资料时,将根据 RS 的定义把资料切割成许多条记录,而 awk 一次仅读入一条记录,以进行处理,预设值是 ’\n’ |
OFS | 输出时的分隔符 |
awk 命令使用举例
打印磁盘已经使用情况
打印字符串
打印字符串确定文件有多少行
提取 ip地址
打印 /etc/passwd 所有用户名
打印多列内容
提取 /etc/passwd 以 root 开头的行
打印倒数第二行
当前处理的行的行号
NR==n 代表行号,取第几行
NR%2==0 取偶数行;NR%2==1 取奇数行
NR==m,NR==n 取 m到n 区间行
取 uid 数值范围
统计 /etc/fstab 文件中每个文件系统类型出现的次数
提取主机名并放入原文件
统计 /etc/fstab 文件中每个单词出现的次数
提取字符串 Yd$C@M05MB%9&Bdh7dq+YVixp3vpw 中的所有数字
sed
—— 格式:sed 选项 {脚本(如果没有其他脚本)} 输入文件
—— sed 是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行;每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾;一次处理一行的设计模式使得 sed 性能很高,sed 在读取大文件时不会出现卡顿的现象;如果使用 vi 命令打开 几十M上百M 的文件,明显会出现有卡顿的现象,这是因为 vi 命令打开文件是一次性将文件加载到内存,然后再打开;sed 就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快
sed 命令
—— sed 选项 自身脚本语法 支持标准输入管道
选项 | 作用 |
---|---|
-n | 不输出模式空间内容到屏幕,即不自动打印 |
-e | 多项编辑 |
-f | 从指定文件中读取编译脚本 |
-r | 使用扩展正则表达式 |
-i | 备份文件并原处编辑 |
常用操作
选项 | 作用 |
---|---|
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行下面增加一行指定内容 |
i | 插入,在选定行上面插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
Y | 字符转换,转换前后的字符长度必须相同 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容; 如果有非打印字符,则以 AscII 码输出。其通常与_n"选项一起使用 |
= | 打印行号 |
l(小写的L) | 打印数据流中的文本和不可打印的 ASCII 字符(比如结束符 s、制表符 \t) |
搜索替代
—— 格式:sed 行范围 s/旧字符串/新字符串/替换标记
—— 替换标记
-
数字 :表明新字符串将替换第几处匹配的地方
-
g : 表明新字符串将会替换所有匹配的地方
-
p : 打印与替换命令匹配的行,与 -n 一起使用
-
w 文件 :将替换的结果写到文件中
将test里凡是带r..t的字段后面都加上er
—— sed -n 's/r..t/&er/g' test
sed 命令使用举例
sed '' :交互模式输入一行,自动打印一行相同的 sed -n '' :交互模式输入一行,关闭自动打印 sed -n '' :加上p又恢复自动打印
查看文件,打印全部内容
打印指定行内容
根据地址,打印指定多行内容
打印多行后退出
打印最后一行,使用通配符 $
过滤关键字
#,/关键字/p’ 从第 #行 开始匹配
‘/关键字/,#’ 找到第 #个 关键字为止
打印文本的奇数/偶数行
删除指定行
删除指定的多行
删除汇总
sed '$d' test #删除最后一行 sed '/^$/d' test #删除空格 sed 'd' test #全部删除 sed '/d$/d' test #删除以d结尾的行 sed '/d$/!d' test #!取反,删除除了以d结尾的行 sed '/a/,/c/d' test #删除从a开头的到c开头的,不论a-c之间有多少行都会被删除,直到匹配不到为止
插入
sed '/aa/c xxx' test #将第一行的aa替换成xxx,c默认是替换第一行 sed '3c hhh' test #将第三行,全部替换成hhh sed '1,3a 6666' test #在1-3行的下面增加6666 sed '1,3i 6666' test #在1-3行上面增加6666 sed '2r /opt/hyh' test #r读入,在第二行下面,读入opt下的hyh文件内容
变量
sed -nr "/$name/p" /etc/passwd #提取变量用户名 #变量需要加双引号
分组调用
#只有扩展正则表达式才能支持分组。 #分组使用()(),调用第一段使用\1 echo 11aaxx |sed -r 's/(11)(aa)(xx) /\1/' #调用第一组 11 echo 11aaxx |sed -r 's/(11)(aa)(xx) /\2/' #调用第二组 aa echo 11aaxx |sed -r 's/(11)(aa)(xx) /\1\2/' #调用第一、二组 11aa echo 11aaxx |sed -r 's/(11)(aa)(xx) /\1\2\3/' #调用所有分组 11aaxx
提取ip地址
ifconfig ens32 |sed -rn '2s/.*(inet) ([0-9.]+) (netmask) ([0-9.]+) (broadcast) ([0-9.]+).*/\2/p'