三剑客 sed(补充cut,uniq,sort,tr,wc)

sed

文本处理三剑客之一:sed

sed工作原理

sed即Stream Editor,和vi不同,sed是行编辑工具(流编辑器)
image

sed是从文件或管道中读取一行,处理一行,输出一行;再读一行,处理,输入,一直到文件结束。处理时,把当前处理的行存储在临时 缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的 内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。 如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清 空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重 定向存储输出。一次处理一行的设计模式使sed性能很高,在读取大文件时不会有出现卡顿现象。 vi打开文件时会直接把文件加载到内存中,如果文件大时出现卡顿现象。

功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

参考: http://www.gnu.org/software/sed/manual/sed.html

sed基本用法

sed  [option]... 'scripts'.... filename
#常用选项
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i 修改原文件
-i.bak 备份文件并原处编辑

script

地址格式
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行

编辑命令

p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
! 模式空间中匹配行取反处理
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号

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

示例

#打印全部行
sed 'p' /etc/passwd
sed '' /etc/passwd
#关闭打印全部行
sed -n '' /etc/passwd
#打印指定的行数,如只打印第10行
sed -n '10p' /etc/passwd
#打印非#号开始的行
sed -n '/^#/!p'  /etc/passwd 
#sed -n '^[^#]p' /etc/passwd #【^#为取反,非#号的】
#打印以root开头的行
sed -n '/^root/p' /etc/passwd
#除了第20行都输出 
sed  -n  '20!p'  mypasswd 
#以bash结尾
sed  -n  '/bash$/p'  passwd 		
#指定范围
#打印第2行到10行
sed -n '2,10p' /etc/passwd
#打印从第2行开始,随后的四行
sed -n '2,+4p' /etc/passwd
#打印/pat1/,/pat2/之间的行
sed -n '/^root/,/^apache/p' /etc/passwd #打印以root开头到,以apache开头中间的行
#步进
[root@hans ~]# seq 10 |sed -n '1~2p'
1
3
5
7
9
[root@hans ~]# seq 10 |sed -n '2~2p'
2
4
6
8
10
#从20行到最后一行输出
sed  -n  '20,$p'  mypasswd 	
	
	

#忽略大小写打印
sed -n '/ROOT/Ip' /etc/passwd
#在指定行追加
seq 10|sed '1a AAA'
seq 10|sed '3,5a AAA'
seq 10|sed '3a\ AAA'
seq 10|sed '3a\ AAA\n 123'
#在指定行前面加入
seq 10|sed '1i BBB'
#替换一行或多行
seq 10|sed '3c\ABC' #把第三行替换成ABC
#同时修改多行
[root@hans ~]# seq 10|sed -e '1a 123' -e '3c 456'  #在第一行后面追加123,把第3行替换为456
1
123
2
456
4
#把匹配到的内容另存为
sed -n '/^root/w /tmp/root.txt' /etc/passwd
#打印匹配到行所在的行号
sed '/root/=' /etc/passwd
#修改文件
sed -i.bak '/root/d' /etc/passwd #先把原文件备份,然后把包含root的行全部删除
不备份直接用-i
#搜索替换
sed 's/root/ROOT/g' /etc/passwd
sed -E '/^SELINUX=/ s/^(SELINUX=).*/\1enforcing/g' /etc/selinux/config 
sed  -n  's/root/ABC&XYZ/p'  /etc/passwd    	#中间的&叫做反向引用    &代表root
#利用sed取IP
sed  -rn '2s/[^0-9]+([0-9.]+).*/.\1/p'
#利用sed在开头加上#号
sed '/^#/!s/^/#/' /etc/fstab
#利用sed在结尾加上#号
sed '/^#/!s/$/#/' /etc/fstab
#利用sed在指定位置加上#号
sed  -E '/defaults/ s/(defaults)/#\1/' /etc/fstab
#sed里面使用变量
Name=laowang; sed -E "/defaults/ s//$Name/g" /etc/fstab
Name=laowang; sed "/defaults/ s/defaults/$Name/g" /etc/fstab 

高级编辑命令

sed中除模式空间,还支持另外一个空间,保持空间(Hold space),利用此空间可以将模式空间中的数据临时保存至保持空间,从而后续接着处理.

模式空间 保持空间
image

P: 打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,
并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间
不包含换行符,则会像发出d命令那样启动正常的新循环

示例

#取偶数行
seq 10 |sed -n 'n;P'
#倒序
seq 10 |sed '1!G;h;$!d'
sed 'N;D'
sed '3h;9G;9!d'
sed '$!N;$!D'
sed '$!d'
sed 'G'
sed 'g'
sed '/^$/d;G'
sed 'n;d'
sed -n '1!G;h;$p'

cut命令可以提取文本文件或stdin数据的指定列

-d 指明分隔符,默认tab

-f fileds:

/: 第#个字段,如3

/,/[,/]:离散的多个字段,如1,3,5

/-/: 连续的多个字段,如1-5

混合使用: 1-3,7

-c 按字符切割

--output-delimiter=string指定输出分隔符

sort 文本排序

对文本进行排序显示在STDOUT上,不改变原文件

-r 逆序

-R 随机排序

-n 按数字大小整理

-f 忽略大小写

-u 删除重复行

-t c 选项使用c做为字段界定符(指定分隔符)

-k #选项按照使用c字符分隔的#列来整理能够使用多次 (指定第几列)

uniq 去重(删除前后相邻重复的行)

-c 显示每行重复出现的次数

-d 仅显示重复的过

-u 仅显示不曾复的行

uniq 经常和sort结合使用

tr命令

tr命令可以对来自标准输入的字符进行替换、压缩和删除

-c或——complerment:取代所有不属于第一字符集的字符;

-d或——delete:删除所有属于第一字符集的字符;

-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;

-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
转换

root@hans ~]# tr '123' 'abc'

1923781

a9bc78a

[root@hans ~]# tr '123' 'abcd'

123456

abc456

[root@hans ~]# tr '1234' 'abc'

123456

abcc56 四没有对应的,拿最后一个字母补

[root@hans ~]# tr -t '1234' 'abc'

123456

abc456

[root@hans ~]# tr 'a-z' 'A-Z'

sadfadfalk

SADFADFALK

[root@hans ~]# tr '[:lower:]' '[:upper:]'

sadfda

SADFDA

删除

[root@hans ~]# tr -d abc

1a2b3c

123

压缩(即去重)

[root@hans ~]# tr -s abc

aabbccdd

abcdd

aabbccaa

abca

[root@hans ~]# tr -dc abc # 以外的全部删除

asf

bafd

ckjjf

ctrl + d 输出:

abac

posted @ 2021-12-21 22:17  hai起奈  阅读(75)  评论(0编辑  收藏  举报