飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

Linux 三剑客之sed

时间:2021-12-22  作者:48xz  
Linux 三剑客之sed Linux 三剑客之sed 及其 sort命令,uniq命令、cut命令、tr命令、wc命令,“草鸡”详细,看完不会包会!

目录
  • Linux 三剑客之sed
    • 命令补充:
      • sort命令
      • uniq命令
      • cut命令
      • tr命令
      • wc命令
    • 三剑客 - sed
      • 编辑模式:
      • 定位分类:
      • 实例如下:
        • d模式——删除模式
        • p模式——打印
        • a模式,在当前行后添加一行或多行
        • i模式,在指定行前一行插入
        • c模式,替换当前行
        • r模式,在文件中读内容
        • w模式,将指定行写入文件
        • y模式,将字符替换成另外一个
        • s模式,字符串转换
        • g模式,全部执行
        • i模式,忽略大小写
        • &的使用
      • 练习:

Linux 三剑客之sed

image

命令补充:

sort命令

对文本文件的内容,以行为单位来排序,比较原则是从一行的首个字符依次向后,按照字符对应的ASCII码值进行比较,默认升序

  • 格式:sort [参数] [-o 输出文件]

  • 参数:

    • -b: 不包括开头的空白字符,从第一个可见字符比较
    • -n:按照数值的大小排序
    • -r:以相反的顺序来排序
    • -k:以某列进行排序
    • -t<分隔字符> : 指定排序时所用的栏位分隔字符
    • -o<输出文件> : 将排序后的结果存入指定的文件
    • -k: 选择以哪个列进行排序
    • -f: 排序时,忽略大小写字母
    • -u:排序过程中去除重复的行
  • 实例如下:

# 常用参数演示,文件内容自己编写

# 排序
[root@localhost ~]# cat 域名 
aa
ab
ac
ad
[root@localhost ~]# sort 域名 
aa
ab
ac
ad

# -n按照数值大小排序
[root@localhost ~]# sort -n 域名 
1aa
22ab
32ac
42ad

# -r 以相反的顺序来排序,降序输出
[root@localhost ~]# sort -r 域名 
aaa
4ad
32ac
22ab
1aa
1

# 按第一列排序
[root@localhost ~]# sort -k1 域名  
1
1aa
22ab
32ac
4ad
aaa

# -t:指定分割符,默认是以空格为分隔符
# 注:分隔符排序前有空格行
[root@localhost ~]# cat 域名
|1|2|3|5|6|2|1|3|7|8
|3|4|4|5|4|6|7|8|9|8
|2|3|4|5|4|6|5|7
|3|4|6|8|9|0|7|0|7
|3|2|4|2|4|2|4|2|3|4
[root@localhost ~]# sort -n -r -k2 -t \'|\' 域名 
|3|4|6|8|9|0|7|0|7
|3|4|4|5|4|6|7|8|9|8
|3|2|4|2|4|2|4|2|3|4
|2|3|4|5|4|6|5|7
|1|2|3|5|6|2|1|3|7|8

# `-u`:排序过程中去除重复的行
[root@localhost ~]# cat 域名
aaaaaa
aaaaaa
bbbbbb
bbbbbb
cccccc
cccccc
[root@localhost ~]# sort -u 域名 
aaaaaa
bbbbbb
cccccc

# -o<输出文件> :  将排序后的结果存入指定的文件
[root@localhost ~]# sort -u 域名 > 域名
[root@localhost ~]# cat 域名
aaaaaa
bbbbbb
cccccc

uniq命令

用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用

  • 格式:uniq [参数] [文件]

  • 参数:

    • -c: 在输出行前面加上每行在输入文件中出现的次数
    • -d:仅显示重复出现的行列
    • -u:仅显示不重复行列
  • 实例如下:

# 去重
[root@localhost ~]# cat 域名 
aaaaaa
aaaaaa
bbbbbb
bbbbbb
cccccc
cccccc
[root@localhost ~]# uniq 域名 
aaaaaa
bbbbbb
cccccc

# 注意,去重是相邻重复内容去重,所以先排序再去重
[root@localhost ~]# cat 域名 
123
124
123
123
123
124
124
124
125
126
[root@localhost ~]# uniq 域名 
123
124
123
124
125
126
# 这样的话就没有达到去重的效果,需要搭配sort使用
[root@localhost ~]# sort -n 域名|uniq 
123
124
125
126

# -c: 在输出行前面加上每行在输入文件中出现的次数
[root@localhost ~]# sort -n 域名|uniq -c
      4 123
      4 124
      1 125
      1 126
      
# -u:仅显示不重复行列
[root@localhost ~]# sort -n 域名|uniq -u
125
126

cut命令

cut命令用来输出每一行中的指定部分,删除(剪切)文件中指定字节,字段

  • 格式:cut [-b/c/f] [file]

  • 定位方法:

    • -b:字节
    • -c:字符
    • -f:域

    注.必须指定-b,-c,-f其中一种

  • 参数:

    • -b:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志
    • -c:以字符为单位进行分割
    • -d:自定义分隔符,默认为制表符(Tab)
    • -f :与-d一起使用,指定显示哪个区域
    • -n:取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
  • 实例如下:

    -b字节(英文数字)模式如下

    # 用当前登录用户信息举例
    [root@localhost ~]# who
    root     tty1         2021-12-21 18:47
    root     pts/0        2021-12-21 16:52 (域名.1)
    
    # -b 模式提取字节
    [root@localhost ~]# who | cut -b 3
    o
    o
    # 提取第1,2,3列的字节
    [root@localhost ~]# who | cut -b 1,2,3
    roo
    roo
    [root@localhost ~]# who | cut -b 1-3
    roo
    roo
    # cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。不能颠倒定位的顺序。
    [root@localhost ~]# who | cut -b -3,3-
    root     tty1         2021-12-21 18:47
    root     pts/0        2021-12-21 16:52 (域名.1)
    # -3表示从第一个字节到第三个字节,3-表示从第三个字节到行尾
    # 执行上述语句,第三个字节不会重叠输出
    

    -c模式字符(汉字可用)如下:

    [root@localhost ~]# cat 域名 
    路飞
    山治
    索隆
    娜美
    黑胡子
    白胡子
    # 如果用b模式就会不完全输出
    [root@localhost ~]# cut -b 2 域名 
    ·
    ±
    ´
    ¨
    »
    # 用c模式,区别就看出来了
    [root@localhost ~]# cut -c 2 域名 
    飞
    治
    隆
    美
    胡
    胡
    # -c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。
    
    # 使用-n搭配b模式使用,解决乱码
    [root@localhost ~]# cut -nb 2 域名 
    飞
    治
    隆
    美
    胡
    胡
    

    -f模式,-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策,这时候使用-f模式,在使用的时候注意设置间隔符

    # 提取用户名
    [root@localhost ~]# head -n 5 /etc/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
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@localhost ~]# head -n 5 /etc/passwd | cut -d : -f 1
    root
    bin
    daemon
    adm
    lp
    

tr命令

用一个字符来替换另一个字符,或者可以完全删除一些字符,替换等

  • 格式: tr [OPTION]... SET1 [SET2]

  • 参数:

    • -c :用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
    • -d:删除指令字符
    • -s:缩减连续重复的字符成指定的单个字符
    • -t:削减 SET1 指定范围,使之与 SET2 设定长度相等
  • 实例如下:

    # 替换
    [root@localhost ~]# cat 域名 
    +a+b+c+d
    +e+f+g
    +h+i+j+k
    +1+2+a+s+d+a+s
    +a+b+c+1+2+3
    # 将域名中的\'+\'替换成\'|\'
    [root@localhost ~]# cat 域名 | tr + \'|\'
    |a|b|c|d
    |e|f|g
    |h|i|j|k
    |1|2|a|s|d|a|s
    |a|b|c|1|2|3
    # 将域名小写字母替换成大写字母
    [root@localhost ~]# cat 域名  | tr a-z A-Z
    |A|B|C|D
    |E|F|G
    |H|I|J|K
    |1|2|A|S|D|A|S
    |A|B|C|1|2|3
    
    # 删除
    # -d 删除域名中的ab字母
    [root@localhost ~]# cat 域名  | tr -d "ab" > new_file
    [root@localhost ~]# cat new_file 
    |||c|d
    |e|fffff|g
    |h|i|j|k
    |1|2||s|d||s
    |||c|1|2|3
    
    
    # -s 删除连续的字符,相当于去重,只保留第一个
    [root@localhost ~]# cat 域名 
    |aaaaaaaaa|bbbbbbb|c|d
    |e|fffff|bbbbbg
    |h|i|j|k
    |1|2|a|s|d|a|s
    |a|b|c|1|2|3
    [root@localhost ~]# cat 域名  | tr -s [a-z] > new_file
    [root@localhost ~]# cat new_file 
    |a|b|c|d
    |e|f|bg
    |h|i|j|k
    |1|2|a|s|d|a|s
    |a|b|c|1|2|3
    # -s还有替换的功能,将域名中的\'|\',替换成\'-\'
    [root@localhost ~]# cat 域名  | tr -s "|" "-"
    -aaaaaaaaa-bbbbbbb-c-d
    -e-fffff-bbbbbg
    -h-i-j-k
    -1-2-a-s-d-a-s
    -a-b-c-1-2-3
    

wc命令

wc指令可以计算文件的字节数,词数,或者列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

注:在Linux系统中,一段连续的数字或字母组合为一个词

在默认的情况下,wc将计算指定文件的行数、字数,以及字节数

  • 格式:wc [OPTION]... [FILE]...

  • 参数:

    • -c:统计文件的字节(Bytes)数
    • -l:统计文件的行数
    • -w:统计文件中的单词个数,默认以空白字符作为分隔符
  • 实例如下:

    # 统计bytes
    # 查看域名内容
    [root@localhost ~]# cat 域名 
    |aaaaaaaaa|bbbbbbb|c|d
    |e|fffff|bbbbbg
    |h|i|j|k
    |1|2|a|s|d|a|s
    |a|b|c|1|2|3
    # 单文件
    [root@localhost ~]# wc 域名
     5  5 76 域名   # 对应数字:行数,单词数,字节数
     [root@localhost ~]# wc -c 域名 
    76 域名          # bytes数
    [root@localhost ~]# wc -w 域名 
    5 域名			# 单词数
    [root@localhost ~]# wc -l 域名 
    5 域名			# 行数
    
    # 多文件
    # 不加参数默认都输出
    [root@localhost ~]# wc 域名 域名 域名 
      5   5  76 域名 # 第一个5代表行数未5,单词数5,字节数76
      5   5  99 域名
      6   6  42 域名
     16  16 217 total
     
     [root@localhost ~]# cat 域名 域名 域名 | wc
         16      16     217
     # 这样相当于将三个文件的行数,单词书,字节数求和输出
     # 加参数
     [root@localhost ~]# wc -c  域名 域名 域名 
     76 域名    # 文件字节总和
     99 域名
     42 域名
    217 total
    [root@localhost ~]# wc -l  域名 域名 域名 
      5 域名    # 文件行数总和
      5 域名
      6 域名
     16 total
     [root@localhost ~]# wc -w  域名 域名 域名 
      5 域名    # 文件单词数总和
      5 域名
      6 域名
     16 total
     # 上面的例子是多文件统计
    

三剑客 - sed

sed,三大剑客之一,sed是一款流媒体编辑器,用来对文本进行过滤,修改操作等

注:grep用来过滤文本,sed用来修改文本,awk用来处理文本

  • 格式:sed [参数] \'处理规则\' [操作对象]

  • 参数

    • -e:允许多个脚本被执行,多项编辑

    • -n:取消默认输出,就是静默输出

    • -i:就地编辑,直接修改源文件(慎用)

    • -r:使用拓展正则表达式(和egrep一样)

    • -f:指定sed匹配规则脚本文件

编辑模式:

  • d:删除模式
  • p:打印(P打印第一行)
  • a:在当前行后添加一行或多行
  • i:在当前行上一行插入文本(直接修改,原文内容 也会更改)
  • r:从文件中读取
  • w:将指定行写入文件
  • y:将字符转换成另一个字符
  • s:替换指定的字符(每一行只替换一次)
  • g:获得内存缓冲区的内容,并替代当前,相当于全部执行
  • i:忽略大小写(和s模式一起使用的时候,不是单独使用)
  • &:已经匹配字符串标记
  • 定位:(使用两个斜线)

定位分类:

  • 数字定位:sed ‘行号+模式’ file -- 指定行定位

    • sed \'/^g/d\' 域名
      
  • 正则定位:sed ‘正则+模式’ file -- 正则指定开头内容

    • sed \'3,/^g/d\' 域名
      
  • 数字和正则定位:sed ‘数字,正则+模式’ file -- 指定行,和开头

  •    sed \'3,/^g/d\' 域名
    
  • 正则和正则定位:sed ‘正则,正则+模式’ file -- 指定以g和k开头

  •    sed \'/^g/,/^j/d\' 域名
    
    
  • 处理规则可以使用正则,也可以使用-f指定文件

标签:Linux编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。