软件包管理以及任务计划管理

rpm和yum命令常见选项

rpm

rpm是软件包管理工具命令,用来安装、升级、卸载、查询、校验rpm类型的软件包。

参数与选项

一、安装

语法格式

rpm{-i|--install} [instatll-options] PACKAGE_FILE1....

参数

  • -h:以#来表示安装进度
  • –percent:以百分比形式表示安装进度
  • -v:显示安装过程的详细信息
  • -vv:显示跟详细的安装过程
  • –test:不执行真正的安装过程,仅报告依赖关系及冲突信息。此为调试模式
  • –nodeps:忽略依赖关系,能成功安装,但未必能运行成功,不建议使用。
  • –replacepkgs:重新安装并覆盖原有文件
  • –force:强制安装
  • –noslgnature:不检查包签名信息,不检查来源合法性
  • –nodigest:不检查包完整性信息

安装时常用组合:-ivh,-ivvh

示例

[root@localhost ~]# rpm -ivh --test /media/Packages/zsh-5.0.2-28.el7.x86_64.rpm
准备中...                          ################################# [100%]
[root@localhost ~]# rpm -ivh  /media/Packages/zsh-5.0.2-28.el7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:zsh-5.0.2-28.el7                 ################################# [100%]

二、升级升级已安装的软件包

语法

升级或安装:rpm{-U|--upgrade}[install_options]PACKAGE_FILE...
升级:rpm{-F|--freshen}[install_options]PACKAGE_FILE...
参数
  • –oldpackage:降级到旧版本
  • 其余参数(install-options)与安装选项的参数相同
  • 常用组合:-Uvh,-Fvh
    ​注意:
    • 不要对内核进行升级,Linux允许多内核共存,可直接安装多个不同版本内核。
    • 若程序包的配置文件安装后曾被修改过,升级时新版本的文件不会覆盖老版本的配置文件,而是把新版本的配置文件重命名(加后缀.rpmnew)后保存。

示例

[root@localhost ~]# rpm -Uvh  /media/Packages/zsh-5.0.2-28.el7.x86_64.rpm

准备中...                          ################################# [100%]

软件包 zsh-5.0.2-28.el7.x86_64 已经安装

三、卸载

卸载已安装的程序包

语法

rpm{-e|--erase}[erase-options]PACKAGE_NAME...

参数

  • –nodeps:忽略依赖关系;
  • –test:测试卸载,dry-run模式
  • –allmatches:如果一个程序包同时安装了多个版本,则此选项会一次性全部卸载。

注意:若程序包配置文件在安装后修改过,卸载时,此配置文件不会被被删除,而是被重命名(加后缀.rpmsave)后保存。

示例

[root@localhost ~]# rpm -evh  zsh
准备中...                          ################################# [100%]
正在清理/删除...
   1:zsh-5.0.2-28.el7                 ################################# [100%]

四、查询

查询程序包是否已安装,检查已安装的程序包,查看程序包的详细信息

语法

rpm{-q|--query}[select-options][query-options]

参数

  • select-options
    • rpm -q PACKAGE_NAME…:查询程序包是否安装
    • -a:查询已安装的所有包
    • -f:查询某文件是由哪个程序包安装生成
    • -p:查询尚未安装的程序包文件的相关信息
  • query-options
    • -i:查询某程序包的简要说明信息
    • -l:查询某程序包生成的文件列表
    • -c:查询某程序包安装完成后生成的所有配置文件
    • -d:查询某程序包安装完成后生成的所有帮助文件
    • –changelog:查询某程序包制作室随版本变化的chengelog信息
    • –provides:查询某程序包提供的capabilities
    • –requires:查询某程序包所依赖的capabilities
    • –scripts:查询某程序包安装或卸载时执行脚本。脚本分为四类 :
      • preinstall:安装过程开始之前执行的脚本
      • postinstall:安装过程完成后执行的脚本
      • preuninstall:卸载开始之前执行的脚本
      • postuninstall:卸载过程完成后执行的脚本

示例

[root@localhost ~]# rpm -qa | head -5
cups-libs-1.6.3-35.el7.x86_64
gnome-boxes-3.22.4-4.el7.x86_64
perl-Net-LibIDN-0.12-15.el7.x86_64
kdeplasma-addons-libs-4.10.5-5.el7.x86_64
libxshmfence-1.2-1.el7.x86_64

[root@localhost ~]# rpm -ql zsh | head -5
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile

[root@localhost ~]# rpm -q --provides zsh
config(zsh) = 5.0.2-28.el7
zsh = 5.0.2-28.el7
zsh(x86-64) = 5.0.2-28.el7

[root@localhost ~]# rpm -qi zsh
Name        : zsh
Version     : 5.0.2
Release     : 28.el7
Architecture: x86_64
Install Date: 2018年09月18日 星期二 09时42分04秒
Group       : System Environment/Shells
Size        : 5855982
License     : MIT
Signature   : RSA/SHA256, 2017年08月11日 星期五 04时28分17秒, Key ID 24c6a8a7f4a80eb5
Source RPM  : zsh-5.0.2-28.el7.src.rpm
Build Date  : 2017年08月02日 星期三 18时52分37秒
Build Host  : c1bm.rdu2.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://zsh.sourceforge.net/
Summary     : Powerful interactive shell
Description :
The zsh shell is a command interpreter usable as an interactive login
shell and as a shell script command processor.  Zsh resembles the ksh
shell (the Korn shell), but includes many enhancements.  Zsh supports
command line editing, built-in spelling correction, programmable
command completion, shell functions (with autoloading), a history
mechanism, and more.

 

五、校验1、 校验程序包安装完成后是否发生了改变

语法

rpm {-V|--verify} [select-options] [verify-options]

参数

  • –nodeps:不校验依赖关系;
  • –nodigest:不检查包完整性;
  • –nofiles:不校验文件属性是否发生改变;
  • –nosignature:不检查包或头部签名;

无结果输出时表示软件包完整。有相应结果输出表示对应内容发生改变。校验结果中各位置表示的意思:

  • S:(file Size differ)文件的容量大小发生改变
  • M:(Mode differ)文件的类型或文件的权限属性改变
  • 5:(MD5 sum differ)MD5验证内容完整性发生改变
  • D:(Device major/minor number mismatch)主次设备号发生改变
  • L:(readLink(2) path mismatch)路径不匹配
  • U:(User ownership differs)属主发生改变
  • G:(Group ownership differs)属组发生改变
  • T:(mTime differs)最近一次的修改时间戳发生改变
  • p:(caPabilities differ)能力发生改变

示例

[root@localhost ~]# rpm -V perl
[root@localhost ~]#

2、程序包的合法性验证验证程序包来源合法性及完整性需要先导入合法的KEY文件

语法

导入KEY文件:rpm --import /path/to/RPM-GPG-KEY-FILE验证:rpm {-K|--checksig} PACKAGE_FILE
参数
  • –nosignature:不检查来源合法性
  • –nodigest:不检查完整性
示例
[root@localhost ~]# rpm --import /media/RPM-GPG-KEY-CentOS-7
[root@localhost ~]# rpm -K  /media/Packages/zsh-5.0.2-28.el7.x86_64.rpm
/media/Packages/zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 确定

六、创建rpm管理器数据库

语法

rpm {--initdb|--rabuilddb}[-v][--dbpath DIRECTORY]

参数

  • –initdb:初始化数据库,即数据不存在时,新建数据库
  • –rebuilddb:无论当前是否存在数据哭,都直接创建此数据库;构建的数据库存放在/var/lib/rpm当中。

yum

yum是通过分析RPM的标头数据后,根据个软件的依赖关系制作出有依赖关系是的解决方案,然后自动处理软件的依赖性问题,以解决软件安装、升级、卸载问题。

yum的配置文件,主要指向仓库的位置以及相关的各种配置信息;每个yum命令行可以同时指向多个仓库,仓库间可进行优先级等相关配置。各仓库的配置文件以.repo结尾,每个repo配置文件中可以配置多个仓库。配置文件主要由两部分组成:

主配置文件:/etc/yum.conf,为各仓库指向提供公共配置文件。仓库标识为[main]各仓库的定义:/etc/yum.repos/*.repo

仓库的定义:

  • [repositoryid]:仓库标识,必须唯一,唯一标识此repository指向
  • name=#:当前仓库的描述信息
  • baseurl=url://path/to/repository/:指明repository的访问路径,通常为一个文件服务器上某repository,可设定多个url。支持ftp服务、http服务和本地目录file。
  • enable={1|0}:此仓库能否被使用
  • enablegroups={1|0}:是否支持使用组来批量管理程序包
  • failovermethod={roundrobin|priority}:故障转移方法,默认为roundrobin,随机挑选
  • gpackage={1|0}:是否对程序包做校验
  • gpgkey=url://path/ro/keyfile:指定gpgkey文件路径
  • cost=#:指明当前repository的访问开销,默认为1000

语法

yum [options][command] package….

参数

  • command
    • install package… :安装程序包,可同时安装多个
    • update [package…]:升级指定程序包
    • check-update:检查可用升级
    • remove | erase package1[package2…]:卸载程序包
    • list[…]:列出所有可安装的软件清单
    • info[…]:显示程序包的info信息
    • provides | whatprovides feature1[feature2]:产看指定的特性有那个程序包提供
    • clean [packages | metadate | expire-cache | rpmdb | plugins | all]:清理本地缓存
    • makecache:创建缓存
    • search string1[string2…]:关机字搜索程序包名及summary信息
    • reinstall package1[package2…]:重新安装
    • downgrade package1[package2…]:降级安装
    • deplist package1[package2…]:查看制定包的依赖关系capability
    • history [info | list |package-list | packages-info | summary | addon-info | rado | undo | rollback | new | sync |stats]:查看事务历史
    • localinstall rpmfile1[…]:安装本地的rpm包
    • localupdate rpmfile1[…]:从本地的rpm包升级程序
    • groupinstall group1[group2…]:包组安装
    • groupupdate group1[group2…]:包组升级
    • grouplist [hidden][groupwildcard] […]:列出所有包组
    • groupremove group1[….]:卸载包组
    • groupinfo group1[….]:查看包组的info信息
    • repolist[all | enable | disabled]:列出已经配置的所有可用仓库
  • options
    • –nogpgcheck:禁止进行gpgcheck
    • -y:自动回答为yes
    • -p:静默模式
    • –disablerepo=#:临时禁用在配置文件中配置并启用的某个repository
    • –enablerepo=#:临时启用指定的repo
    • –noplugins:禁用所有插件

示例

[root@localhost ~]# yum update yum-utils.noarch 
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.huaweicloud.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 yum-utils.noarch.0.1.1.31-45.el7 将被 升级
---> 软件包 yum-utils.noarch.0.1.1.31-46.el7_5 将被 更新
--> 解决依赖关系完成

依赖关系解决

==============================================================================================================================
 Package                      架构                      版本                                 源                          大小
==============================================================================================================================
正在更新:
 yum-utils                    noarch                    1.1.31-46.el7_5                      updates                    120 k

事务概要
==============================================================================================================================
升级  1 软件包

总计:120 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在更新    : yum-utils-1.1.31-46.el7_5.noarch                                                                          1/2 
  清理        : yum-utils-1.1.31-45.el7.noarch                                                                            2/2 
  验证中      : yum-utils-1.1.31-46.el7_5.noarch                                                                          1/2 
  验证中      : yum-utils-1.1.31-45.el7.noarch                                                                            2/2 

更新完毕:
  yum-utils.noarch 0:1.1.31-46.el7_5                                                                                          

完毕!


[root@localhost ~]# yum install -y zsh
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.huaweicloud.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 zsh.x86_64.0.5.0.2-28.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

==============================================================================================================================
 Package                   架构                         版本                                 源                          大小
==============================================================================================================================
正在安装:
 zsh                       x86_64                       5.0.2-28.el7                         base                       2.4 M

事务概要
==============================================================================================================================
安装  1 软件包

总下载量:2.4 M
安装大小:5.6 M
Downloading packages:
zsh-5.0.2-28.el7.x86_64.rpm                                                                            | 2.4 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : zsh-5.0.2-28.el7.x86_64                                                                                   1/1 
  验证中      : zsh-5.0.2-28.el7.x86_64                                                                                   1/1 

已安装:
  zsh.x86_64 0:5.0.2-28.el7                                                                                                   

完毕!

练习

1、自建yum仓库,分别为网络源和本地源。

(1)、网络源:

配置网络源需要确保Linux以能够连接网络

    1、备份本地yum源

[root@localhost yum.repos.d]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
[root@localhost yum.repos.d]# ll
总用量 36
-rw-r--r--. 1 root root 1664 4月  29 00:35 CentOS-Base.repo
-rw-r--r--. 1 root root 1664 9月  18 11:36 CentOS-Base.repo.backup
-rw-r--r--. 1 root root 1309 4月  29 00:35 CentOS-CR.repo
-rw-r--r--. 1 root root  649 4月  29 00:35 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  314 4月  29 00:35 CentOS-fasttrack.repo
-rw-r--r--. 1 root root  630 4月  29 00:35 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 4月  29 00:35 CentOS-Sources.repo
-rw-r--r--. 1 root root 4768 4月  29 00:35 CentOS-Vault.repo

    2、下载新的对应的CentOS-Base.repo到/etc/yum/yum.repos.d/目录下。需根据自己的Linux版本来下载对应repo,高版本的Linux不能使用低版本的yum源。阿里的yum源地址为https://opsx.alibaba.com/mirror

[root@localhost yum.repos.d]# wget -O /etc/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
--2018-09-18 11:47:23--  http://mirrors.aliyun.com/repo/Centos-7.repo
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 118.123.208.230
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|118.123.208.230|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2523 (2.5K) [application/octet-stream]
正在保存至: “/etc/CentOS-Base.repo”

100%[====================================================================================>] 2,523       --.-K/s 用时 0s      

2018-09-18 11:47:23 (215 MB/s) - 已保存 “/etc/CentOS-Base.repo” [2523/2523])

[root@localhost yum.repos.d]# cat /etc/CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#
 
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/os/$basearch/

…..

    3、运行yum makecache生成缓存,成功则表示网络yum源配置成功

[root@localhost yum.repos.d]# yum makecache
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                                                                                                   | 3.6 kB  00:00:00     
extras                                                                                                 | 3.4 kB  00:00:00     
updates                                                                                                | 3.4 kB  00:00:00     
Not using downloaded updates/repomd.xml because it is older than what we have:
  Current   : Tue Sep 18 00:01:58 2018
  Downloaded: Fri Sep 14 00:12:01 2018
元数据缓存已建立
 

(2)、本地源:

 可以Linux系统镜像或者镜像网站中将rpm包下载到本地,然后使用createrepo命令创建本地源。也可以使用光盘的设备存入对应版本的系统镜像,然后挂载到系统上作为本地源。

     1、创建本地光盘挂载目录/mirror/repo,并将光盘挂在到/mirror/repo目录下,可修改/etc/fstab文件,将光盘永久挂载

[root@localhost media]# mkdir -p /mirror/repo
[root@localhost media]# ll /dev/cdrom
lrwxrwxrwx. 1 root root 3 9月  18 08:52 /dev/cdrom -> sr0
[root@localhost media]# mount /dev/cdrom /mirror/repo
[root@localhost media]# echo "/dev/cdrom  /mirror/repo iso9660 defaults 0 0" >> /etc/fstab

    2、yum配置文件是/etc/yum.repos.d/目录下,创建一个以.repo结尾文件,编辑完成后保存退出。

[base]
name=localyum
baseurl=file:///mirror/repo
gpgcheck=0
enable=1

     3、用yun makecache创建元数据缓存,再用yum repolist查看repo列表信息。repolist会表示出文件个数,则本地yum源配置成功

[root@localhost repo]# yum makecache
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
base                                                                                                   | 3.6 kB  00:00:00     
元数据缓存已建立
[root@localhost repo]# yum repolist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
源标识                                                     源名称                                                        状态
base                                                       localyum                                                      9,911
repolist: 9,911
[root@localhost repo]# 

linux任务计划

Linux任务计划分为两种:

一次性的任务计划:只执行一次。使用at命令进行处理周期性的任务计划:每隔一定周期去做相同的事情。使用crontab来根据定义的周期信息,循环去做一些事情。

at

at是由atd服务提供的,用来处理一次性的计划任务。在centos6上可使用service atd start来启动服务;在centos7上使用systemctl start atd.service来启动服务。

语法

at [options] TIME

选项

  • -l:at -l相当于atq命令,列出目前系统上的所有当前用户的at队列
  • -d:at -d相当于atrm命令,可以去向一个在at排程中的工作
  • -v:可以使用较明显的时间格式列出at中的工作列表
  • -f file:把at要执行的所有任务放置于文件,让at读取此文件作为要运行的任务。
  • -m:及时程序、指令执行完成后没有输出结果,也要发送信息给使用者。

TIME的格式

  • HH:MM :如14:20。表示在今日HH:MM时刻进行,若已超过指定时刻,则于明天的HH:MM时刻进行此工作。
  • HH:MM YYYY-MM-DD:如13:10 2018-10-01
  • HH:MM[am|pm][Month][Date]
  • HH:MM[am|pm]+number[minutes|hours|days|weeks]:如now + 5 hours。从现在开始5小时后执行

示例

[root@localhost repo]# at 13:55
at> /bin/bash /app/test11.sh
at> <EOT>
job 15 at Tue Sep 18 13:55:00 2018
[root@localhost repo]# atq
15    Tue Sep 18 13:55:00 2018 a root

[root@localhost repo]# ll /var/spool/mail/root
From root@localhost.localdomain  Tue Sep 18 13:55:00 2018
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Received: by localhost.localdomain (Postfix, from userid 0)
    id 886CE81E7D1; Tue, 18 Sep 2018 13:55:00 +0800 (CST)
Subject: Output from your job       15
To: root@localhost.localdomain
Message-Id: <20180918055500.886CE81E7D1@localhost.localdomain>
Date: Tue, 18 Sep 2018 13:55:00 +0800 (CST)
From: root@localhost.localdomain (root)

2018-09-18 13:55:00

crontab

crontab是由crond服务提供的,用来处理一次性的计划任务。在centos6上可使用service crond start来启动服务;在centos7上使用systemctl start crond.service来启动服务

.cron任务有两类:系统cron和用户cron。

系统cron是指系统级别的例行性任务计划,通过编辑配置文件/etc/crontab文件来实现

用户cron是通过使用crontab命令编辑,编辑完成后存放在/var/spool/cron/目录下的与用户名同名的文件中。

系统cron的配置格式:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

其中:

  • 前五个*表示对应的时间点
  • user-name:表示用户身份
  • command:表示要运行的任务
五个时间点分别为:分钟 小时 天 月 周几
时间表示法:
  • 每个时间为都应该使用其可用的有效取值范围内的值;*用于表示试用期所有有效取值
  • */#:在对应的时间为有效取值上没#个时间单位执行一次。如 */7 * * * * /bin/echo “hello” 表示没7分钟执行一次。但并不精确。
  • 连续时间点:如 20 3 * * 1-5 /bin/echo “howdy” 表示周一至周五每天3:20执行
  • 离散时间点,以逗号分隔:20 3 * * 1,3,5 /bin/echo “howdy”
注意:在定义cron任务时,所有用到的命令使用绝对路径;如果是脚本,则脚本中的命令使用绝对路径,或者自定义一个拥有完整路径的环境变量

用户cron的定义

用户级别的周期性任务计划是通过crontab命令来实现。

语法

crontab [-u user] [-l | -r | -e] [-i]

参数选项

  • -u user:root用户可以为指定的用户管理cron任务
  • -l:列出已经定义的所有任务。
  • -e:打开编辑界面定义任务
  • -r:remove。移除所有任务。
  • -i:在使用-r选项移除所有任务时提示用户确认
注意:删除单一任务时应通过编辑人物界面删除行实现,在crontab中如果用户命令中需要使用%时,需要对其进行转义。

练习

制定 每周三凌晨三、五点10分执行某个脚本,输出当前时间,时间格式为 2017-12-28 10:00:00

1、想创建脚本文件test11.sh,写入脚本。
[root@localhost /]# vim /app/test11.sh

#!/bin/bash
#
#输出当前时间,时间格式为2017-12-28 10:00:00

echo `date "+%Y-%m-%d %H:%M:%S"`

2、使用crontab -e创建计划任务
[root@localhost /]# crontab -e

10 3,5 * * 3 /bin/bash /app/test11.sh
[root@localhost /]# crontab -l
10 3,5 * * 3 /bin/bash /app/test11.sh

3、另一种方式:

[root@localhost /]# crontab -e

10 3,5 * * 3 /bin/echo `date "+%Y-%m-%d %H:%M:%S"`

4、另一种:通过编辑配置文件/etc/crontab文件来实现

[root@localhost /]# vim /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

10 3,5 * * 3 root /bin/bash /app/test11.sh

 

文本处理三剑客之sed

sed的工作原理:

从文本中一次读取一行,并且复制一份到sed自己的工作区域,这个工作区域叫作模式空间(pattern space),在模式空间进行文本处理以后,将结果送到标准输出;默认sed对文本的每一行做处理操作,也可以定义sed仅处理符合条件(基于正则表达式来进行文本过滤)的行;(默认不对原文件进行编辑);
所以在模式空间中读取一行后,首先判断是否符合sed所指定的模式,如果符合则进行定义的编辑操作,将结果输出到标准输出,如果不匹配则默认输出到标准输出(默认是输出操作),也可以定义不输出没被sed模式匹配到的行;然后读取第二行,以此类推;
sed内部不仅有模式空间,还有一个空间叫hold space保持空间,可以将被sed模式匹配到的行编辑完以后存放到保持空间里(高级用法);
语法

sed [option] 'script' [input-file]

选项参数

1、选项:

  • -n:不输出模式空间内容,即不自动打印
  • -e script,–expression=script:实现多点编辑
  • -f /path/to/script_file:从指定文件中读取编辑脚本
  • -f:支持使用扩展正则表达式
  • -i .bak,–in-place[=SUFFIX]:备份原文件,然后直接编辑原文件

2、script脚本:地址界定

  • 不指定参数:对全文进行处理
  • 单地址:
    • #:对指定的#行进行处理
    • $:对最后一行进行处理
    • /模式/:对模式所匹配的行进行处理
  • 地址范围:
    • #,#:从某行到某行
    • #,+#:从某行开始往后#行
    • /模式1/,/模式2/:从模式1匹配的行到模式2匹配到的行
    • #,/模式/:从某行开始,到模式所匹配到的行
  • 步长:~
    • n~2:当n奇数时,表示从n行开始的奇数行;当n为偶数时,表示从n行开始的偶数行。

3、常用的编辑命令:

  • d:删除模式空间匹配的行,便立即启用下一轮循环。
    sed ‘1,5d’ /etc/fstab:删除第1到5行
    [root@localhost /]# cat /etc/fstab
    
    #
    # /etc/fstab
    # Created by anaconda on Wed Sep  5 09:28:43 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 /boot                   xfs     defaults        0 0
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 /var                    xfs     defaults        0 0
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0
    
    [root@localhost /]# sed '1,5d' /etc/fstab
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 /boot                   xfs     defaults        0 0
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 /var                    xfs     defaults        0 0
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0
    
    
  • p:显示当前模式空间中的内容
    sed ‘1~2p’ /etc/fstab:显示2遍所有奇数行
    [root@localhost /]# sed '1~2p' /etc/fstab
    
    #
    # /etc/fstab
    # /etc/fstab
    # Created by anaconda on Wed Sep  5 09:28:43 2018
    #
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 /boot                   xfs     defaults        0 0
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 /var                    xfs     defaults        0 0
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0

     

  • a [\]text:在指定行后面追加文本
    sed ‘3a \new line’ /etc/fstab:在第三行下面插入一行new line
    [root@localhost /]# sed '3a \new line' /etc/fstab
    
    #
    # /etc/fstab
    new line
    # Created by anaconda on Wed Sep  5 09:28:43 2018
    

     

  • i [\]text:在行前面插入文本
    sed ‘3i \new line’ /etc/fstab:在第三行上面插入一行new line
    [root@localhost /]# sed '3i \new line' /etc/fstab
    
    #
    new line
    # /etc/fstab
    

     

  • c [\]text :替换行为单行或多行文本
    sed ‘/^UUID/c # add new device base on UUID’ /etc/fstab:把UUID开头的行替换为# add new device base on UUID
    [root@localhost /]# sed '/^UUID/c \# add new device base on UUID' /etc/fstab
    
    #
    # /etc/fstab
    # Created by anaconda on Wed Sep  5 09:28:43 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    # add new device base on UUID
    # add new device base on UUID
    # add new device base on UUID
    # add new device base on UUID
    # add new device base on UUID
    

     

  • w /path/file:保存匹配结果到指定文件
    sed -n ‘/^[^#]/w /tmp/fstab.bak’ /etc/fstab:把非#开头的行保存至/tmp/fstab.bak文件里
    [root@localhost /]# sed -n '/^[^#]/w /tmp/fstab.bak' /etc/fstab
    [root@localhost /]# cat /tmp/fstab.bak
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 /boot                   xfs     defaults        0 0
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 /var                    xfs     defaults        0 0
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0
  • r /path/file:读取指定文件文本至模式空间中匹配到的行后
    sed ‘3r /etc/issue’ /etc/fstab:把issue文件,写在fstab文件第3行的后面(文件合并)
    [root@localhost /]# sed '3r /etc/issue' /etc/fstab
    
    #
    # /etc/fstab
    \S
    Kernel \r on an \m
    
    # Created by anaconda on Wed Sep  5 09:28:43 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    

     

  • =:为模式空间中的行打印行号
    sed ‘/^UUID/=’ /etc/fstab:把UUID开头的行上面加一行号
    [root@localhost /]# sed '/^UUID/=' /etc/fstab
    
    #
    # /etc/fstab
    # Created by anaconda on Wed Sep  5 09:28:43 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    9
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    10
    UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 /boot                   xfs     defaults        0 0
    11
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    12
    UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 /var                    xfs     defaults        0 0
    13
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0
    

     

  • !:对模式空间中匹配航取反处理
    ! sed ‘/^#/d’ /etc/fstab:删除非#开头的行
    ]# ! sed '/^#/d' /etc/fstab
    
    #
    # /etc/fstab
    # Created by anaconda on Wed Sep  5 09:28:43 2018
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    9
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    10
    UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 /boot                   xfs     defaults        0 0
    11
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    12
    UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 /var                    xfs     defaults        0 0
    13
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0
    [root@localhost /]# ! sed '/^#/d' /etc/fstab
    
    UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 /                       xfs     defaults        0 0
    UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 /boot                   xfs     defaults        0 0
    UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 /home                   xfs     defaults        0 0
    UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 /var                    xfs     defaults        0 0
    UUID=6076fd94-46d9-4fcc-a0f2-1add7f541689 swap                    swap    defaults        0 0
    

     

  • s///:查找替换,其分隔符可自行指定,常用有s@@@、s###等;
    • 替换标记:
      • g:全局替换;
      • w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
      • p:仅显示替换成功的行
      sed -i ‘s/7030/7035/’ redis.conf 把此文件7030替换一次为7035
      ]# sed -i 's/7030/7035/' redis.conf
      

4、高级编辑命令

  • P:打印模式空间开端至\n内容,并追加到默认输出之前:
    sed -n ‘n;p’ file :显示偶数行
  • G:从保持空间中取出内容追加至模式空间
  • g:从保持空间中读出数据覆盖至模式空间
  • h:把模式空间中的内容覆盖至保持空间中。
    sed ‘1!G;h;$!d’ file 反向显示
  • H:把模式空间中的内容追加至保持空间中。
  • x:把模式空间中的内容与保持空间中的内容进行互换
  • n:读取匹配到的行的下一行覆盖至模式空间
  • N:读取匹配到的行的下一行追加至模式空间。
  • sed ‘N;D’ file
    sed ‘/^$/d;G’ file:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行
  • d:删除模式空间中的行
  • D:删除多行模式空间中的所有行。如果模式空间包含换行符,则删除知道第一个换行符的模式空间中的文本,并不会读取新的输入航,而是用合成的模式空间启动循环。如果模式空间不包含换行符,则会如d命令那样启动正常的新循环

原创文章,作者:N32_王先桥,如若转载,请注明出处:http://www.178linux.com/124310

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code