linux sed怎么用(linux三剑客之sed命令补充及常用参数演示)

Linux 三剑客之sed

linux sed怎么用(linux三剑客之sed命令补充及常用参数演示)(1)


命令补充:sort命令###

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

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

# 常用参数演示,文件内容自己编写 # 排序 [root@localhost ~]# cat 1.sh aa ab ac ad [root@localhost ~]# sort 1.sh aa ab ac ad # -n按照数值大小排序 [root@localhost ~]# sort -n 1.sh 1aa 22ab 32ac 42ad # -r 以相反的顺序来排序,降序输出 [root@localhost ~]# sort -r 1.sh aaa 4ad 32ac 22ab 1aa 1 # 按第一列排序 [root@localhost ~]# sort -k1 1.sh 1 1aa 22ab 32ac 4ad aaa # -t:指定分割符,默认是以空格为分隔符 # 注:分隔符排序前有空格行 [root@localhost ~]# cat 3.sh |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.sh |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 4.sh aaaaaa aaaaaa bbbbbb bbbbbb cccccc cccccc [root@localhost ~]# sort -u 4.sh aaaaaa bbbbbb cccccc # -o<输出文件> : 将排序后的结果存入指定的文件 [root@localhost ~]# sort -u 4.sh > 5.sh [root@localhost ~]# cat 5.sh aaaaaa bbbbbb cccccc


uniq命令###

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

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

# 去重 [root@localhost ~]# cat 4.sh aaaaaa aaaaaa bbbbbb bbbbbb cccccc cccccc [root@localhost ~]# uniq 4.sh aaaaaa bbbbbb cccccc # 注意,去重是相邻重复内容去重,所以先排序再去重 [root@localhost ~]# cat 5.sh 123 124 123 123 123 124 124 124 125 126 [root@localhost ~]# uniq 5.sh 123 124 123 124 125 126 # 这样的话就没有达到去重的效果,需要搭配sort使用 [root@localhost ~]# sort -n 5.sh|uniq 123 124 125 126 # -c: 在输出行前面加上每行在输入文件中出现的次数 [root@localhost ~]# sort -n 5.sh|uniq -c 4 123 4 124 1 125 1 126 # -u:仅显示不重复行列 [root@localhost ~]# sort -n 5.sh|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 (192.168.15.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 (192.168.15.1) # -3表示从第一个字节到第三个字节,3-表示从第三个字节到行尾 # 执行上述语句,第三个字节不会重叠输出-c模式字符(汉字可用)如下:[root@localhost ~]# cat a.txt 路飞 山治 索隆 娜美 黑胡子 白胡子 # 如果用b模式就会不完全输出 [root@localhost ~]# cut -b 2 a.txt · ± ´ ¨ » # 用c模式,区别就看出来了 [root@localhost ~]# cut -c 2 a.txt 飞 治 隆 美 胡 胡 # -c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。 # 使用-n搭配b模式使用,解决乱码 [root@localhost ~]# cut -nb 2 a.txt 飞 治 隆 美 胡 胡 -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 2.sh a b c d e f g h i j k 1 2 a s d a s a b c 1 2 3 # 将2.sh中的' '替换成'|' [root@localhost ~]# cat 2.sh | 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 # 将2.sh小写字母替换成大写字母 [root@localhost ~]# cat 2.sh | 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 删除2.sh中的ab字母 [root@localhost ~]# cat 2.sh | 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 2.sh |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 2.sh | 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还有替换的功能,将2.sh中的'|',替换成'-' [root@localhost ~]# cat 2.sh | 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 # 查看2.sh内容 [root@localhost ~]# cat 2.sh |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 2.sh 5 5 76 2.sh # 对应数字:行数,单词数,字节数 [root@localhost ~]# wc -c 2.sh 76 2.sh # bytes数 [root@localhost ~]# wc -w 2.sh 5 2.sh # 单词数 [root@localhost ~]# wc -l 2.sh 5 2.sh # 行数 # 多文件 # 不加参数默认都输出 [root@localhost ~]# wc 2.sh 3.sh 4.sh 5 5 76 2.sh # 第一个5代表行数未5,单词数5,字节数76 5 5 99 3.sh 6 6 42 4.sh 16 16 217 total [root@localhost ~]# cat 2.sh 3.sh 4.sh | wc 16 16 217 # 这样相当于将三个文件的行数,单词书,字节数求和输出 # 加参数 [root@localhost ~]# wc -c 2.sh 3.sh 4.sh 76 2.sh # 文件字节总和 99 3.sh 42 4.sh 217 total [root@localhost ~]# wc -l 2.sh 3.sh 4.sh 5 2.sh # 文件行数总和 5 3.sh 6 4.sh 16 total [root@localhost ~]# wc -w 2.sh 3.sh 4.sh 5 2.sh # 文件单词数总和 5 3.sh 6 4.sh 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 '3d' 2.sh
  • 正则定位:sed ‘正则 模式’ file -- 正则指定开头内容sed '/^g/d' 2.sh
  • 数字和正则定位:sed ‘数字,正则 模式’ file -- 指定行,和开头
  • sed '3,/^g/d' 2.sh
  • 正则和正则定位:sed ‘正则,正则 模式’ file -- 指定以g和k开头
  • sed '/^g/,/^j/d' 2.sh
  • 处理规则可以使用正则,也可以使用-f指定文件
  • [正则个人总结](python 正则表达式 - HammerZe - 博客园 (cnblogs.com))
实例如下:###d模式——删除模式###

# 删除 [root@localhost ~]# cat 2.sh |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 ~]# sed '2d' 2.sh |aaaaaaaaa|bbbbbbb|c|d |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 # 删除第一行和第二行 [root@localhost ~]# sed '1,2d' 2.sh |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 # -e参数,多个脚本同时操作,删除1到2行,和五行 [root@localhost ~]# sed -e '1,2d' -e '5d' 2.sh |h|i|j|k |1|2|a|s|d|a|s # -n参数,静默 [root@localhost ~]# sed -n -e '1,2d' -e '5d' 2.sh [root@localhost ~]# echo $? 0 # 0代表成功,非0代表相反 # -f参数,搭配文件使用 # 在r.sh 中编写正则:/b/d --删除带有b的行 [root@localhost ~]# sed -r '/b/d' 2.sh |h|i|j|k |1|2|a|s|d|a|s [root@localhost ~]# sed -f r.txt 2.sh |h|i|j|k |1|2|a|s|d|a|s # 这样两种结果是一样的


p模式——打印###

# 查看2.sh [root@localhost ~]# cat 2.sh |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 ~]# sed "1p" 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 # -n,静默输出 [root@localhost ~]# sed -n "1p" 2.sh |aaaaaaaaa|bbbbbbb|c|d # 这样就只打印p模式指定的那行 # -e ,多项操作 [root@localhost ~]# cat 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |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 ~]# sed -e "1d" -e "5p" 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 # -i,直接修改源文件,就地编辑 # 修改前 [root@localhost ~]# cat 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |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 ~]# sed -i "7p" 2.sh # 修改后增加了一行 [root@localhost ~]# cat 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3


a模式,在当前行后添加一行或多行###

# 在第一行下添加xxxx [root@localhost ~]# sed '1axxxxxxx' 2.sh |aaaaaaaaa|bbbbbbb|c|d xxxxxxx |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3


i模式,在指定行前一行插入###

[root@localhost ~]# sed '7i马叉虫' 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s 马叉虫 |a|b|c|1|2|3 |a|b|c|1|2|3


c模式,替换当前行###

[root@localhost ~]# cat 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3 # 替换第一行 [root@localhost ~]# sed '1cxxxxxxx' 2.sh xxxxxxx |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3


r模式,在文件中读内容###

[root@localhost ~]# cat 3.sh |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 # 在3.sh中读取2.sh [root@localhost ~]# sed '5r 2.sh' 3.sh |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 |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3


w模式,将指定行写入文件###

# 把第一行到第七行写入到input文件中 [root@localhost ~]# sed '1,7w input.txt' 2.sh |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3 [root@localhost ~]# cat input.txt |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |aaaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3


y模式,将字符替换成另外一个###

# 将第一行到第三行的a替换成A,有a就替换 [root@localhost ~]# sed '1,3y/a/A/' 2.sh |AAAAAAAAA|bbbbbbb|c|d |AAAAAAAAA|bbbbbbb|c|d |AAAAAAAAA|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3


s模式,字符串转换###

# 将字符串转换成另一个字符串(每一行只替换一次) [root@localhost ~]# sed 's/a/啊/' 2.sh |啊aaaaaaaa|bbbbbbb|c|d |啊aaaaaaaa|bbbbbbb|c|d |啊aaaaaaaa|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|啊|s|d|a|s |啊|b|c|1|2|3 |啊|b|c|1|2|3


g模式,全部执行###

# 全部替换 [root@localhost ~]# sed 's/a/啊/g' 2.sh |啊啊啊啊啊啊啊啊啊|bbbbbbb|c|d |啊啊啊啊啊啊啊啊啊|bbbbbbb|c|d |啊啊啊啊啊啊啊啊啊|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|啊|s|d|啊|s |啊|b|c|1|2|3 |啊|b|c|1|2|3


i模式,忽略大小写###

# 和s模式一起使用 [root@localhost ~]# cat 2.sh |AAAAAAAAA|bbbbbbb|c|d |AAAAAAAAA|bbbbbbb|c|d |AAAAAAAAA|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|a|s|d|a|s |a|b|c|1|2|3 |a|b|c|1|2|3 # 忽略大小写 [root@localhost ~]# sed 's/a/啊/gi' 2.sh |啊啊啊啊啊啊啊啊啊|bbbbbbb|c|d |啊啊啊啊啊啊啊啊啊|bbbbbbb|c|d |啊啊啊啊啊啊啊啊啊|bbbbbbb|c|d |e|fffff|bbbbbg |h|i|j|k |1|2|啊|s|d|啊|s |啊|b|c|1|2|3 |啊|b|c|1|2|3


&的使用###

将nginx.conf中每一行之前增加注释 [root@localhost ~]# sed 's/.*/#&/g' /etc/nginx/nginx.conf


练习:###

# 将nginx.conf中的注释行全部去掉 sed '/^ *#/d' /etc/nginx/nginx.conf # 将nginx.conf中每一行之前增加注释 sed 's/.*/#&/g' /etc/nginx/nginx.conf # 一键修改本机的ip # 要求如下: # 192.168.15.100 ---> 192.168.15.101 # 172.16.1.100 ---> 172.16.1.101 sed -i 's/.100/.101/g' /etc/sysconfig/network-scripts/ifcfg-eth[01] # 将/etc/passwd中的root修改成ROOT sed -i 's/root/ROOT/g' /etc/passwd

如果觉得本文对你有帮助麻烦转发关注支持一下

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页