掘金 后端 ( ) • 2024-05-17 10:12

theme: channing-cyan

grep

一、grep:过滤行内容

grep命令格式: grep [选项]... 查找条件 目标文件

选项

-i:查找时忽略大小写

-v:反向查找,输出与查找条件不相符的行
 grep -Ev '^[[:space:]]*#|^$' /etc/fstab

-o 只显示匹配项

-f 对比两个文件的相同行

-c 匹配的行数
 [root@localhost ky15]# grep -c root passwd 2
 
 -color=auto #对匹配到的文本着色显示

-m  # 匹配#次后停止
 grep -m 1 root /etc/passwd   #多个匹配只取第一个

-n 显示匹配的行号

-q 静默模式,不输出任何信息

-A # after, 后#行 
grep -A3 root /etc/passwd   #匹配到的行后3行业显示出来

-B # before, 前#行

-C # context, 前后各#行

-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行

-w 匹配整个单词

-E 使用ERE,相当于egrep

-F 不支持正则表达式,相当于fgrep

-f   file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件

-r   递归目录,但不处理软链接

-R   递归目录,但处理软链接

示例

image.png

image.png

image.png

image.png

sed

一、sed:过滤行内容;修改行内容

image-20211012234144132.png

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。

二、sed的工作流程

sed的工作流程主要包括读取、执行和显示三个过程:

  • 读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
  • 执行: 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  • 显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意

默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中。

三、sed命令的格式

sed命令的格式:sed [ 选项 ].... 'script;script;....'(自身脚本语法) [input file...]

选项

-   -n 不输出模式空间内容到屏幕,即不自动打印
-   -e 多点编辑[root@www data]#sed -n -e '/^r/p' -e'/^b/p' /etc/passwd
-   -f FILE 从指定文件中读取编辑脚本
-   -r, -E 使用扩展正则表达式
-   -i.bak 备份文件并原处编辑
-   -s  将多个文件视为独立文件,而不是单个连续的长文件流

sed命令选项格式

 sed -e '操作' 文件1 文件2
 
 sed -n -e '操作' 文件1 文件2
 
 sed -f  脚本文件  文件1 文件2
 
 sed -i -e '操作' 文件1 文件2

示例:

1)查看文件内容,sed自带打印功能

image.png

2)支持重定向

image.png

3)支持管道符

image.png

四、sed脚本格式

单引号中间需要写脚本,脚本格式如下

脚本内容由'地址+命令'组成

地址表示:
1. 不给地址:对全文进行处理(比如行号)
2. 单地址:
  #:指定的行,$:最后一行
  /pattern/:被此处模式所能够匹配到的每一行,正则表达式
3. 地址范围:
  #,#     #从#行到第#行,3,6 从第3行到第6行
  #,+#   #从#行到+#行,3,+4 表示从3行到第7行
  /pat1/,/pat2/    第一个正则表达式和第二个正则表达式之间的行
   #,/pat/  从#号行为开始找到 pat为止 
  /pat/,#  找到#号个pat为止
4. 步进:~
  1~2 奇数行
  2~2 偶数行   

示例

image.png

1. sed脚本中的常用命令操作

常用操作

操作 作用 s 替换,替换指定字符 d 删除,删除选定的行 a 增加,在当前行下方增加一行指定内容 i 插入,在选定行上方插入一行指定内容 c 替换,将选定行替换为指定内容 y 字符转换,转换前后的字符长度必须相同 p 打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用 = 打印行号 l (小写L) 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

sed的核心功能:增删改查(可配合正则表达式)

 查: p

 删: d

 改: s(字符串替换)、c(整行替换)、y(对应字符进行替换,效果类似tr命令)

 增: i(在行前插入内容)、a(在行后添加内容)、r(在行后读入文件的内容)

 复制粘贴:H(复制)、d(删除)、G(粘贴到指定行下方)

示例

1)打印网卡IP

image.png

2)支持正则表达式

image.png

匹配正则表达式

也可以匹配正则表达式之间的行/ /,/ / 

举例显示/etc/passwd 中b开头和f开头中间的行 

先开始找b开头一直找到f开头 
然后再重新找b开头,一找到f开头,没有f开头就全显示 重复循环

示例1:匹配正则表达式之间的行

image.png

示例2:在指定行前后添加i、a

image.png

示例3:\表示空格,\n表示换行,\c表示指定行替换

image.png

示例4:取反和复制替换

image.png

2.sed搜索替代

格式:sed -i 's///' 文件名

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写

示例1:如何使用sed替换网卡内的IP地址

image.png

示例2:&指代之前的内容

image.png

五、变量

name=root
[root@localhost data]# sed -nr '/'$name'/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

image.png

AWK

一、AWK的介绍

awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK。

有多种版本:

AWK:原先来源于 AT & T 实验室的的AWK

NAWK:New awk,AT & T 实验室的AWK的升级版

二、AWK的工作原理

image-20220808150825929.png

  • 第一步:执行BEGIN{action;… }语句块中的语句

  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件, 从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

  • 第三步:当读至输入流末尾时,执行END{action;…}语句块 BEGIN语句块。

  • 在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

  • END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

  • pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

注意

awk比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab键。awk执行结果可以通过 print 的功能将字段数据打印显示。

三、AWK的基本用法

AWK的格式:awk 选项 模式 处理的动作

选项

-F :指定分隔符

-V :自定义变量

-f :脚本文件

注意

  • 注意一定是单引号:'模式或条件 {操作}'
  • { }外指定条件,{ }内指定操作。
  • 用逗号指定连续的行,用 || 指定不连续的行。&&表示”且“。
  • 内建变量,不能用双引号括起来,不然系统会把它当成字符串。

示例

image.png

image.png

image.png

awk常见的内置变量(可直接使用)

内置变量 含义 $0 当前处理的行的整行内容 $n 当前处理行的第n个字段(第n列) NR 当前处理的行的行号(序数) NF 当前处理的行的字段个数。$NF代表最后一个字段 FS 列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同 OFS 输出内容的列分隔符 FILENAME 被处理的文件名 RS 行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录, 而awk一次仅读入一条记录进行处理。预设值是"\n"

四、按行输出内容

1. $0表示当前行的整行内容

1)输出所有内容的两种方式

image.png

2)打印行号和整行内容

image.png

2. 使用NR指定行号

NR表示当前处理的行的行号(序数)。

1)打印1到3行。逗号表示连续的行内容。&&表示”且“。

image.png

2)注意符号"||"(表示“或“)

image.png

3)打印奇数行;打印偶数行。(将行号除以2取余数,余1是奇数行,余0是偶数行)

image.png

3. $n表示当前处理行的第n个字段

示例:获取网卡中的IP地址

image.png

4.通过文本模式(匹配字符串)过滤出行

1)输出包含root的行。

image.png

2)输出以root开头的行;输出以bash结尾的行。

image.png

五、按字段(列)输出内容

指定列分隔符的两种方式:使用-F 或 使用内建变量FS。

1.使用 -F 指定分隔符

image.png

image.png

2)将内建变量 FS 重新赋值

内建变量FS表示列分隔符,默认为空格或制表位。重新赋值可重新指定分隔符。

image.png

3.(!取反)打印UID大于800的用户、打印UID小于等于800的用户

要求打印用户名和UID, ! 表示取反,不大于500,即小于等于500。

image.png

4.使用 if 语句

使用if语句时,内部条件要加( ),外面要加{ }。

将{ }整条语句当作一个操作命令,相当于嵌套。

示例:打印UID大于800的用户

image.png

5.使用 for 语句

示例:求1到100的总和

image.png

六、通过管道处理其他命令的结果

1.统计行数

方法一:使用内置变量NR,打印最后一行行号

处理完文本后,打印行号,这个行号就是最后一行的行号,也就是行数。(这种方式只适用于输出所有行的情况,即只能统计全文本有多少行)

image.png

方法二:使用"wc -l" 统计行数

image.png

2.统计内存使用率

  • free命令可以查看内存使用情况。

  • 使用率=使用的内存数量/总内存数量。

  • int表示取整数。

image.png

3.过滤出CPU的空闲率

top命令可以查看CPU的使用情况。

top -b -n 1 只会输出一次top的结果 不会进行刷新 。

image.png

image.png

七、指定输出时的列分隔符

FS 输入时的列分隔符。

OFS 输出内容的列分隔符。($1=$1用于激活,否则不生效)

image.png

八、使用awk去重(awk数组特性)

在awk中可以定义数组,数组元素的下标值可以是字符串(要加双引号),元素值如果是字符串也要加引号。

1.定义数组

image.png

2.打印数组内的所有元素值及对应下标值

image.png

3.打印出文件中重复的行,以及重复次数

image.png