点击上方【蓝字】关注博主
“ 在 Linux 系统中,文本处理是不可或缺的一部分。面对庞大的文本文件,如何高效地进行操作成为了一个关键问题。而 sed 命令正是解决这一问题的利器。它凭借简洁的语法、强大的功能和灵活的应用场景,成为 Linux 系统中不可或缺的文本处理工具。本文将带你深入了解 sed 命令,从基础语法到进阶技巧,并通过实际案例展示其在文本处理、数据分析、系统管理等方面的应用,让你掌握 sed 命令的精髓,成为 Linux 文本处理的高手!”
前导
本系列主要讲解Linux运行时命令,包括网络、磁盘、内存、CPU相关参数等,主要是为了分享怎么通过常见的 Linux 命令去排查相关问题。比如:
发现机器的CPU负荷比较高,那么怎么查到是哪个进程CPU占用率比较高?
磁盘IO的写入很频繁,怎么查到是哪个进程或线程对磁盘IO频繁的操作?
本系列就是分享诸如这类问题的排查技巧。注意,本系列的核心方向不是去讲解Linux的命令查找、显示当前目录等(比如ls、cat等)基础命令操作。本系列的重点分享内容包括:
Linux基础命令和工具。
CPU性能监控。
内存性能监控。
文件IO性能监控。
网络IO性能监控。
强烈推荐:Linux 大牛,Netflix 高级性能架构师 Brendan Gregg的博客http://www.brendangregg.com。《性能之巅》书籍就是他出版的,主要分为:CPU、内存、磁盘、网络四大块。
sed 命令基础
sed [选项] '命令' [输入文件]
[选项]: 一些可选的选项,用于控制 sed 命令的行为。
‘命令’: 要执行的命令,用单引号包裹。
[输入文件]: 要处理的输入文件。如果没有指定输入文件,则默认从标准输入读取数据。
选项 | 描述 | 示例 |
---|---|---|
-n | 静默模式,只输出被修改的行 | sed -n 's/hello/world/g' file.txt |
-e | 多个命令,用 -e 分隔 | sed -e 's/hello/world/g' -e '/^$/d' file.txt |
-i | 直接修改原文件,慎用! | sed -i 's/hello/world/g' file.txt |
-r | 使用扩展正则表达式 | sed -r 's/[0-9]+/&00/g' file.txt |
命令 | 描述 | 示例 |
---|---|---|
a\ | 在匹配行之后追加文本 | sed '/hello/a\This is a new line' file.txt |
c\ | 用新文本替换匹配行 | sed '/hello/c\This is a new line' file.txt |
d | 删除匹配行 | sed '/hello/d' file.txt |
i\ | 在匹配行之前插入文本 | sed '/hello/i\This is a new line' file.txt |
p | 打印匹配行 | sed -n '/hello/p' file.txt |
s/旧文本/新文本/g | 替换匹配文本 | sed 's/hello/world/g' file.txt |
替换文件中的所有 “hello” 为 “world”:
sed 's/hello/world/g' file.txt
删除文件中的所有空行:
sed '/^$/d' file.txt
在文件中的每行开头添加 “prefix-”:
sed 's/^/prefix-/g' file.txt
在文件中的每行结尾添加 “suffix”:
sed '$a\suffix' file.txt
将文件中的第一行替换为 “new line”:
sed '1c\
ew line' file.txt
sed 命令通常是按行处理的,它会逐行读取输入文件,并对每一行进行处理。
sed 命令的修改操作不会改变原始文件,除非使用
-i
选项。sed 命令的命令和正则表达式都需要用单引号包裹,防止 shell 解释特殊字符。
sed 命令进阶
符号 | 描述 | 示例 |
---|---|---|
字符匹配 | ||
. | 匹配任意单个字符 | a.c 匹配 “abc”、“a1c” 等 |
* | 匹配前一个字符零次或多次 | ab*c 匹配 “ac”、“abc”、“abbc” 等 |
+ | 匹配前一个字符一次或多次 | ab+c 匹配 “abc”、“abbc” 等,不匹配 “ac” |
? | 匹配前一个字符零次或一次 | ab?c 匹配 “ac”、“abc” 等 |
[] | 匹配方括号内任意一个字符 | [abc] 匹配 “a”、“b” 或 “c” |
[^...] | 匹配除方括号内字符以外的任意一个字符 | [^abc] 匹配除 “a”、“b” 或 “c” 之外的任意字符 |
\ | 转义特殊字符 | \. 匹配点号 |
位置匹配 | ||
^ | 匹配行首 | ^abc 匹配以 “abc” 开头的行 |
$ | 匹配行尾 | abc$ 匹配以 “abc” 结尾的行 |
\b | 匹配单词边界 | \bapple\b 匹配独立的单词 “apple” |
分组匹配 | ||
(...) | 将匹配的文本分组 | (ab)c 将 “ab” 分组,可以通过 \1 引用 |
其他 | ||
| | 或运算符 | a|b 匹配 “a” 或 “b” |
示例: 将所有以 “http://” 开头的 URL 替换为 “https://”:
sed 's/http:\/\//https:\/\//g' file.txt
示例: 将所有数字替换为 “number”:
sed 's/[0-9]+/number/g' file.txt
示例: 将所有以 “Mr.” 开头的姓名替换为 “Mrs.”:
sed 's/Mr\. \(.*\)/Mrs. \1/g' file.txt
\(...\) 分组匹配姓名。
\1 引用第一个分组匹配的文本,即姓名。
示例: 匹配所有包含 “apple” 或 “banana” 的行:
sed -r '/apple|banana/p' file.txt
示例: 匹配所有以数字开头,以数字结尾的行:
sed -r '/^[0-9]+.*[0-9]+$/p' file.txt
将文件 test.txt 中第 3 行到第 5 行的所有 “apple” 替换为 “banana”:
sed '3,5s/apple/banana/g' test.txt
将文件 test.txt 中所有以 “http://” 开头的行替换为以 “https://” 开头的行:
sed '/^http:\/\//s/http:\/\//https:\/\//g' test.txt
将文件 test.txt 中除了第 1 行以外的所有行打印到屏幕:
sed -n '1!p' test.txt
sed 命令的应用
sed '$!N; /^\(.*\)\
\1$/!P; D' data.txt > data_unique.txt
$!N
: 除了最后一行,读取下一行并追加到模式空间。^\(.*\)\ \1$
: 匹配重复行,即第一行和第二行内容相同。!P
: 如果不匹配重复行,则打印模式空间第一行。D
: 删除模式空间第一行,继续循环处理。
sed '/^ERROR:/p' log.txt
sed 's/ /,/g' data.txt
sed -n '/apple/p' text.txt | wc -l
实用技巧
5.1、简单模式
范围的选择还可以使用正则匹配。例如:
# 选择出现void字样的行,以及后面的三行。
/void/,+3
# 选择以void开头的行,和出现mem字样行之间的数据。
2\^void/,/mem/
sed -n '5p' sed1.cpp
sed -n '2,5 p' sed1.cpp
sed -n '1~2 p' sed1.cpp
sed -n '2~2 p' sed1.cpp
sed -n '2,+3p' sed1.cpp
sed -n '2,$ p' sed1.cpp
sed -n '/void/,+3 p' sed1.cpp
sed -n '/^void/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
sed -n '/^BroadcastPdu/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
sed -n '/^void CImUserManager::BroadcastPdu/,/CLIENT_TYPE_FLAG_BOTH/p' sed1.cpp
cat file
sed -n 'p' file
p
对匹配内容进行打印。d
对匹配内容进行删除。这个时候就要去掉-n
参数了,想想为什么?w
将匹配内容写入到其他地方。
sed -n '2,5 p' sed2.cpp
sed '2,5 d' sed2.cpp
sed -n '2,5 w output.txt' sed2.cpp
5.2、替换模式
sed -n '/void/,+3 s/void/int/g' sed2.cpp
sed '/^void/,/CLIENT_TYPE_FLAG_BOTH/s/ImUser/User/g' sed2.cpp
sed 's/a/b/g' file
sed 's/[a,b,c]/<&>/g' file
sed 's/.*/"&"/' file
g
默认只匹配行中第一次出现的内容,加上g
,就可以全文替换了。常用。p
:当使用了-n
参数,p
将仅输出匹配行内容。w
和上面的w
模式类似,但是它仅仅输出有变换的行。i
这个参数比较重要,表示忽略大小写。e
表示将输出的每一行,执行一个命令。不建议使用,可以使用xargs
配合完成这种功能。
看两个命令的语法:
sed -n 's/a/b/gipw output.txt' file
sed 's/^/ls -la/e' file
更进一步学习:推荐https://github.com/Black-Gold/Learn/blob/1ee76ca2a9bbbbfe04850a1ccc9b9658e1eb39de/Linux_man_cn/sed.md。
总结
公众号: Lion 莱恩呀
微信号: 关注获取
扫码关注 了解更多内容
点个 在看 你最好看