在写一些bash小脚本的时候,常用的命令有sed和awk等,写一篇记录文章如下:
命令简介:
Sed命令是利用脚本来处理文本文件。sed可依照脚本的指令来处理,编辑文本文件,sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。而对文件的操作无非就是“增删改查”,如何使用好sed命令是写自动化脚本的必须基础之一
sed遵循的简单的工作流:
1.读取(从输出中读取某一行)
2.执行(在某一行执行sed命令)
3.显示(把结果显示在输出中)
默认是显示修改后的内容,不会修改原文件,除非使用 -i 参数
常用参数及命令
sed [-efni] 'command' test.txt (尽量按照标准格式使用单引号)
以下为列出部分命令和动作:
sed |
| 处理文本文件,并输出到标准输出(控制台) |
| command |
|
| -e | 可以指定多个命令 |
| a | 新增 |
| -f | 指定命令文件 |
| c | 替换 |
| -n | 取消默认控制台输出,与p一起使用可打印指定内容 |
| d | 删除 |
| -i | 输出到原文件,静默执行(修改原文件的意思) |
| i | 插入 |
|
|
|
| p | 打印,要和-n参数一起使用 |
|
|
|
| s | 替换(匹配局部替换) |
动作:
新增 a
sed '1a testContent' test.txt | 在第1行后面新增一行内容,不指定数字,为每一行的后面都新增一行指定内容 |
sed '1,3a testContent' test.txt | 在原文的第 1~3 行后面各新增一行内容 |
替换 c
sed '2c testContent' test.txt | 将第 2 行内容整行替换,不指定数字,则将每一行都替换成指定内容(效果同正则符号.相同) |
sed '1,3c testContent' test.txt | 将第 1~3 行内容替换成一行指定内容 |
删除 d
sed '2d' test.txt | 删除第 2 行,不指定数字,则将每一行都删除 |
sed '1,3d' test.txt | 删除第1~3行 |
插入 i
sed '2i testContent' test.txt | 在第 2 行前面插入一行内容,不指定数字,为每一行的前面都新增一行指定内容 |
sed '1,3i testContent' test.txt | 在原文的第 1~3 行前面各插入一行内容 |
打印 p
sed '2p' test.txt | 重复打印第 2 行,不指定数字,则将每一行都重复打印一遍 |
sed '1,3p' test.txt | 重复打印第1~3行 |
sed -n '2p' test.txt | 只打印第 2 行 |
sed -n '1,3p' test.txt | 只打印第 1~3 行 |
sed -n '/user/p' test.txt | 打印匹配到user的行,类似grep |
sed -n '/user/!p' test.txt | ! 反选,打印没有匹配到user的行 |
sed -n 's/old/new/gp' test | 只打印匹配替换的行 |
替换 s
sed 's/old/new/' test.txt | 匹配每一行的第一个old替换为new |
sed 's/old/new/gi' test.txt | 匹配所有old替换为new,g 代表一行多个,i 代表匹配忽略大小写 |
sed '3,9s/old/new/gi' test.txt | 匹配第 3~9 行所有old替换为new |
参数 -e
sed -e 's/系统/00/g' -e '2d' test.txt | 执行多个指令 |
参数 -f
sed -f ab.log test.txt | 多个命令写进ab.log文件里,一行一条命令,效果同-e |
部分正则表达式:
^ 在每一行的开头添加指定数据 sed 's/^/hello/g'
$ 在每一行的结尾添加指定数据 sed 's/$/over/g'
\ 转义特殊字符 sed 's/\*/\%/g'
# 当/符号和需要替换的字符冲突时可以使用 sed 's#/#hello#g'
. 匹配任意一个字符,除了换行符,但需要注意的是,在sed中不能匹配换行符,但是在awk中可以匹配换行符。类似于shell通配符中“?”,匹配任意一个字符
* 表示前边的字符有0个或多个,*表示一个字符有0个或多个,也就是能匹配任意字符,类似shell通配符中的“*”,可以匹配任意字符
以下为优秀的详细介绍该命令的文章: