Linux常用命令--sed
摘要
-
sed命令使用说明
-
本文基于
CentOS8(x86_64)
sed
-
sed
是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 -
sed
主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 -
语法
1 | 格式:sed [options] 'command' file(s) |
-
参数
1 | 功能参数 解释 |
1)删除:d命令
1 | # 删除example文件的第二行 |
2)替换:s命令
1 | # 替换第几处模式匹配的地方,这里2表示替换第二处匹配的地方 |
3)选定行的范围:逗号
1 | # 所有在模板test和check所确定的范围内的行都被打印 |
4)多点编辑:e命令
1 | # (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果 |
5)追加行或替换行:a、i、c和r
-
a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行
1 | # 将hello wordl 插入到第二行上面 |
-
c 命令表示将指定行中的所有内容,替换成该选项后面的字符串
1 | # 将匹配到的所有含有hello的行替换为hello world |
-
r 命令用于将一个独立文件的数据插入到当前数据流的指定位置
1 | # 将text.txt中的内容插入到example文件的第二行下面 |
6)处理单个字符:y
1 | # 将所有以hello开头的行中的 a替换为A,b替换为B,c替换为C,d替换为D |
7)指定行区间
-
默认情况下,sed 命令会作用于文本数据的所有行,如果只想将命令作用于特定行或某些行,需要明确指定行区间范围。
-
行区间可以通过如下两种方式进行限定:
1.以数字形式指定行区间
2.用文本模式指定具体行区间 -
行区间放在命令的前面,具体格式如下:
1 | [行区间]脚本命令 |
-
示例:以数字形式指定行区间
1 | # 替换第二行中的内容 |
-
示例:用文本模式指定具体行区间
1 | # 替换内容中包含pig的所有行的内容 |
小贴士
- 一、分隔符
在sed命令中,/
字符被用作分隔符,用于分隔sed命令中的参数。这个分隔符是可以被其他符号替换的。
比如,以下三个命令的效果是一样的:
1 | sed 's/test/mytest/2' file # 用 / 做分隔符 |
- 二、引用变量
有些时候,我们需要在sed命令中引用变量,比如:
1 | app_res_data="123/456" |
-
三、显示行号
1 | # 这种方式会给每一行的上一行增加一行,显示行号 |
1 | $ cat a.txt |
实战示例
-
统计Nginx日志全天总的请求数(访问量)
1 | # 常规的实现方式可以使用cat或wc -l命令 |
-
统计Nginx日志全天09:00-11:00之间总的请求数(访问量)
1 | # 范围查询,注意转义 |
-
统计Nginx日志全天09:00-11:00之间总的请求数(访问量),并将请求的IP地址打印出来
1 | sed -n '/30\/Nov\/2023:09:00/,/30\/Nov\/2023:11:00/p' access_20231130.log | awk '{print $1}' |
-
统计Nginx日志全天09:00-11:00之间总的请求数(访问量),并将请求的IP地址访问排前20名打印出来
1 | sed -n '/30\/Nov\/2023:09:00/,/30\/Nov\/2023:11:00/p' access_20231130.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20 |
-
统计Nginx日志全天09:00-11:00之间总的请求数(访问量),并将请求的IP地址访问次数超过9000次加入Linux黑名单
1 | # 将IP地址访问次数超过9000打印出来 |