文章目录

  • 前言
  • 一、grep过滤
  • 命令格式
  • 思考
  • 二、sed
  • 1、工作流程
  • 2、命令格式
  • 3、常用选项
  • 思考
  • 三、awk
  • 1、工作原理:
  • 2、命令格式
  • 3、内置变量(常见)
  • BEGIN
  • 模糊匹配
  • 数值比较
  • 逻辑运算&&和||
  • 高级用法
  • 定义引用变量
  • if语句
  • 循环语句
  • 思考
  • 总结



前言

脚本的内容一般都会比较多,但是我们不会每次都通过vim命令进入脚本来对其进行查询或修改,因此我们可以通过命令直接对脚本的内容来进行查询、过滤与修改。


一、grep过滤

grep 命令用于查找文件里符合条件的字符串

命令格式

grep [选项]... 查找条件 目标文件
##参数如下:

	-E : 将样式为延伸的正则表达式来使用。
	
	-c : 计算符合样式的列数。

	-i : 忽略字符大小写的差别。
	
	-n : 在显示符合样式的那一行之前,标示出该行的列数编号。
	
	-o : 只显示匹配到的部分。

	-v : 显示不包含匹配文本的所有行。

显示行数-c

shell脚本grep案例_bash


不区分大小写-i

shell脚本grep案例_linux_02


取反-v(选择不是root的)

shell脚本grep案例_字段_03


取反将不是空行的内容输入指定文件

shell脚本grep案例_linux_04

查找并显示行号-n

shell脚本grep案例_字段_05


查找指定字符并显示行号

shell脚本grep案例_linux_06


shell脚本grep案例_bash_07


shell脚本grep案例_正则表达式_08


shell脚本grep案例_字段_09


shell脚本grep案例_linux_10


shell脚本grep案例_shell脚本grep案例_11


shell脚本grep案例_字段_12


shell脚本grep案例_bash_13

也可以组合使用,查找取反并且显示行号

shell脚本grep案例_shell脚本grep案例_14

grep与egrep的比较

shell脚本grep案例_字段_15


shell脚本grep案例_字段_16

思考

如何通过一条命令来实现以下需求:

1、首先查到列出所有log文件并且重定向给grep

2、使用grep 查找error 的行

3、使用grep 来查找不包含info 的行

shell脚本grep案例_正则表达式_17

二、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:打印输出

shell脚本grep案例_bash_18


指定行数打印输出(可以指定单行或多行)

shell脚本grep案例_正则表达式_19


指定从第9行到尾行输出

shell脚本grep案例_linux_20


输出第二行的内容但不显示

shell脚本grep案例_linux_21


输出有指定内容的行

shell脚本grep案例_正则表达式_22


指定有内容指定行号输出

shell脚本grep案例_字段_23


输出有指定内容的行号

shell脚本grep案例_正则表达式_24


显示以指定内容开头的内容

shell脚本grep案例_bash_25


指定结尾位,

shell脚本grep案例_linux_26


以数字结尾

shell脚本grep案例_bash_27


通过单词边界查找所在行

shell脚本grep案例_字段_28


补充:nl——打印并显示文件的行号

shell脚本grep案例_shell脚本grep案例_29


将nl与sed -d组合使用删除

shell脚本grep案例_linux_30


也可以用来删除多行(指定行号)

shell脚本grep案例_bash_31


删除包含有指定文字所在行

shell脚本grep案例_bash_32


删除所有的空行(^$::表示空行)

shell脚本grep案例_正则表达式_33


指定内容进行替换(这里是将第二个e转换成E)

shell脚本grep案例_字段_34


指定替换所有(g:指定为全局变量)

shell脚本grep案例_正则表达式_35


指定字符替换成空格

shell脚本grep案例_bash_36


转换多个含有符号的字符信息(需要代用转义符)

shell脚本grep案例_shell脚本grep案例_37


也可以通过#/@来进行分割

shell脚本grep案例_字段_38


通过指定行号来进行内容的替换

shell脚本grep案例_linux_39


替换多行内容

shell脚本grep案例_字段_40


shell脚本grep案例_正则表达式_41


举例:使用sed命令去修改/etc/sysconfig/selinux文件的信息,将安全增强机制关闭

shell脚本grep案例_shell脚本grep案例_42


插入内容(一般默认为末行插入)

shell脚本grep案例_shell脚本grep案例_43


酱油指定内容的行切割并至于末尾(H:复制;d:删除;“;”:分割)

shell脚本grep案例_字段_44


shell脚本grep案例_正则表达式_45


将指定内容另存到另一个文件中

shell脚本grep案例_正则表达式_46


在有指定内容的行末添加/etc/hostname里面的内容

shell脚本grep案例_bash_47


打印输出IP地址的第二列以数 . 头的内容,并打印出第一个组

shell脚本grep案例_正则表达式_48


shell脚本grep案例_shell脚本grep案例_49


多次替换

shell脚本grep案例_linux_50

思考

使用sed命令变写一个脚本来调整vsftpd服务配置,要求禁止匿名用户登录,但允许本地用户登录(且写入)

shell脚本grep案例_正则表达式_51


shell脚本grep案例_shell脚本grep案例_52


三、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列)

按文本打印

读取打印第一列

shell脚本grep案例_bash_53


以x做分割,读取后打印第一列

shell脚本grep案例_linux_54


[:/]中出现任意一个符号都可作为分割符

shell脚本grep案例_bash_55


显示打印满足条件的整行内容

shell脚本grep案例_linux_56


打印满足条件的指定列内容

shell脚本grep案例_正则表达式_57


打印满足条件的行号

shell脚本grep案例_字段_58


shell脚本grep案例_字段_59


显示满足条件的行号与内容

shell脚本grep案例_bash_60

显示总行号(最后一行的行号)

shell脚本grep案例_linux_61

打印最后一行的全部内容

shell脚本grep案例_字段_62


显示行数与列数

shell脚本grep案例_bash_63

输入字段分隔符为:

shell脚本grep案例_linux_64


输出字段分割符为—

shell脚本grep案例_bash_65


以:做输入分割符,—做输出分隔符

shell脚本grep案例_字段_66


FNR开启新的文件依旧会从1开始

shell脚本grep案例_linux_67

BEGIN

将内容划分成不同的模块,逐行开始执行任务,结束之后再执行,使用BEGIN、END,其中

  • BEGIN一般用来做初始化的操作,仅在读取数据记录之前执行一次
  • END一般用来做汇总操作,尽在读取完数据记录之后执行一次

shell脚本grep案例_linux_68


定义不同变量的输出

shell脚本grep案例_linux_69


shell脚本grep案例_shell脚本grep案例_70


shell脚本grep案例_bash_71

以:为转换符换行

shell脚本grep案例_linux_72


加上[ ]表示:或/来做分割,并显示出该行的所有内容

shell脚本grep案例_shell脚本grep案例_73


输出空格来做分隔符

shell脚本grep案例_字段_74

模糊匹配

shell脚本grep案例_linux_75


shell脚本grep案例_bash_76


加上双引号“”可以用来标识精确搜索

shell脚本grep案例_linux_77

数值比较

打印指定行号

shell脚本grep案例_正则表达式_78


shell脚本grep案例_bash_79


打印第3列值为0的内容

shell脚本grep案例_linux_80

打印满足指定行的内容

shell脚本grep案例_正则表达式_81


查询第3列大于1000的内容并显示(其中1000以上的值表示普通用户)

shell脚本grep案例_shell脚本grep案例_82

逻辑运算&&和||

输出第5行到第9行的内容

shell脚本grep案例_字段_83


输出第3列值小于10或大于1000的内容

shell脚本grep案例_linux_84


输出200以内能够被7整除且包含有7的数

高级用法

定义引用变量

给变量a赋值,将系统变量a通过awk工具赋值给b,然后调用变量b,这里也可以通$a来直接调用

shell脚本grep案例_bash_85


对比不同引号之间的区别——同时使用单双引号的时候会优先读取处于内部的引号

shell脚本grep案例_字段_86


这里也可以通过对双引号进行转义来读取

shell脚本grep案例_linux_87


直接对变量值进行定义后调用输出

shell脚本grep案例_bash_88


调用函数getline,可以读取包含某一行数据的内容

shell脚本grep案例_shell脚本grep案例_89


输出10以内的基数:先输出,后调用

shell脚本grep案例_shell脚本grep案例_90


输出10以内的偶数:点调用,后输出

shell脚本grep案例_bash_91

if语句
  • 单分支:if(){}
  • 双分支:if(){} else {}
  • 多分支:if(){} else if (){} else {}
    打印第3列小于10的全部内容

    第3列小于10的打印第3列,否则打印全部内容
循环语句

awk还支持for循环、while循环、函数和数组等

思考

1、如何查询本机的网卡IP,与使用流量

shell脚本grep案例_字段_92


shell脚本grep案例_shell脚本grep案例_93


2、显示磁盘可用空间

shell脚本grep案例_linux_94


总结

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。