linux sed和awk学习
sed
参考链接:
https://cloud.tencent.com/developer/article/1160822
https://www.runoob.com/linux/linux-comm-sed.html
简介
sed 是流式编辑器,可以一行一行地处理文件,不需要一次性将整个文件加载到内存。因此可以高效地处理大文件,不会受文件大小的限制。
语法:
sed [-hnV][-e<script>][-f<script文件>][文本文件]
- -e后面跟具体的脚本,默认是有e的,所以可以不写
- -f后面跟脚本文件
- -h为帮助信息
- -n为仅显示脚本处理后的结果
- -V显示版本信息
sed脚本的动作包括:
- a :插入, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行),这和vim中的a和i类似。
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!
- d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
- p :打印,将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
p配合-n的说明:
sed -n '3p' line.txt # 打印第三行
sed '3p' line.txt # 打印所有行,第三行打印两次。
替换
替换s的脚本的形式:
"[address1[,address2]]s/pattern/replacement/[flags]"
address 就是来指定行范围,pattern为正则表达式,flags 替换时的功能选项。
正则表达式参考:正则表达式
address 就是来指定行范围:
sed -n '3p' line.txt # 打印第三行
sed '3p' line.txt # 打印所有行,第三行打印两次。
sed -n '$p' line.txt # 打印最后一行
sed -n '6,$p' line.txt # 打印从第六行到最后一行
sed -n '3,+2p' line.txt # 打印第三行及下面2行,即打印第三、四、五行
sed -n '1~2 p' line.txt # 从第1行开始,每个两行打印一次,即打印奇数行
sed -n '/2/p' line.txt # /2/为正则表达式,即打印包含字符2的行
sed -n '/2/,3p' line.txt # 打印包含字符2的行,以及此行到第三行内的所有行。如果含字符2的行的行号小于等于三,那么只输出含字符2的行。
sed -n '/2/,+3p' line.txt # 打印包含字符2的行,以及此行下的额外三行。
sed -n '/2/,/5/p' line.txt # 打印包含字符2的行,包含字符5的行,以及这两行之间的所有行。
sed -n '/Line/!p' # 打印不包含“line”的行
flag:
- g 表示改行出现的所有匹配内容都进行替换。如果不指定 flag 将默认只对改行匹配到的第一个做更改。
- n,表示只更改该行匹配到的第n个
- p 只输出匹配到的行,再行寻址里面已经用过
- w 存储改变的行到文件,比如sed -n 's/i/I/w junk.txt' books.txt
- i 匹配时忽略大小写
其他脚本动作
插入 i或a:
[address1[,address2]]i text
[address1[,address2]]a text
实例:
sed '/fish/,+3i ------------!' sed.txt # 匹配到 fish 字符的行以及此行的后面三行,这些行的前面都增加一行"------------!"
删除 d:删除指定行
[address1[,address2]]d
行替换 c:将指定的一行或多行替换成对应字串
[address1[,address2]]c Replace text
文件写入命令 w:将指定行输出到文件中,文件不存在的时候它会自动创建,如果已经存在的话则会覆盖原文件的内容。
[address1[,address2]]w file
q的作用:处理完第一次匹配的就推出
nl testfile | sed -n '/oo/{s/oo/kk/;p;q}' #
sed的多行处理功能
加载下一行处理 N:每次加载两行,将两行当成一行处理。
实例:
sed 'N; s/i/I/1' sed.txt # 两行合成一行进行处理,所以只会替换两行中第一个出现i的字符。1 表示只替换第一个匹配到的小写 i, 而不是替换所有的小写 i 。
sed 'N; s/\n/,/g' sed.txt # 将两行中间的回车替换成`,`,从而实现合并两行的目的。
P命令用于输出N命令创建的多行文本的模式空间中的第一行,也就是说读进来两行,仅输出第一行。
sed -n 'N; P' sed.txt
常用实例
# c++删除注释
sed 's|//.*||g' hello.cpp # 将// 后面的所有字符替换为空格
# | 被用作分隔符,替代了常见的 / 分隔符。这在你的正则表达式中包含 / 字符时很有用,因为它可以避免歧义。
# 移除空行
sed '/^$/d'
# 过滤所有的html标签,并移除空行
sed 's/<[^>]*>//g ; /^$/d' html.txt
其他
增加空行
sed -e '4 a \n' testfile # 是添加了一个字母n
sed -e '4 a \newline\nnewline2\n' testfile # 4 行之后追加 3 行(2 行文字(newline和newline2)和 1 行空行)
sed '4 a \\' testfile 添加一个空行,第一个\代表sed中的分隔符,代表下面的内容为添加的字符串;第二\代表转义符,但是后面没有跟任何内容。
sed '4 a \\n' testfile