一、 sed的高级编辑命令

 1、高级编辑命令

  P:打印模式空间开端至\n内容,并追加到默认输出之前   h:把模式空间中的内容覆盖至保持空间中   H:把模式空间中的内容覆盖至保持空间中   g:从保持空间取出数据覆盖至模式空间   G:从保持空间取出内容追加至模式空间   x:把模式空间中的内容与保持空间中的内容进行互换   n:读取匹配到的行的下一行覆盖至模式空间   N:读取匹配到的行的下一行追加至模式空间   d:删除模式空间中的行   D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会想发出d命令那样启动正常的新循环

 2、sed示例:

  sed -n ‘n;p’ file 显示偶数行   sed ‘1!G;h;$!d’ file 倒序显示文件每一行内容   sed ‘N;D’ file 仅显示最后一行   sed ‘$!N;$!D’ file 仅显示文件最后两行   sed ‘G’ file 每行后加一个空行   sed ‘g’ file 将每行内容替换为空行   sed ‘/^$/d;G’ file 每行后加一个空行,已有空白行的仅显示一个空白行   sed ‘n;d’ file 显示奇数行   sed -n ‘1!G;h;$p’ file 倒序显示文件的每一行内容

二、 软件包管理

 1、 软件运行和编译

  1. 软件编译的流程

   程序源代码预处理编译汇编链接    动态编译:.a    动态编译:.so

  2. 静态和动态链接

   链接主要作用是把各个模块之间互相引用的部分处理好,使得各个模块之间能够正确的衔接,分为静态链接和动态链接    静态链接的特点:     把程序对应的依赖库复制一份到包     libxxx.a     嵌入程序包     升级难,需要重新编译     占用较多空间,迁移容易    动态链接的特点:     只把依赖加做一个动态链接     libxxx.so     “链接指向”     占用较少空间,升级方便

  3. 开发语言

   系统级开发     C     C++    应用及开发     Java     delphi     python     go     Php     perl     ruby

 2、 软件包

  1.二进制应用程序的组成部分:

   二进制文件、库文件、配置文件、帮助文件

  2.程序包管理器

   debian:deb文件, dpkg包管理器    redhat: rpm文件, rpm包管理器    rpm: Redhat Package Manager    RPM Package Manager

  3.软件包的命名

   源代码:     Name-version.tar.gz|bz2|xz     名字-版本号.tar.gz|bz2|xz    rpm包命名方式:     name-VERSION-release.arch.rpm     包名-版本号-release.运行平台.rpm    常见的arch(运行安装平台):      x86: i386, i486, i586, i686      x86_64: x64, x86_64, amd64    跟平台无关:noarch(平台是noarch的软件包代表在大部分平台上都可以通用的软件包,兼容性比较好)

  4.包:分类和拆包

   Application-VERSION-ARCH.rpm: 主包    Application-devel-VERSION-ARCH.rpm 开发子包    Application-utils-VERSION-ARHC.rpm 其它子包    Application-libs-VERSION-ARHC.rpm 其它子包    包之间:可能存在依赖性关系,甚至循环依赖

  5.解决依赖包管理工具

   yum:rpm包管理器的前端工具    apt-get:deb包管理器前端工具    zypper: suse上的rpm前端管理工具    dnf: Fedora 18+ rpm包管理器前端管理工具

  6.库文件

   查看二进制程序所依赖的库文件     ldd 后跟二进制文件路径 :查看一个二进制程序所依赖的库文件    管理及查看本机装载的库文件      ldconfig :加载库文件     /sbin/ldconfig -p :显示本机已经缓存的所有可用库文件名及文件路径映射关系     配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf    缓存文件:/etc/ld.so.cache

  7.包文件的组成(每个包独有)

   RPM包内的文件    RPM的元数据,如名称,版本,依赖性,描述等    安装或卸载时运行的脚本

  8.数据库(公共):/var/lib/rpm

   程序包名称及版本    依赖关系    功能说明    包安装后生成的各文件路径及校验码信息

  9.获取程序包的途径

   (1) 系统发版的光盘或官方的服务器;

    CentOS镜像:      https://www.centos.org/download/      http://mirrors.aliyun.com      http://mirrors.sohu.com      http://mirrors.163.com

   (2) 项目官方站点
   (3) 第三方组织:

    Fedora-EPEL:     Extra Packages for Enterprise Linux     Rpmforge:RHEL推荐,包很全     搜索引擎:      http://pkgs.org      http://rpmfind.net      http://rpm.pbone.net      https://sourceforge.net/

   (4) 自己制作

    注意:第三方包建议要检查其合法性     来源合法性,程序包的完整性

 3、 包管理器

  1.功能:

   将编译好的应用程序的各组成文件打包一个或几个 程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、 升级和校验等管理操作

  2.管理程序包的方式:

   使用包管理器:rpm    使用前端工具:yum, dnf

  3.rpm包管理

   CentOS系统上使用rpm命令管理程序包:     安装、卸载、升级、查询、校验、数据库维护

   1、 安装:

    rpm {-i|-stall} [install-options] PACKAGE_FILE…       -i 安装        -v :显示过程        -vv:显示详细过程        -h :显示进度        -ivh 常用安装选项        --nodeps忽略依赖性关系检测        --test 测试安装,但不是真安装        --replacepkgs 重复安装已安装过的包,文件覆盖        --replacefiles 即将安装的包的部分文件与其他已安装的包文件冲突,可继续安装,文件不覆盖        --nosignature: 不检查来源合法性        --nodigest:不检查包完整性        --noscripts:不执行程序包脚本        %pre: 安装前脚本; --nopre        %post: 安装后脚本; --nopost        %preun: 卸载前脚本; --nopreun        %postun: 卸载后脚本; --nopostun

   2、 升级

    rpm {-U|--upgrade} [install-options] PACKAGE_FILE...     rpm {-F|--freshen} [install-options] PACKAGE_FILE...      upgrade:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则“安装”      freshen:安装有旧版程序包,则“升级”如果不存在旧版程序包,则不执行升级操作       --oldpackage 指定的包比已安装过的包旧,降级安装       --force 强制安装      -U 指定的包比已安装的包新或者未安装      -F 指定的包比已安装的包新      例:       rpm -Uvh PACKAGE_FILE ...       rpm -Fvh PACKAGE_FILE ...

     注意:       (1) 不要对内核做升级操作;Linux支持多内核版本并存,因此 ,对直接安装新版本内核       (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本 的提供的同一个配置文件并不会直接覆盖老版本的配置文

   3、 包查询

    -q查看是否安装     -qa 查询已安装的所有包     -qf 文件路径 查询指定的文件来源于哪一个rpm包     -ql 包名 查询该包提供了哪些文件     -qp# rpm包 对未安装的包,指定rpm文件再配合其他查询子选项来进行各项查询操作     -q --changelog 包名 查看更新日志     -qc 包名 查看该软件包所提供的配置文件     -qd 包名 查看该软件包所提供的文档文件     -qi 包名 查看该软件包的详细信息     -q --scripts 查看安装前及安装后的脚本     -q --provides 包名 查看一个软件包提供了哪些能力     -qR 包名 查看一个软件包的运行所依赖的能力     -q --whatprovides 能力名 查看一个能力由哪个包提供     -q --whatrequires 能力名 查看一个能力依赖于哪些包     rpm2cpio 包文件|cpio –itv 预览包内文件     rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件 小注意:rpm2cpio 可以将rpm 包转换为cpio归档文件

   4、 卸载

    -e 包名(包名要打全,除了.rpm其他都要打上)     rpm -e rpm -q vsftpd 或rpm -e vsftpd --allmatches 安装了多个版本的某个rpm可以一次性全部删除      --nodeps 删除时不检查依赖性关系

   5、 校验

    包来源合法性验证及完整性验证     完整性验正:SHA256     来源合法性验正:RSA     公钥加密      对称加密:加密、解密使用同一密钥      非对称加密:密钥是成对儿的       public key: 公钥,公开所有人       secret key: 私钥, 不能公开     -V 校验已安装的包的文件哪些发生生了更改或丢失,更改变化的类型如下:      S file Size differs 文件大小是否发生变化      M Mode differs (includes permissions and file type)权限      5 digest (formerly MD5 sum) differs 文件内容是否改变      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     -pV: 显示比-V还详细的更改信息,未安装的包也可以看,-V则不可以
    -V 后跟包名就可以了,-pV: 后必须跟全称,.rpm只需要跟软件名就可以了     下面我们就测试一下      例图:      当vsftpd的所有配置文件都没有被改变时-V是没有反应的,当我们修改某一个文件时在用-V来查询,下面就就指出了被修改的文件的路径,S.5….T. 提示了是被更改了哪些信息,      这个图呢是为了验证使用-Pv时必须打上软件包的全称,否则会出错呦     -K|checksig rpmfile 验证包的合法性,完整性和签名     --import 公钥: 导入公钥(公钥RPM-GPG-KEY-CentOS-6)     rpm -qa "gpg-pubkey*" 查询公钥     rpm -e rpm -qa "gpg-pubkey*" 删除公钥     导入公钥例图:      第一步,在挂载的光盘下查找公钥路径      第二部导入公钥

  4. rpm数据库

   rpm数据库是记录安装的哪些软件包,哪些软件包没有被安装的一个数据库,rpm -q 就是查询软件包是否安装的一个命令,而这个命令访问的就是这个数据库里面的文件来得知该软件包是否被安装然后再告诉用户的,如果这个数据库被删除了,则使用rpm -q就会出错,不管有没有安装哪个包都会提示没有安装,因为数据库中没有这个软件包的记录了。rpm数据库的路径是/var/lib/rpm    数据库重建:     rpm {--initdb|--rebuilddb}      Initdb :初始化       如果事先不存在数据库,则建之       否则不执行任何操作      rebuilddb :重建已安装的包头的数据库索引目录