赞
踩
1、每12小时备份并压缩/etc/目录至/backup目录中,保存文件名称格式为,"etc-年-月-日-时-分.tar.gz"
#crontab -e
0 /12 /bin/tar -zvcf /backup/etc-$(date +%Y-%m-%d-%H-%M).tar.gz /etc
2、rpm包管理功能总结以及实例应用演示。
一、程序包管理概述
- 1.程序包语言
-
- (1)系统级开发:一般直接调用硬件
C/C++:httpd, vsftpd, nginx
go语言
(2)应用级开发:java/Python/perl/ruby/php:
java: hadoop, hbase, (基于jvm虚拟机)
Python:openstack, (基于pvm虚拟机)
perl: (perl解释器)
ruby: (ruby解释器)
php: (php解释器)
- 2.程序语言格式
-
- (1)C/C++程序格式:
源代码:文本格式的程序代码;
编译开发环境:编译器、头文件、开发库
二进制格式:文本格式的程序代码 --> 编译器 --> 二进制格式(二进制程序、库文件、配置文件、帮助文件)
(2)java/python程序格式:
源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式;
开发环境:编译器、开发库
二进制
3.项目构建工具:
c/c++: make
java: maven
4.程序包管理器:要完成安装、升级、卸载、查询、校验(校验为Linux所有)功能
(1)功能
将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作;
- (2)组成方式
-
- 1)程序包的组成清单(每个程序包都单独实现):文件清单、 安装或卸载时运行的脚本
-
- 2)数据库(公共):/var/lib/rpm/
-
- 程序包的名称和版本、依赖关系、 功能说明、安装生成的各文件的文件路径及校验码信息...
-
- (3)不同系列Linux所用程序包管理器:
debian:dpt, dpkg, ".deb"
redhat:redhat package manager, rpm, ".rpm"; rpm is package manager;
S.u.S.E:rpm, ".rpm",
Gentoo:ports
ArchLinux:
- 5.包的命名格式
-
- (1)源代码:name-VERSION.tar.*z
VERSION:major.minor.release 主版本号.次版本号.发行号
(2)RPM包:name-VERSION-release.arch.rpm
VERSION:major.minor.release
release.arch:rpm包的发行号,arch 平台号
6.RHEL制作RPM包时会拆包:主包和支包,方便安装所需要组件而非全部
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
- function(功能):devel, utils, libs, ...
- 7.程序包管理器前端工具:自动解决依赖关系;
- yum:rhel系列系统上rpm包管理器的前端工具;
- apt-get (apt-cache):deb包管理器的前端工具;
- zypper:suse的rpm管理器前端工具;
dnf:Fedora 22+系统上rpm包管理器的前端工具,yum的升级版;
8.获取程序包的途径:
(1)系统发行版的光盘或官方的文件服务器(或镜像站点):
http://mirrors.aliyun.com、http://mirrors.sohu.com、http://mirrors.163.com
(2)各个项目自己的官方站点
(3)第三方组织:
- 1) EPEL等可靠地开源社区组织
-
- 2) 搜索引擎:http://pkgs.org、 http://rpmfind.net 、http://rpm.pbone.net
(4)自动编译二进制代码、制作
二、RPM包管理
rpm命令:rpm [OPTIONS] [PACKAGE_FILE]
安装:-i, --install
升级:-U, --update, -F, --freshen
卸载:-e, --erase
查询:-q, --query
校验:-V, --verify
数据库维护:--builddb, --initdb
1.安装:
(1)rpm {-i|--install} [install-options] PACKAGE_FILE ...
rpm -ivh PACKAGE_FILE ...
GENERAL OPTIONS(通用选项):
-v:verbose,详细信息
-vv:更详细的输出
[install-options]:
-h:hash marks输出进度条;每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突消息等;
--nodeps:忽略依赖关系;不建议;
--replacepkgs:重新安装
--nosignature:不检查包签名信息,不检查来源合法性;
--nodigest:不检查包完整性信息;
注意:rpm可以自带脚本;
四类:--noscripts
preinstall:安装过程开始之前运行的脚本,%pre , --nopre
postinstall:安装过程完成之后运行的脚本,%post , --nopost
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun
postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun
- (2)实例演示
-
- 1)[root@localhost Packages]#rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm #安装zsh程序,显示过程
[root@localhost Packages]# rpm -ivh zsh-5.0.2-28.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:zsh-5.0.2-28.el7 ################################# [100%]
2.升级:
(1)rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
- -U:升级或安装 -Uvh; rpm -Uvh PACKAGE_FILE ...
-
- -F:纯粹升级,必须存在老版本,不支持安装操作 -Fvh rpm -Fvh PACKAGE_FILE ...
--oldpackage:降级;
--force:强制升级;
- 注意:
-
- 1) 不要对内核做升级操作;Linux支持多内核版本并存,可直接安装新版本内核;
-
- 2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件 不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
-
- (2)实例演示
-
- [root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm
[root@localhost Packages]# rpm -Uvh zsh-5.0.2-28.el7.x86_64.rpm
准备中... ################################# [100%]
软件包 zsh-5.0.2-28.el7.x86_64 已经安装
3.卸载:
- (1)rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
-
- --allmatches:卸载所有匹配指定名称的程序包的各版本;
-
- --nodeps:忽略依赖关系
-
- --test:测试卸载,dry run模式
-
- (2)实例演示
-
- 1)[root@localhost Packages]#rpm -e --test zsh #测试卸载zsh
-
- [root@localhost Packages]#rpm -ql zsh #查看zsh程序安装所生成的所有文件列表
-
- 结论:--test不会真的卸载程序
[root@localhost Packages]# rpm -e --test zsh
[root@localhost Packages]# rpm -ql zsh
/bin/zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
2)[root@localhost Packages] rpm -e zsh
#卸载程序
[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# rpm -ql zsh
未安装软件包 zsh
[root@localhost Packages]#
4.查询:
(1)rpm {-q|--query} [select-options] [query-options]
[select-options]
PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本;
-a, --all:查询所有已经安装过的包;
-f FILE:查询指定的文件由哪个程序包安装生成;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
[query-options]
--changelog:查询rpm包的changlog;
-l, --list:程序安装生成的所有文件列表;
-i, --info:程序包相关的信息,版本号、大小、所属的包组,等;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片断;
用法总结:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...d
- (2)实例演示
-
- 1)[root@localhost Packages]# rpm -ql sed
#查询程序安装所以生成的所有文件列表
[root@localhost Packages]# rpm -ql sed
2)[root@localhost Packages]# rpm -qi sed
#显示程序的相关信息
[root@localhost Packages]# rpm -qi sed
Name : sed
Version : 4.2.2
Release : 5.el7
Architecture: x86_64
Install Date: 2018年12月10日 星期一 05时28分49秒
Group : Applications/Text
Size : 601208
License : GPLv3+
Signature : RSA/SHA256, 2014年07月04日 星期五 12时58分02秒, Key ID 24c6a8a7f4a80eb5
Source RPM : sed-4.2.2-5.el7.src.rpm
Build Date : 2014年06月10日 星期二 09时01分55秒
Build Host : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : http://sed.sourceforge.net/
Summary : A GNU stream text editor
Description :
The sed (Stream EDitor) editor is a stream or batch (non-interactive)
3)[root@localhost Packages]# rpm -qd sed #查看包所提供文档位置
[root@localhost Packages]# rpm -qd sed
/usr/share/doc/sed-4.2.2/AUTHORS
/usr/share/doc/sed-4.2.2/BUGS
/usr/share/doc/sed-4.2.2/COPYING
/usr/share/doc/sed-4.2.2/COPYING.DOC
/usr/share/doc/sed-4.2.2/NEWS
/usr/share/doc/sed-4.2.2/README
/usr/share/doc/sed-4.2.2/THANKS
/usr/share/doc/sed-4.2.2/sedfaq.txt.gz
/usr/share/info/sed.info.gz
/usr/share/man/man1/sed.1.gz
4)[root@localhost Packages]# rpm -qc zsh #显示zsh相关的配置文件的位置
[root@localhost Packages]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
5)[root@localhost Packages]# rpm -q --changelog zsh #查询zsh的改变日志
[root@localhost Packages]# rpm -q --changelog zsh
* 四 2月 16 2017 Kamil Dudka <kdudka@redhat.com> - 5.0.2-28
zero new space allocated in prompt buffer (#1408619)
fix parsing of parameter subscript expression with NOEXEC (#1398740)
fix crash while parsing the here-document syntax (#1374752)
improve use of new command substitution in completion (#1356388)
fix off-by-one error in completion utility cache code (#1344599)
5.校验:
(1)rpm {-V|--verify} [select-options] [verify-options]
S file Size differs #文件大小改变
M Mode differs (includes permissions and file type) #文件权限改变(包括许可和文件类型)
5 digest (formerly MD5 sum) differs #MD5校验码是否改变
D Device major/minor number mismatch #设备的主次版本号是否错配
L readLink(2) path mismatch # readlink路径是否错配
U User ownership differs #用户本身关系
G Group ownership differs # 用户组本身关系
T mTime differs # 修改时间modify time
P caPabilities differ
(2)实例演示
测试安装的程序的校验信息
[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-45.el7_0.3.x86_64.rpm
[root@localhost Packages]# rpm -V php
#测试程序的校验信息
[root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-45.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:php-5.4.16-45.el7 ################################# [100%]
[root@localhost Packages]# rpm -V php
未满足的依赖关系 php-5.4.16-45.el7.x86_64:
php-common(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要
php-cli(x86-64) = 5.4.16-45.el7 被 (已安裝) php-5.4.16-45.el7.x86_64 需要
6.包来源合法性验正和完整性验证:
- (1) 检验方式
-
- 数字签名:用私钥加密对应程序的特征码
-
- (2) 获取并导入信任的包制作者的密钥:
[root@localhost rpm-gpg]# cd /etc/pki/rpm-gpg/
[root@localhost rpm-gpg]# rpm --import RPM-GPG-KEY-CentOS-7
(3)验证:
1) 安装此组织签名的程序时,会自动执行验证;
2) 手动验正:rpm -K PACKAGE_FILE
在导入秘钥的CentOS7.1上验证
[root@localhost Packages]# rpm -K zsh-5.0.2-28.el7.x86_64.rpm
zsh-5.0.2-28.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 确定
7.数据库重建:
- (1)rpm管理器数据库路径:/var/lib/rpm/
-
- 查询操作:通过此处的数据库进行;
-
- (2)获取帮助:CentOS命令查询位置不同
-
- CentOS 6:man rpm
-
- CentOS 7:man rpmdb
-
- (3)rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
--rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建;
[--dbpath DIRECTORY] :指明建立位置
- (4)实例演示
-
- 1)在指定目录下/rpmdb下初始化一个rpm的数据库
注意:此时的库是没用的,所以大小和原来的库不同
[root@localhost Packages]# rpm -initdb --dbpath /rpmdb/
[root@localhost Packages]# ll /rpmdb/
总用量 440
-rw-r--r--. 1 root root 8192 12月 16 16:05 Basenames
-rw-r--r--. 1 root root 8192 12月 16 16:05 Conflictname
-rw-r--r--. 1 root root 311296 12月 16 16:05 db.001
-rw-r--r--. 1 root root 90112 12月 16 16:05 db.002
-rw-r--r--. 1 root root 107048 12月 16 16:05 __db.003
-rw-r--r--. 1 root root 8192 12月 16 16:05 Dirnames
-rw-r--r--. 1 root root 8192 12月 16 16:05 Group
-rw-r--r--. 1 root root 8192 12月 16 16:05 Installtid
-rw-r--r--. 1 root root 8192 12月 16 16:05 Name
-rw-r--r--. 1 root root 8192 12月 16 16:05 Obsoletename
-rw-r--r--. 1 root root 12288 12月 16 16:05 Packages
-rw-r--r--. 1 root root 8192 12月 16 16:05 Providename
-rw-r--r--. 1 root root 8192 12月 16 16:05 Requirename
-rw-r--r--. 1 root root 8192 12月 16 16:05 Sha1header
-rw-r--r--. 1 root root 8192 12月 16 16:05 Sigmd5
-rw-r--r--. 1 root root 8192 12月 16 16:05 Triggername
2)查看/var/lib/rpm
[root@localhost Packages]# cd /var/lib/rpm
[root@localhost rpm]# ll
总用量 101428
-rw-r--r--. 1 root root 5173248 12月 16 15:55 Basenames
-rw-r--r--. 1 root root 16384 12月 13 21:25 Conflictname
-rw-r--r--. 1 root root 311296 12月 16 16:02 db.001
-rw-r--r--. 1 root root 90112 12月 16 16:02 db.002
-rw-r--r--. 1 root root 1318912 12月 16 16:02 __db.003
-rw-r--r--. 1 root root 1376256 12月 16 15:55 Dirnames
-rw-r--r--. 1 root root 32768 12月 16 15:55 Group
-rw-r--r--. 1 root root 24576 12月 16 15:55 Installtid
-rw-r--r--. 1 root root 81920 12月 16 15:55 Name
-rw-r--r--. 1 root root 36864 12月 16 15:55 Obsoletename
-rw-r--r--. 1 root root 92139520 12月 16 15:55 Packages
-rw-r--r--. 1 root root 2527232 12月 16 15:55 Providename
-rw-r--r--. 1 root root 614400 12月 16 15:55 Requirename
-rw-r--r--. 1 root root 147456 12月 16 15:55 Sha1header
-rw-r--r--. 1 root root 86016 12月 16 15:55 Sigmd5
-rw-r--r--. 1 root root 8192 12月 13 22:33 Triggername
3、yum的配置和使用总结以及yum私有仓库的创建。
一、YUM简介
1. YUM: Yellowdog Update Modifier
完成RHEL系列前端自动解决依赖关系安装工具,依赖rpm存在
- 2.工作模式:C/S 架构
-
- Server端(yum仓库):依赖关系库、原文件、校验码文件
-
- Client端:yum客户端程序、配置文件(连接Server路径信息)
-
- 3.设计缺陷:
某一次安装过程中半途终止,再次重启后将无法解决程序间的依赖关系
yum升级版dnf就是为了解决此类问题
2.yum repository: yum repo,yum仓库
存储rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)
二、YUM客户端配置
1.yum配置文件路径
/etc/yum.conf:为所有yum仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
- 2./etc/yum.conf主配置定义
-
- [root@localhost ~]# man 5 yum.conf #可获得yum.conf的详解
-
- [root@localhost ~]# cat /etc/yum.conf
[main] #通用主配置段
cachedir=/var/cache/yum/$basearch/$releasever # 缓存文件路径
keepcache=0 # 缓存到本地的文件是否保存
debuglevel=2 # 调试级别
logfile=/var/log/yum.log # 安装的日志文件
exactarch=1 # 精确严格的平台release匹配
obsoletes=1
gpgcheck=1 #检测来源合法性和完整性
plugins=1 #支持插件机制
installonly_limit=5 #同时安装多少程序包
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bu # 追踪bug路径
distroverpkg=centos-release # 当前发行版版本号从哪儿获取
3.仓库(*.repo)配置文件定义:
[repositoryID] #仓库ID,唯一标识别,不能重复
name=Some name for this repository # 完整的仓库名称
baseurl=url://path/to/repository/ # yum仓库指明的访问路径
enabled={1|0} #是否启用此yum仓库,默认启用
gpgcheck={1|0} #是否检查完整性和来源合法性
gpgkey=URL #秘钥文件位置,可能是对方仓库提供
enablegroups={1|0} #是否基于组来批量管理程序包
failovermethod={roundrobin|priority} #故障转移方法:轮询、根据优先级选择; 默认roundrobin随机
cost=# #设置开销,默认为1000
… ...
- 说明:
-
- 1)*.repo可以将多个[repositoryID]的配置信息放在一个而文件内,也可以切成多个方便管理
-
- 2)baseurl可以使用:ftp:// 、http:// 、nfs:// 、file:/// 指明URL路径
-
- 3)baseurl等号两边不能有空格,其后可以填写多个镜像访问路径,每行一个,不能顶行写
-
- 多个访问路径间联系是镜像相同,目的是为了做备用访问
-
- 4)更多选项使用man 5 yum.conf查看,基本配置只需前三行就可以
-
- 5)发行版光盘镜像安装可能会自动配置网络镜像URL地址
三、yum命令的用法
yum [options] [command] [package ...]
- 1.OPTIONS
-
- --nogpgcheck:禁止进行gpg check;
-
- -y: 自动回答为“yes”;
-
- -q: 静默模式,不输出显示信息;
-
- --disablerepo=repoidglob:临时禁用此处指定的repo;
-
- --enablerepo=repoidglob:临时启用此处指定的repo;
-
- --noplugins:禁用所有插件;
-
- 2.常用COMMAND
-
- (1)显示仓库列表:repolist
-
- # yum repolist [all|enabled|disabled] [所有|可用的|不可用]
-
- (2)显示程序包:list
-
- # yum list [all | glob_exp1] [glob_exp2] [...] [所有的|符合glob通配条件的]
-
- # yum list {available|installed|updates} [glob_exp1] [...] 可用尚未安装的,已经安装的,可升级的
-
- (3)安装程序包:install
-
- # yum install package1 [package2] [...]
-
- # yum reinstall package1 [package2] [...] (重新安装)
-
- (4)卸载程序包:此时依赖于此安装包也会被卸载
-
- # yum remove | erase package1 [package2] [...]
-
- (5)升、降级安装程序包:update、downgrade
-
- # yum update [package1] [package2] [...] 升级操作
-
- # yum downgrade package1 [package2] [...] 降级操作
-
- (6)检查可用升级:check-uodate
-
- # yum check-update
-
- (7)查看程序包简要信息:info
-
- # yum info [package1] [package2] [...]
-
- (8)查看指定的特性(可以是某文件)是由哪个程序包所提供:provides
-
- yum provides | whatprovides feature1 [feature2] [...]
-
- (9)清理本地缓存:clean
-
- # yum clean <packages | metadata | expire-cache | rpmdb | plugins | all >
包、源数据、过期缓存、rpmdb、插件、所有
包安装完了会自动清除、而元数据(依赖关系等)不会自动,但下次yum安装会自动重新校验
3.COMMAND:安装及升级本地程序包
指定安装本地的*.rpm,但是会根据yum源现有依赖关系,解决此安装可能出现的依赖关系
- # yum localinstall rpmfile1 [rpmfile2] [...]
-
- # yum localupdate rpmfile1 [rpmfile2] [...]
-
- 4.COMMAND:包组管理的相关命令:
包组:一堆程序的一个集合,用于一起安装,因为某些程序安装需要依赖包组内容
- # yum groupinstall group1 [group2] [...] 安装包组
-
- # yum groupupdate group1 [group2] [...] 升级包组
-
- # yum grouplist [hidden] [groupwildcard] [...] 显示包组列表
-
- # yum groupremove group1 [group2] [...] 移除包组
-
- # yum groupinfo group1 [...] 显示包组信息
四、创建yum仓库
1.使用光盘当作本地yum仓库:
光盘的镜像本身就是一个yum源,自己安装系统时候选择安装工具时就是借助yum自动安装
- (1)挂载光盘至某目录,例如/media/cdrom # mount -r [-t iso9660] /dev/cdrom /media/cdrom
-
- (2)创建配置文件
-
- [ID]
-
- name=
-
- baseurl=file:///… …
-
- gpgcheck=
-
- 2.yum的repo配置文件中可用的变量:
-
- $releasever: 当前OS的发行版的主版本号;
-
- $arch: 平台;
-
- $basearch:基础平台,同一系列最基本的架构,如32、64;
-
- $YUM0-$YUM9 可做自定义
-
- 3.手动创建yum仓库:
-
- (1)安装工具:createrepo,已安装
[root@localhost yum.repos.d]# yum info createrepo
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
[root@localhost yum.repos.d]# mkdir -p /yumtest/Packages
[root@localhost yum.repos.d]# cp /media/cdrom/Packages/* /yumtest/Packages/
(3)创建关联关系: createrepo - Create repomd (xml-rpm-metadata) repository
命令:createrepo [options] <directory>
当完成后生成repodata即可
[root@localhost yum.repos.d]# createrepo /yumtest/
Spawning worker 0 with 2478 pkgs
Spawning worker 1 with 2478 pkgs
Spawning worker 2 with 2478 pkgs
Spawning worker 3 with 2477 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@localhost yum.repos.d]#
(4)配置yum源文件,创建*.rope写入信息即可
root@localhost yum.repos.d]# cat Local.repo
[Local]
name=Local Yum
baseurl=file:///yumtest/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
[root@localhost yum.repos.d]# yum repolist
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 7.5 kB 00:00
4、写一个脚本实现列出以下菜单给用户:
(1)disk:show disk info信息
(2)mem: show memory info信息
(3)cpu: show cpu info信息
(*)quit
#!/bin/bash
cat << EOF
1)disk: show disk info
2)mem:show memory info
3) cpu:show cpu info
*) quit
EOF
5、sed用法总结并结合实例演示
sed:流编辑器
1.sed:Stream Editor 行处理工具,流编辑器
对文件内容逐行进行处理调用操作并显示到STDOUT
工作流程:
(1)sed默认不编辑原文件,而是逐行操作,复制一份到指定内存(pattern space,模式空间)
(2)pattern space内进行模式匹配,即和指定条件做匹配
不满足模式:输出到标准输出STDOUT
满足模式:进行指定的模式操作,再输出到STDOUT
(3)第二个特殊的内存空间 hold space:保持空间,临时保存操作在另一处内存
(4)当执行pattern space和 hold space相关选项时候回进行之间的数据流编辑操作
(5)最后根据操作执行hold space空间操作,选择性显示到STDOUT
2.格式:sed [OPTION]… {script-only-if-no-other-script} [input-file]…
其中{script-only-if-no-other-script}:指的是AddressCommands,地址界定执行命令
AddressCommands中间无空格,直接连接为一个选项操作
============ sed [OPTION]… AddressCommands [input-file]…==============
- (1)OPTION常用选项
-
- -n:不输出模式空间中的内容至屏幕;
-
- -e script, --expression=script:多点编辑;
-
- -f /PATH/TO/SED_SCRIPT_FILE : 每行一个编辑命令;
-
- -r, --regexp-extended:支持使用扩展正则表达式;
-
- -i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;
-
- (2)地址定界
-
- 1)空地址:什么都不填写时,表示对全文进行处理
-
- 2)单地址
-
- #:表示对指定的行
/pattern/:被此模式所匹配到的每一行,其中模式两边的/不能省略
3)地址范围 (#表示任意数字)
#,#:从某行到某行,第二个#大于第一个#
#,+#:从某行开始加多商行
#,/pattern1/:从某行开始到第一次配到模式的行
/pattern1/,/pattern2/:从第一次匹配到的模式1到第二次匹配到哦的模式2
4)步进:~,#~# 从第几行
1~2:所有奇数行。从第一行开始,每次加两行读取
2~2:所有偶数行。从第二行开始,每次加两行读取
(3)编辑命令
d:删除;
p:显示模式空间中的内容;
a \text:在行后面追加文本“text”,支持使用\n实现多行追加;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;
c \text:把匹配到的行替换为此处指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
!:条件取反;
地址定界!编辑命令;
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
替换标记:
g:全局替换;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
- 练习1:删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符;
- ~]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
- 练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
- ~]# sed 's@^#[[:space:]]*@@' /etc/fstab
- 练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
- ~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
- ~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
- 3.pattern space和hold space编辑命令操作
-
- (1)常用选项
-
- h:把模式空间中的内容覆盖至保持空间中;
-
- H:把模式空间中的内容追加至保持空间中;
-
- g:把保持空间中的内容覆盖至模式空间中;
-
- G:把保持空间中的内容追加至模式空间中;
-
- x:把模式空间中的内容与保持空间中的内容互换;
-
- n:覆盖读取匹配到的行的下一行至模式空间中;
-
- N:追加读取匹配到的行的下一行至模式空间中;
-
- d:删除模式空间中的行;
-
- D:删除多行模式空间中的所有行;
-
- (2)实例演示
sed -n 'n;p' FILE:显示偶数行;
sed '1!G;h;$!d' FILE:逆序显示文件的内容;
sed ’$!d' FILE:取出最后一行;
sed '$!N;$!D' FILE:取出文件后两行;
sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE:显示奇数行;
sed 'G' FILE:在原有的每行后方添加一个空白行;
6、 用bash实现统计访问日志文件中状态码大于等于400的IP数量并排序
#!/bin/bash
- nginx_log='/usr/local/nginx/logs/mynginx.log'
-
- code_400_num=$(grep -o '[4|5][0-9][0-9]' ${nginx_log} | wc -l)
-
- code_400_sort=$(grep '[4|5][0-9][0-9]' ${nginx_log} | sort
-
- echo $code_400_num
-
- echo $code_400_sort
7、 使用自制的yum源安装ftp、openssh、curl、wget、tcpdump等软件包
mkdir -p /yumrepo/Packages ###创建本地packages目录
###将需要的Packages拷贝到本地目录
cp /media/cdrom/Packages/ftp-0.17-67.el7.x86_64.rpm /yumrepo/Packages/
cp /media/cdrom/Packages/openssh-* /yumrepo/Packages/
cp /media/cdrom/Packages/curl-7.29.0-35.el7.centos.x86_64.rpm /yumrepo/Packages/
cp /media/cdrom/Packages/wget-1.14-13.el7.x86_64.rpm /yumrepo/Packages/
cp /media/cdrom/Packages/tcpdump-4.5.1-3.el7.x86_64.rpm /yumrepo/Packages/
###使用createrepo命令创建本地yum源(如果没有此命令可以使用yum -y install createrepo安装)
[root@www yumrepo]# createrepo /yumrepo/
Spawning worker 0 with 15 pkgs
Workers Finished
Gathering worker results
++++++++++++++++++++++++++++++
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
修改yum配置文件,将仓库指向本地源
++++++++++++++++++++++++++++++
[root@www ~]# cd /etc/yum.repos.d/
[root@www yum.repos.d]# vim local.repo
[yumrepo]
name=yumrepo
baseurl=file:///yumrepo
enabled=1
gpgcheck=0
++++++++++++++++++++++++++++++
[root@www yum.repos.d]# yum repolist #######查看yum仓库
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
base: mirror.lzu.edu.cn
extras: mirror.lzu.edu.cn
updates: mirrors.cqu.edu.cn
仓库标识 仓库名称 状态
base CentOS-6 - Base 6,713
extras CentOS-6 - Extras 35
updates CentOS-6 - Updates 251
yumrepo yumrepo 15
repolist: 7,014
++++++++++++++++++++++++++++++
安装ftp、openssh、curl、wget、tcpdump等软件包
yum install -y ftp openssh curl wget tcpdump
转载于:https://blog.51cto.com/14387464/2409945
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。