文本三剑客

目录

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 命令使用举例

打印磁盘已经使用情况

文本三剑客_第1张图片

打印字符串

文本三剑客_第2张图片

打印字符串确定文件有多少行

文本三剑客_第3张图片

提取 ip地址

文本三剑客_第4张图片

打印 /etc/passwd 所有用户名

文本三剑客_第5张图片

打印多列内容

文本三剑客_第6张图片

提取 /etc/passwd 以 root 开头的行

文本三剑客_第7张图片

打印倒数第二行

文本三剑客_第8张图片

当前处理的行的行号

文本三剑客_第9张图片

NR==n 代表行号,取第几行

NR%2==0 取偶数行;NR%2==1 取奇数行

文本三剑客_第10张图片

NR==m,NR==n 取 m到n 区间行

取 uid 数值范围

文本三剑客_第11张图片

统计 /etc/fstab 文件中每个文件系统类型出现的次数

文本三剑客_第12张图片

提取主机名并放入原文件

文本三剑客_第13张图片

文本三剑客_第14张图片

统计 /etc/fstab 文件中每个单词出现的次数

文本三剑客_第15张图片

提取字符串 Yd$C@M05MB%9&Bdh7dq+YVixp3vpw 中的所有数字

文本三剑客_第16张图片


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/旧字符串/新字符串/替换标记

—— 替换标记

  1. 数字 :表明新字符串将替换第几处匹配的地方

  2. g : 表明新字符串将会替换所有匹配的地方

  3. p : 打印与替换命令匹配的行,与 -n 一起使用

  4. w 文件 :将替换的结果写到文件中

文本三剑客_第17张图片

文本三剑客_第18张图片

将test里凡是带r..t的字段后面都加上er

—— sed -n 's/r..t/&er/g' test

sed 命令使用举例

sed ''    :交互模式输入一行,自动打印一行相同的
​
sed -n '' :交互模式输入一行,关闭自动打印
​
sed -n '' :加上p又恢复自动打印

文本三剑客_第19张图片

查看文件,打印全部内容

文本三剑客_第20张图片

打印指定行内容

根据地址,打印指定多行内容

文本三剑客_第21张图片

打印多行后退出

文本三剑客_第22张图片

打印最后一行,使用通配符 $

过滤关键字

#,/关键字/p’ 从第 #行 开始匹配

文本三剑客_第23张图片

‘/关键字/,#’ 找到第 #个 关键字为止

文本三剑客_第24张图片

打印文本的奇数/偶数行

文本三剑客_第25张图片

删除指定行

文本三剑客_第26张图片

删除指定的多行

文本三剑客_第27张图片

删除汇总
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'

你可能感兴趣的:(服务器,运维,linux)