当前位置:   article > 正文

Linux系统三剑客命令---sed_sed命令 shell 权限问题

sed命令 shell 权限问题

一 常用参数

参数作用
-r识别扩展正则符号
-n取消默认输出,只将进行操作修改的行的内容输出到屏幕
-i对文件内容进行真正的修改、删除等操作
-e根据命令的顺序多重编辑

二 搭建测试环境

[root@db01 scripts]# cat id.txt 
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三 用法说明

3.1 显示输出信息

根据行号,显示某(几)行信息

##某单行信息
[root@db01 scripts]# sed -n '3p' id.txt 
203,Cindy,ACCA

##连续多行信息
[root@db01 scripts]# sed -n '3,5p' id.txt 
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE

##不连续的多行信息
[root@db01 scripts]# sed -n '3p;5p' id.txt 
203,Cindy,ACCA
205,Eric,HCIE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

根据内容,显示某(几)行信息

[root@db01 scripts]# sed -n '/Ci/p' id.txt 
203,Cindy,ACCA
[root@db01 scripts]# sed -n '/Ci/,/ri/p' id.txt 
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
[root@db01 scripts]# sed -n '/Ci/p;/ri/p' id.txt 
203,Cindy,ACCA
205,Eric,HCIE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.2 添加信息

不修改文件,只在屏幕输出结果。

## 在第1行的上一行插入新数据
[root@db01 scripts]# sed '1i200,Kate,OFI' id.txt 
200,Kate,OFI
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE

##在最后一行的下一行添加新数据
[root@db01 scripts]# sed '$a206,Frank,CEO' id.txt 
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
206,Frank,CEO

##也可以把上述2条命令合二为一,按照前后顺序,同时执行
[root@db01 scripts]# sed -e '1i200,Kate,OFI' -e '$a206,Frank,CEO' id.txt 
200,Kate,OFI
201,Alice,CFA
202,Book,FRM
203,Cindy,ACCA
204,David,CPA
205,Eric,HCIE
206,Frank,CEO
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

所以得出规律:
在第x行前面插入(insert),即为 xi
在第y行后面加入(add),即为 ya
1可以表示为第一行
$可以表示为最后一行
连续进行一次性多个操作用-e参数

3.3 删除信息

3.1中的所有p换成d,即可做到相同的(输出)删除操作
p-----print 打印,输出
d-----delete 删除

取消空行的显示(排除空行)
命令一:sed -n '/./p' id.txt
命令二:sed -n '/^$/d' id.txt
命令三:sed -n '/^$/!p' id.txt

3.4 修改信息

不修改文件,只在屏幕输出结果。
格式:sed 's#原有内容#修改后内容#g' 文件名,此处的#可以替换成/等特殊字符

后项引用前项格式:sed 's#(.*)#\1#g' 文件名。在这里,(.*)所匹配的就是\1的内容。

3.5 真正在文件中修改内容

3.23.33.4中所有的写入操作中加上-i参数,如下图所示。

sed -i 's#old#new#g' /tmp/test.txt
  • 1

此时的添加内容、删除内容、修改内容就会在文件中真实执行,并且在屏幕将结果输出显示。

一般而言,对于重要文件的修改都会进行提前备份,在-i参数后面加上.bak即可同时将源文件进行先备份一份test.txt.bak,再对test.txt进行修改。

sed -i.bak 's#old#new#g' /tmp/test.txt
  • 1

此外,一般在shell脚本中使用sed批量修改配置文件中,我们可能需要进行整行内容替换。
例如,某一行内容是这样的:

cat /etc/login.defs
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   30
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

此处需要将PASS_MAX_DAYS后面的数字换成50。
在替换过程中需要注意的是,PASS_MAX_DAYS在全文出现了两次,第一次出现在注释中,我们不能去改动,需要改的是第二个参数以及后面的内容。

经过观察可以发现,第二个参数是顶头出现的,我们要替换参数以及后面的东西,于是PASS_MAX_DAYS.*$就是s###g格式的第一个位置的内容,表示要替换参数以及后面的所有内容。
完整修改:sed -i.bak s#PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs

但如果是这样的:

auth  PASS_MAX_DAYS   30   password
  • 1

此处的参数前后都有内容,被夹在中间,则可以这么匹配。^.*PASS_MAX_DAYS.*$
完整修改:sed -i.bak s#^.*PASS_MAX_DAYS.*$#PASS_MAX_DAYS 50#g /etc/login.defs

四 补充说明

-n参数是在查看文件内容时使用,-i参数在真正修改文件时使用。
一般情况下,两个参数不会同时使用,也不能同时使用。
如果同时使用这两个参数,可能会使文件内容清空,是一个危险操作,请勿用错。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/322842
推荐阅读
相关标签
  

闽ICP备14008679号