• 欢迎访问显哥博客,本网站纯属学习技术,绝无商业用途,欢迎小伙伴们共同学习!研究技术!QQ:52249909 加我QQ
  • 世界75亿人,这么小的概率,能认识你,是我一生的幸运,不妨加个QQ接触一下:52249909 加我QQ

字符处理命令及三剑客之sed命令【显哥出品,必为精品】

运维基础 lixian 5年前 (2019-12-04) 955次浏览 1个评论 扫描二维码
文章目录[隐藏]

一、sort 命令

#排序,默认是以空白字符为分隔符,以字母或者数字的顺序进行排序
选项:
-t #指定分隔符
-k #指定以第几列进行排序,后面跟数字
-n #以数值大小进行排序
-r #倒叙排序

格式: sort 文件名
sort -t “:” -nrk3 passwd # k和3不能分开

[root@lixian ~]# sort -t ":" -k3 passwd           # 第三列 以第一个字符大小排列
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

如果想让数字大小排序就要加 -n : sort -t “:” -nk3 passwd
倒叙是-r: 注意:k和3不能分离

[root@lixian ~]# sort -t ":" -rk3 passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

将重复的行排列在一起:默认是首字母大小排序

[root@lixian ~]# sort test.txt 
aaa/5654
abc/23
abc/34
abc/678
cbd/45
cbd/456
dwd/35

二、uniq 命令

#去重(必须是相邻的相同的行)
还可以进行统计行的次数
-c #统计重复行的次数
-u #只显示不重复
-d #只显示重复的
大部分需要搭配sort命令使用uniq
统计出现重复的行,然后再使用sort -rn 倒叙查看次数最多的一行

[root@lixian ~]# sort test.txt 
aaa/5654
abc/23
abc/23
abc/23
cbd/45
cbd/45
dwd/35
[root@lixian ~]# sort test.txt |uniq -c
      1 aaa/5654
      3 abc/23
      2 cbd/45
      1 dwd/35
[root@lixian ~]# sort test.txt |uniq -c | sort -nr
      3 abc/23
      2 cbd/45
      1 dwd/35
      1 aaa/5654

三、cut 命令

#取列,截取字段
选项:
-d #指定分隔符,默认是以tab键为分隔符
-f #取出指定的列,多个用逗号分隔或者- 连续多列
-c #截取指定的字符,多个用逗号分隔或者- 连续多列
以 “ / ” 为分隔符 取第一列

[root@lixian ~]# cut -d "/" -f1 test.txt 
abc
cbd
abc
aaa
abc
cbd
dwd
[root@lixian ~]# 

cut可以和cort、uniq搭配使用,查找某一列的重复的次数,然后次数最多的放在第一列。

[root@lixian ~]# cut -d "/" -f1 test.txt |sort 
aaa
abc
abc
abc
cbd
cbd
dwd
[root@lixian ~]# cut -d "/" -f1 test.txt |sort |uniq -c
      1 aaa
      3 abc
      2 cbd
      1 dwd
[root@lixian ~]# cut -d "/" -f1 test.txt |sort |uniq -c|sort -rn
      3 abc
      2 cbd
      1 dwd
      1 aaa

cut也可以取字符—–第几列和第几列用 逗号隔开,连续的用 – 分隔

[root@lixian ~]# cat test.txt 
abc/23
cbd/45
abc/23
aaa/5654
abc/23
cbd/45
dwd/35
[root@lixian ~]# cut -c 3,5 test.txt 
c2
d4
c2
a5
c2
d4
d3
[root@lixian ~]# cut -c 3-5 test.txt 
c/2
d/4
c/2
a/5
c/2
d/4
d/3

四、tr 命令

#替换、删除字符的命令,(只能单对单的替换,删除)
替换某一列字符 tr ” ” ” ” ,一般需要先取行
单独使用tr 必须用 < 输入文件

[root@lixian ~]# cat test.txt 
abc/23
cbd/45
abc/23
aaa/5654
abc/23
cbd/45
dwd/35
[root@lixian ~]# cat test.txt |tr "/" "0"
abc023
cbd045
abc023
aaa05654
abc023
cbd045
dwd035

tr -d 删除单个字符 但必须用 < 输入文件

[root@lixian ~]# tr -d "/" <test.txt 
abc23
cbd45
abc23
aaa5654
abc23
cbd45
dwd35

5、wc 命令

#统计 字节大小,行数,列数 字符的长度
选项:
-l #统计行数
-c #统计总字节大小
-w #统计总列数,默认以空白字符为分隔符
-L #统计最长的一行内容的长度
<输入重定向 指定输入设备

[root@lixian ~]# ls -l
total 4
-rw-r–r–. 1 root root 51 Dec  4 13:37 test.txt
[root@lixian ~]# wc -l <test.txt 
7
[root@lixian ~]# wc -w <test.txt 
7
[root@lixian ~]# wc -c <test.txt 
51
[root@lixian ~]# wc -L <test.txt 
8

扩展 变量:
指定一个变量名称 a 的值 = 99
$a 就是一个变量
echo $a 输出这个变量 就是输出这个变量定义的值 也就是99

六、sed 增删改查命令

#三剑客第二 擅长取行 、增删改查
选项:
-n #取消默认输出
-i #真正的替换
-r #支持扩展正则
+:至少一次
?:0次或者1次
{m,n}:至少m次,最多n次
():分组 \1\2\3…..
| :或者
内部命令:
p #打印
d #删除
s #替换
g #全局
a #追加
i #插入
; #多条命令的分隔
, #表示连续的命令

查:

p #打印
查行 多少行到多少行 用法 sed -n ‘行数p’ 文件名

[root@lixian ~]# sed -n '4,5p' test.txt 
aaa/5654
abc/23

查字符串 grep会的sed都会,grep不会的sed也会
也支持正则表达式
比如 /^abc/以什么开头 /3$/以什么什么结尾 | 是或者的意思(扩展正则)
多个字符串过滤行用;分号表示 过滤行到行的用,’/abc/,/edf/p’

[root@lixian ~]#sed  -n '/abc/p' test.txt 
abc/23
abc/23
abc/23

删:

删除行

[root@lixian ~]# sed '4,6d' test.txt
abc/23
cbd/45
abc/23
dwd/35

单个字符串所在的行删除

[root@lixian ~]# sed '/abc/d' test.txt 
cbd/45
aaa/5654
cbd/45
dwd/35

多个字符串删除

[root@lixian ~]# sed '/abc/d;/dwd/d' test.txt 
cbd/45
aaa/5654
cbd/45

增:

在文件里面插入一行内容
a #追加
i #插入
行数加上a是在行数的后面追加一行
行数加上 i是在行数的前面插入一行
$a是在最后一行后面追加 $i是在最后一行前面插入
在文件里面插入一行内容
a #追加
i #插入
行数加上a是在行数的后面追加一行
行数加上 i是在行数的前面插入一行
$a是在最后一行后面追加 $i是在最后一行前面插入

[root@lixian ~]# sed '2adwad/////' test.txt 
abc/23
cbd/45
dwad/////
[root@lixian ~]# sed '2idwad000000' test.txt 
abc/23
dwad000000
cbd/45

改:

替换内容
-i 生效
s #替换
g #全局
格式: sed ‘s#旧的#新的#gp’ 文件名
全局替换:

[root@lixian ~]# sed 's#abc#99999#g' test.txt 
99999/23
cbd/45
99999/23

局部替换:

[root@lixian ~]# sed 's#abc#999#' 123.txt 
999,abc,abc
999,abc,abc
cde,cde,,999,edc
cde,cde,,999,edc
aaa.999.aw.abc

针队行的替换:

[root@lixian ~]# sed '3s#abc#999#g' 123.txt 
abc,abc,abc
cde,cde,,abc,edc
aaa.999.aw.999

针对多行的替换:
[root@lixian ~]# sed ‘2,4s#abc#888#g’ 123.txt
abc,abc,abc
cde,cde,,888,edc
aaa.888.aw.888
也支持 $最后一行、^以什么什么开头、$以什么什么结尾

[root@lixian ~]# sed '/^a/s#abc#888#g' 123.txt 
888,888,888
cde,cde,,abc,edc
aaa.888.aw.888
[root@lixian ~]# 

本站博主 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:字符处理命令及三剑客之sed命令【显哥出品,必为精品】
喜欢 (32)

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽
  1. Do you mind if I quote a couple of your articles as long asI provide credit and sources back to your website?My blog site is in the very same niche as yours and my users would certainly benefit from some of the information you present here.Please let me know if this okay with you. Thanks!