文章目录
- 前言
- 一、grep过滤
- 命令格式
- 思考
- 二、sed
- 1、工作流程
- 2、命令格式
- 3、常用选项
- 思考
- 三、awk
- 1、工作原理:
- 2、命令格式
- 3、内置变量(常见)
- BEGIN
- 模糊匹配
- 数值比较
- 逻辑运算&&和||
- 高级用法
- 定义引用变量
- if语句
- 循环语句
- 思考
- 总结
前言
脚本的内容一般都会比较多,但是我们不会每次都通过vim命令进入脚本来对其进行查询或修改,因此我们可以通过命令直接对脚本的内容来进行查询、过滤与修改。
一、grep过滤
grep 命令用于查找文件里符合条件的字符串
命令格式
grep [选项]... 查找条件 目标文件
##参数如下:
-E : 将样式为延伸的正则表达式来使用。
-c : 计算符合样式的列数。
-i : 忽略字符大小写的差别。
-n : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o : 只显示匹配到的部分。
-v : 显示不包含匹配文本的所有行。
显示行数-c
不区分大小写-i
取反-v(选择不是root的)
取反将不是空行的内容输入指定文件
查找并显示行号-n
查找指定字符并显示行号
也可以组合使用,查找取反并且显示行号
grep与egrep的比较
思考
如何通过一条命令来实现以下需求:
1、首先查到列出所有log文件并且重定向给grep
2、使用grep 查找error 的行
3、使用grep 来查找不包含info 的行
二、sed
1、工作流程
- 读取:sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完
2、命令格式
sed -e '编辑指令' 文件1 文件2...
sed -n -e '编辑指令' 文件1 文件2...
sed -i -e '编辑指令' 文件1 文件2...
###编辑命令格式
地址:可数字、正则表达式、$,没有地址代表是所有行
操作:可以使a、c、d、p、r、w、s、y等
参数:一般有g,代表只要符合条件的全部进行处理
3、常用选项
##参数说明:
-e:指定要执行的命令,只有一个编辑命令时可以省略
-n:只输出处理后的行,读入时不显示
-i:直接编辑文件,而不输出结果
-f:用指定的脚本文件来处理输入的文本文件
-s:将多个文件视为独立文件,而不是单个连续的长文件流
##动作说明
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除,因为是删除啊,所以 d 后面通常不接任何东西;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g
-n:显示处理后的结果,但是不修改文件原本的内容,-p:打印输出
指定行数打印输出(可以指定单行或多行)
指定从第9行到尾行输出
输出第二行的内容但不显示
输出有指定内容的行
指定有内容指定行号输出
输出有指定内容的行号
显示以指定内容开头的内容
指定结尾位,
以数字结尾
通过单词边界查找所在行
补充:nl——打印并显示文件的行号
将nl与sed -d组合使用删除
也可以用来删除多行(指定行号)
删除包含有指定文字所在行
删除所有的空行(^$::表示空行)
指定内容进行替换(这里是将第二个e转换成E)
指定替换所有(g:指定为全局变量)
指定字符替换成空格
转换多个含有符号的字符信息(需要代用转义符)
也可以通过#/@来进行分割
通过指定行号来进行内容的替换
替换多行内容
举例:使用sed命令去修改/etc/sysconfig/selinux文件的信息,将安全增强机制关闭
插入内容(一般默认为末行插入)
酱油指定内容的行切割并至于末尾(H:复制;d:删除;“;”:分割)
将指定内容另存到另一个文件中
在有指定内容的行末添加/etc/hostname里面的内容
打印输出IP地址的第二列以数 . 头的内容,并打印出第一个组
多次替换
思考
使用sed命令变写一个脚本来调整vsftpd服务配置,要求禁止匿名用户登录,但允许本地用户登录(且写入)
三、awk
1、工作原理:
逐行读取文本,默是认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
- awk是是一个强大的编辑工具
- 是无交互情况下实现复杂的文本操作
2、命令格式
awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
3、内置变量(常见)
- FS:指定每行文本的字段分隔符,缺省为空格或制表位(tab)
- OFS:输入字段的分割符(默认是空格)
- NF:当前处理的行的字段个数
- NR:当前处理的行的行号(序数)
- FNR:读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始)
- ORS:输出行的分割符,默认为换行符
- RS:行分隔符,根据RS的定义把资料切割成许多条记录
- $0:当前处理的行的整行内容
- $n:当前处理行的第n个字段(第n列)
按文本打印
读取打印第一列
以x做分割,读取后打印第一列
[:/]中出现任意一个符号都可作为分割符
显示打印满足条件的整行内容
打印满足条件的指定列内容
打印满足条件的行号
显示满足条件的行号与内容
显示总行号(最后一行的行号)
打印最后一行的全部内容
显示行数与列数
输入字段分隔符为:
输出字段分割符为—
以:做输入分割符,—做输出分隔符
FNR开启新的文件依旧会从1开始
BEGIN
将内容划分成不同的模块,逐行开始执行任务,结束之后再执行,使用BEGIN、END,其中
- BEGIN一般用来做初始化的操作,仅在读取数据记录之前执行一次
- END一般用来做汇总操作,尽在读取完数据记录之后执行一次
定义不同变量的输出
以:为转换符换行
加上[ ]表示:或/来做分割,并显示出该行的所有内容
输出空格来做分隔符
模糊匹配
加上双引号“”可以用来标识精确搜索
数值比较
打印指定行号
打印第3列值为0的内容
打印满足指定行的内容
查询第3列大于1000的内容并显示(其中1000以上的值表示普通用户)
逻辑运算&&和||
输出第5行到第9行的内容
输出第3列值小于10或大于1000的内容
输出200以内能够被7整除且包含有7的数
高级用法
定义引用变量
给变量a赋值,将系统变量a通过awk工具赋值给b,然后调用变量b,这里也可以通$a来直接调用
对比不同引号之间的区别——同时使用单双引号的时候会优先读取处于内部的引号
这里也可以通过对双引号进行转义来读取
直接对变量值进行定义后调用输出
调用函数getline,可以读取包含某一行数据的内容
输出10以内的基数:先输出,后调用
输出10以内的偶数:点调用,后输出
if语句
- 单分支:if(){}
- 双分支:if(){} else {}
- 多分支:if(){} else if (){} else {}
打印第3列小于10的全部内容
第3列小于10的打印第3列,否则打印全部内容
循环语句
awk还支持for循环、while循环、函数和数组等
思考
1、如何查询本机的网卡IP,与使用流量
2、显示磁盘可用空间
总结
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。