1. 程式人生 > >Linux 程序包管理及sed基礎

Linux 程序包管理及sed基礎

type testing 5.1 ace manage awk pup see dev

  • 1、 簡述rpm與yum命令的常見選項,並舉例

  • rpm簡稱包管理器,即RedHat系列發行版的程序包管理工具,由於它遵循GPL規則且功能強大方便,故而廣受歡迎; yum是rhel系列系統上rpm包管理器的前端工具,它可以自動執行系統更新,包括依賴性分析和基於“知識庫”元數據的過時處理,還可以執行新的包的安裝,刪除舊的包,為其用戶提供更方便快捷的安裝程序。

    rpm命令:rpm [OPTIONS] [PACKAGE_FILE]
    安裝:-i, --install
    升級:-U, --update, -F, --freshen
    卸載:-e, --erase
    查詢:-q, --query
    校驗:-V, --verify

    數據庫維護:--builddb, --initdb

    安裝:
    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:重新安裝
    
        註意:rpm可以自帶腳本;
            四類:--noscripts
                preinstall:安裝過程開始之前運行的腳本,%pre , --nopre
                postinstall:安裝過程完成之後運行的腳本,%post , --nopost
                preuninstall:卸載過程真正開始執行之前運行的腳本,%preun, --nopreun 
                postuninstall:卸載過程完成之後運行的腳本,%postun , --nopostun
               --nosignature:不檢查包簽名信息,不檢查來源合法性;
               --nodigest:不檢查包完整性信息;

    示例:

    [root@node1 ~]# ls 
    anaconda-ks.cfg          functions                                               motd
    CentOS7搭建網絡yum源.sh  java-1.7.0-openjdk-1.7.0.191-2.6.15.4.el7_5.x86_64.rpm  yum.log
    fstab                    java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.i686.rpm       zsh-5.0.2-28.el7.x86_64.rpm
    fstab.new                java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64.rpm
    fstab.patch              ldirectord-3.9.6-0rc1.1.2.x86_64.rpm
    [root@node1 ~]# rpm -ivh  zsh-5.0.2-28.el7.x86_64.rpm
    Preparing...                          ################################# [100%]
    Updating / installing...
       1:zsh-5.0.2-28.el7                 ################################# [100%] 
    [root@node1 ~]# rpm -qa | grep zsh
    zsh-5.0.2-28.el7.x86_64

    升級:
    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
    rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

       -U:升級或安裝;
       -F:升級
    
        rpm  -Uvh PACKAGE_FILE ...
        rpm  -Fvh PACKAGE_FILE ...
    
        --oldpackage:降級;
        --force:強制升級;

    註意:(1) 不要對內核做升級操作;Linux支持多內核版本並存,因此,直接安裝新版本內核;
    (2) 如果某原程序包的配置文件安裝後曾被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)後提供;

    卸載:
    rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...

        --allmatches:卸載所有匹配指定名稱的程序包的各版本;
        --nodeps:忽略依賴關系
        --test:測試卸載,dry run模式

    示例:

    [root@node1 ~]# rpm -qa | grep zsh
    zsh-5.0.2-28.el7.x86_64
    [root@node1 ~]# rpm -evh zsh
    Preparing...                          ################################# [100%]
    Cleaning up / removing...
       1:zsh-5.0.2-28.el7                 ################################# [100%]

    查詢:
    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, ...

    示例:

    [root@node1 ~]# rpm -qf /bin/cd
    bash-4.2.46-28.el7.x86_64
    [root@node1 ~]# rpm -qf /bin/pwd
    coreutils-8.22-18.el7.x86_64
    [root@node1 ~]# rpm -ql zsh
    /bin/zsh
    /etc/skel/.zshrc
    /etc/zlogin
    /etc/zlogout
    /etc/zprofile
    /etc/zshenv
    /etc/zshrc
    [root@node1 ~]# rpm -qi zsh
    Name        : zsh
    Version     : 5.0.2
    Release     : 28.el7
    Architecture: x86_64
    Install Date: Sun 16 Sep 2018 12:32:31 AM EDT
    Group       : System Environment/Shells
    Size        : 5855982
    License     : MIT
    Signature   : RSA/SHA256, Thu 10 Aug 2017 04:28:17 PM EDT, Key ID 24c6a8a7f4a80eb5
    Source RPM  : zsh-5.0.2-28.el7.src.rpm
    Build Date  : Wed 02 Aug 2017 06:52:37 AM EDT
    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
    [root@node1 ~]# rpm -qc zsh
    /etc/skel/.zshrc
    /etc/zlogin
    /etc/zlogout
    /etc/zprofile
    /etc/zshenv
    /etc/zshrc
    [root@node1 ~]# rpm -q --scripts zsh
    postinstall scriptlet (using /bin/sh):
    if [ ! -f /etc/shells ] ; then
        echo "/bin/zsh" > /etc/shells
    else
        grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
    fi
    
    if [ -f /usr/share/info/zsh.info.gz ]; then
    # This is needed so that --excludedocs works.
    /sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir   --entry="* zsh: (zsh).            An enhanced bourne shell."
    fi
    
    :
    preuninstall scriptlet (using /bin/sh):
    if [ "$1" = 0 ] ; then
        if [ -f /usr/share/info/zsh.info.gz ]; then
        # This is needed so that --excludedocs works.
        /sbin/install-info --delete /usr/share/info/zsh.info.gz /usr/share/info/dir       --entry="* zsh: (zsh).            An enhanced bourne shell."
        fi
    fi
    :
    postuninstall scriptlet (using /bin/sh):
    if [ "$1" = 0 ] ; then
        if [ -f /etc/shells ] ; then
            TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
            grep -v ‘^/bin/zsh$‘ /etc/shells > $TmpFile
            cp -f $TmpFile /etc/shells
            rm -f $TmpFile
        fi
    fi

    校驗:
    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
            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
    
    包來源合法性驗正和完整性驗正:
        來源合法性驗正:
        完整性驗正:
    
        獲取並導入信任的包制作者的密鑰:
            對於CentOS發行版來說:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
        驗正:
            (1) 安裝此組織簽名的程序時,會自動執行驗正;
            (2) 手動驗正:rpm -K PACKAGE_FILE

    示例:
    手動驗證

    [root@node1 ~]# 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 OK
    [root@node1 ~]# rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-
    RPM-GPG-KEY-CentOS-7          RPM-GPG-KEY-CentOS-Testing-7  
    RPM-GPG-KEY-CentOS-Debug-7    RPM-GPG-KEY-EPEL-7            
    [root@node1 ~]# rpm -import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    [root@node1 ~]# 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 OK

    數據庫重建:
    rpm管理器數據庫路徑:/var/lib/rpm/
    查詢操作:通過此處的數據庫進行;

        獲取幫助:
            CentOS 6:man rpm
            CentOS 7:man rpmdb
    
            rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
                --initdb:初始化數據庫,當前無任何數據庫可實始化創建一個新的;當前有時不執行任何操作;
                --rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;

    示例:

    RPMDB(8)                                    System Manager‘s Manual                                    RPMDB(8)
    
    NAME
           rpmdb - RPM Database Tool
    
    SYNOPSIS
           rpm {--initdb|--rebuilddb}
    
    DESCRIPTION
           The general form of an rpm rebuild database command is
    
           rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]
    
           Use  --initdb  to create a new database if one doesn‘t already exist (existing database is not overwrit‐
           ten), use --rebuilddb to rebuild the database indices from the installed package headers.
    
    SEE ALSO
           popt(3),
           rpm(8),
           rpmkeys(8),
           rpmsign(8),
           rpm2cpio(8),
           rpmbuild(8),
           rpmspec(8),
    
           rpm --help - as rpm supports customizing the options via popt aliases it‘s impossible to guarantee  that
           what‘s described in the manual matches what‘s available.
    
           http://www.rpm.org/ URL:http://www.rpm.org/
    yum命令的用法:
        yum [options] [command] [package ...]
    
       command is one of:
        * install package1 [package2] [...]
        * update [package1] [package2] [...]
        * update-to [package1] [package2] [...]
        * check-update
        * upgrade [package1] [package2] [...]
        * upgrade-to [package1] [package2] [...]
        * distribution-synchronization [package1] [package2] [...]
        * remove | erase package1 [package2] [...]
        * list [...]
        * info [...]
        * provides | whatprovides feature1 [feature2] [...]
        * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
        * makecache
        * groupinstall group1 [group2] [...]
        * groupupdate group1 [group2] [...]
        * grouplist [hidden] [groupwildcard] [...]
        * groupremove group1 [group2] [...]
        * groupinfo group1 [...]
        * search string1 [string2] [...]
        * shell [filename]
        * resolvedep dep1 [dep2] [...]
        * localinstall rpmfile1 [rpmfile2] [...]
           (maintained for legacy reasons only - use install)
        * localupdate rpmfile1 [rpmfile2] [...]
           (maintained for legacy reasons only - use update)
        * reinstall package1 [package2] [...]
        * downgrade package1 [package2] [...]
        * deplist package1 [package2] [...]
        * repolist [all|enabled|disabled]
        * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
        * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
        * check
        * help [command]
    
    顯示倉庫列表:
        repolist [all|enabled|disabled]
    
    顯示程序包:
        list
            # yum list [all | glob_exp1] [glob_exp2] [...]
            # yum list {available|installed|updates} [glob_exp1] [...]
    
    安裝程序包:
        install package1 [package2] [...]
    
        reinstall package1 [package2] [...]  (重新安裝)
    
    升級程序包:
        update [package1] [package2] [...]
    
        downgrade package1 [package2] [...] (降級)
    
    檢查可用升級:
        check-update
    
    卸載程序包:
        remove | erase package1 [package2] [...]
    
    查看程序包information:
        info [...]
    
    查看指定的特性(可以是某文件)是由哪個程序包所提供:
        provides | whatprovides feature1 [feature2] [...]
    
    清理本地緩存:
        clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    
    構建緩存:
        makecache
    
    搜索:
        search string1 [string2] [...]
    
        以指定的關鍵字搜索程序包名及summary信息;
    
    查看指定包所依賴的capabilities:
        deplist package1 [package2] [...]
    
    查看yum事務歷史:
        history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    
    安裝及升級本地程序包:
        * localinstall rpmfile1 [rpmfile2] [...]
           (maintained for legacy reasons only - use install)
        * localupdate rpmfile1 [rpmfile2] [...]
           (maintained for legacy reasons only - use update)
    
    包組管理的相關命令:
        * groupinstall group1 [group2] [...]
        * groupupdate group1 [group2] [...]
        * grouplist [hidden] [groupwildcard] [...]
        * groupremove group1 [group2] [...]
        * groupinfo group1 [...]

    示例:

    [root@node1 ~]# yum -y install java
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * epel: ftp.cuhk.edu.hk
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    Resolving Dependencies
    --> Running transaction check
    ---> Package java-1.8.0-openjdk.x86_64 1:1.8.0.181-3.b13.el7_5 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ========================================================================================================================
     Package                         Arch                Version                                 Repository            Size
    ========================================================================================================================
    Installing:
     java-1.8.0-openjdk              x86_64              1:1.8.0.181-3.b13.el7_5                 updates              250 k
    
    Transaction Summary
    ========================================================================================================================
    Install  1 Package
    
    Total download size: 250 k
    Installed size: 501 k
    Downloading packages:
    java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64.rpm                                              | 250 kB  00:00:00     
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : 1:java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64                                                    1/1 
      Verifying  : 1:java-1.8.0-openjdk-1.8.0.181-3.b13.el7_5.x86_64                                                    1/1 
    
    Installed:
      java-1.8.0-openjdk.x86_64 1:1.8.0.181-3.b13.el7_5                                                                     
    Complete!
    [root@node1 ~]# yum repolist
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirrors.aliyun.com
     * epel: ftp.cuhk.edu.hk
     * extras: mirrors.aliyun.com
     * updates: mirrors.aliyun.com
    repo id                                        repo name                                                                     status
    base/7/x86_64                                  CentOS-7 - Base - mirrors.aliyun.com                                           9,911
    epel/x86_64                                    Extra Packages for Enterprise Linux 7 - x86_64                                12,685
    extras/7/x86_64                                CentOS-7 - Extras - mirrors.aliyun.com                                           402
    updates/7/x86_64                               CentOS-7 - Updates - mirrors.aliyun.com                                        1,336
    repolist: 24,334
    root@node1 ~]# yum clean all
    Loaded plugins: fastestmirror
    Cleaning repos: base epel extras updates
    Cleaning up everything
    Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
    Cleaning up list of fastest mirrors
    • 2、自建yum倉庫,分別為網絡源和本地源

      本地yum源

      [root@node1 ~]# mount -r -t iso9660 /dev/cdrom /media/cdrom
      [root@node1 ~]# ls -l /media/cdrom/
      total 1586
      -rw-rw-r--. 3 root root      14 Sep  5  2017 CentOS_BuildTag
      drwxr-xr-x. 3 root root    2048 Sep  5  2017 EFI
      -rw-rw-r--. 3 root root     227 Aug 30  2017 EULA
      -rw-rw-r--. 3 root root   18009 Dec  9  2015 GPL
      drwxr-xr-x. 3 root root    2048 Sep  6  2017 images
      drwxr-xr-x. 2 root root    2048 Sep  5  2017 isolinux
      drwxr-xr-x. 2 root root    2048 Sep  5  2017 LiveOS
      drwxrwxr-x. 2 root root 1585152 Sep  5  2017 Packages
      drwxrwxr-x. 2 root root    4096 Sep  5  2017 repodata
      -rw-rw-r--. 3 root root    1690 Dec  9  2015 RPM-GPG-KEY-CentOS-7
      -rw-rw-r--. 3 root root    1690 Dec  9  2015 RPM-GPG-KEY-CentOS-Testing-7
      -r--r--r--. 1 root root    2883 Sep  6  2017 TRANS.TBL
      [root@node1 ~]# cd /media/cdrom/repodata/
      [root@node1 repodata]# ls
      0c34273ad0292747ee5e15c047d3e51c67ca59861a446972db45d71abacc7ad7-primary.sqlite.bz2
      38b60f66d52704cffb8696750b2b6552438c1ace283bc2cf22408b0ba0e4cbfa-c7-x86_64-comps.xml
      6cd606547d4f569538d4090e9accdc3c69964de1116b9ab1e0a7864bb1f3ec98-filelists.sqlite.bz2
      9346184be1deb727caf4b1ecf4a7949155da5da74af9b92c172687b290a773df-c7-x86_64-comps.xml.gz
      a0af68e1057f6b03a36894d3a4f267bbe0590327423d0005d95566fb58cd7a29-other.xml.gz
      b686d3a0f337323e656d9387b9a76ce6808b26255fc3a138b1a87d3b1cb95ed5-primary.xml.gz
      c1561546c684bd06b3a499c2babc35c761b37b2fc331677eca12f0c769b1bb37-filelists.xml.gz
      cf0cc856d46b3095106da78256fb28f9d8defea4118d0e75eab07dc53b7d3f0d-other.sqlite.bz2
      repomd.xml
      repomd.xml.asc
      TRANS.TBL
      [root@node1 repodata]# cat /etc/yum.repos.d/
      CentOS-Base.repo           CentOS-Debuginfo.repo.bak  CentOS-Sources.repo.bak    epel-testing.repo
      CentOS-Base.repo.bak       CentOS-fasttrack.repo.bak  CentOS-Vault.repo.bak      
      CentOS-CR.repo.bak         CentOS-Media.repo.bak      epel.repo        
      [root@node1 ~]# cd /etc/yum.repos.d/
      [root@node1 yum.repos.d]# mkdir back
      [root@node1 yum.repos.d]# mv *.repo ./back
      [root@node1 yum.repos.d]# cd back/
      [root@node1 back]# ls
      CentOS-Base.repo  epel.repo  epel-testing.repo
      [root@node1 back]# vim mybase.repo
      [root@node1 back]# cat /etc/yum.repos.d/back/mybase.repo 
      [mybase]
      name=my base repo
      baseurl=file:///media/cdrom/repodata
      gpgcheck=0
      enable=1

      網絡yum 源腳本

    #!/bin/bash
    #CentOS 7 configures the network yum source
    #System environment:CentOS Linux release 7.5.1804 (Core)
    #Exit values:0 is normal,13 has no network or network exception, 222 yum source failed to build
    #Date:2018-8-25
    #Modify time:2018-9-13
    #v1.0
    #by:ZDF
    set -v
    Yum() {
    find ‘/etc/yum.repos.d/‘ -name *.repo -exec mv {} {}‘.bak‘ \;
        $(which wget &> /dev/null)
        if [ $? -eq 0 ];then
            wget -q -t 5 -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
          else
            curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
        fi
    
        if [ $? -eq 0 ];then
            yum clean all && yum list all && yum repolist
        fi
    
        if [ $? -eq 0 ];then
            echo -e ‘\033[32mCentOS network yum source has been configured successfully and you can now use yum to install or uninsta programs.\033[0m‘
            echo -e ‘\033[1;34mWhether to install EPEL source?\t(Y|N)\033[m‘ ; read Epel
            if [[ "$Epel" == Y || "$Epel" == y ]];then
                yum -y install epel-release
                [ "$?" -eq 0 ] && echo -e ‘\033[32mCentOS EPEL source construction is completed \033[0m‘
            fi
          else
            echo -e ‘\033[47;31;1mCentOS network yum source configuration failed, please confirm!\033[0m‘ && exit 222
        fi
    exit "$?"
    }
    
    ping -c4 www.baidu.com
    if [ $? -ne 0 ];then
        echo -e ‘\033[31;1mError, please check the network.\033[0m‘ ; exit 13
      else
        if [ -f ./yum.log ];then
            echo >> ./yum.log
            echo -e ‘\033[1;31m===== Network YUM source installation log information =====\033[m‘ | tee -a yum.log
            Yum | tee -a yum.log
          else
           echo -e ‘\033[1;31m===== New network yum source =====\033[m‘ | tee yum.log
           Yum | tee -a yum.log 
        fi
    fi
    #-_-#**END**-_-~
    • 3、簡述at和crontab命令,制定 每周三淩晨三、五點10分執行某個腳本,輸出當前時間,時間格式為 2017-12-28 10:00:00

      at和crontab都是計劃任務執行命令,未來的某個時間點執行一次某任務用at,而周期性在某個時間點執行任務用crontab

    at命令:
    at [OPTION]... TIME

            TIME:
                HH:MM [YYYY-mm-dd]
                noon,midnight, teatime
                tomorrow
                now+#
                    UNIT:minutes, hours, days, OR weeks
    
            at的作業有隊列,用單個字母表示,默認都使用a隊列;
    
            常用選項:
                -l:查看作業隊列,相當於atq
                -f /PATH/FROM/SOMEFILE:從指定文件中讀取作業任務,而不用再交互式輸入;
                -d:刪除指定的作業,相當於atrm;
                -c:查看指定作業的具體內容;
                -q QUEUE:指明隊列;
    
            註意:作業執行結果是以郵件發送給提交作業的用戶;

    示例:

    [root@node1 ~]# at now+2min
    at> cat /etc/fstab
    at> cat /etc/issue
    at> <EOT>
    job 3 at Sun Sep 16 01:46:00 2018
    Can‘t open /var/run/atd.pid to signal atd. No atd running?
    [root@node1 ~]# at -l
    1   Sun Sep 16 01:45:00 2018 a root
    3   Sun Sep 16 01:46:00 2018 a root

    crontab命令:
    crontab [-u user] [-l | -r | -e] [-i]
    -e:編輯任務;
    -l:列出所有任務;
    -r:移除所有任務;即刪除/var/spool/cron/USERNAME文件;
    -i:在使用-r選項移除所有任務時提示用戶確認;
    -u user:root用戶可為指定用戶管理cron任務;

    用戶cron的配置格式:/var/spool/cron/USERNAME
    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
            # |  |  |  |  |
            # *  *  *  *  *   command to be executed    

    註意:
    (1) 每行定義一個cron任務,共6個字段;
    (2) 此處的環境變量不同於用戶登錄後獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
    (3) 郵件發送給當前用戶;
    註意:運行結果以郵件通知給當前用戶;如果拒絕接收郵件:
    (1) COMMAND > /dev/null
    (2) COMMAND &> /dev/null

    註意:定義COMMAND時,如果命令需要用到%,需要對其轉義;但放置於單引號中的%不用轉義亦可;
    示例:每周三淩晨三、五點10分執行某個腳本,輸出當前時間,時間格式為 2017-12-28 10:00:00

    [root@node1 ~]# date +%F-%T
    2018-09-16-03:50:36
    [root@node1 ~]# crontab -e
    no crontab for root - using an empty one
    crontab: installing new crontab
    [root@node1 ~]# vim date.sh
    [root@node1 ~]# cat date.sh 
    #!/bin/bash
    #
    date +%F-%T 
    [root@node1 ~]# bash -x date.sh 
    + date +%F-%T
    2018-09-16-03:56:41
    [root@node1 ~]# chmod +x date.sh 
    [root@node1 ~]# ls -l date.sh 
    -rwxr-xr-x. 1 root root 26 Sep 16 03:54 date.sh
    [root@node1 ~]# crontab -l
    10 3,5 * * 3 ./date.sh
    • 4、簡述sed常用操作命令,並舉例

      sed命令:

      文本處理三劍客:
      grep, egrep, fgrep:文本過濾器
      sed:Stream EDitor,流編輯器,行
      awk:文本格式化工具,報告生成器

      sed [OPTION]... ‘script‘ [input-file] ...
      script:
      地址定界編輯命令

      常用選項:
          -n:不輸出模式空間中的內容至屏幕;
          -e script, --expression=script:多點編輯;
          -f  /PATH/TO/SED_SCRIPT_FILE
              每行一個編輯命令;
          -r, --regexp-extended:支持使用擴展正則表達式;
          -i[SUFFIX], --in-place[=SUFFIX]:直接編輯原文件 ;
      
          ~]# sed  -e  ‘s@^#[[:space:]]*@@‘   -e  ‘/^UUID/d‘  /etc/fstab
      
      地址定界:
          (1) 空地址:對全文進行處理;
          (2) 單地址:
              #:指定行;
              /pattern/:被此模式所匹配到的每一行;
          (3) 地址範圍
              #,#:
              #,+#:
              #,/pat1/
              /pat1/,/pat2/
              $:最後一行;
          (4) 步進:~
              1~2:所有奇數行
              2~2:所有偶數行
      
      編輯命令:
          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:顯示替換成功的行;

      示例:
      顯示偶數行;

      [root@node1 ~]# sed  -n  ‘n;p‘ /etc/fstab 
      #
      # Created by anaconda on Wed Sep  5 21:24:35 2018
      # Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
      #
      UUID=38a2a3be-952e-4541-814b-77553d4e9204 /boot                   xfs     defaults        0 0

      逆序顯示文件的內容;

      [root@node1 ~]# sed  -n  ‘n;p‘ /etc/fstab 
      #
      # Created by anaconda on Wed Sep  5 21:24:35 2018
      # Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
      #
      UUID=38a2a3be-952e-4541-814b-77553d4e9204 /boot                   xfs     defaults        0 0
      [root@node1 ~]# sed  ‘1!G;h;$!d‘ /etc/fstab
      /dev/mapper/centos-swap swap                    swap    defaults        0 0
      UUID=38a2a3be-952e-4541-814b-77553d4e9204 /boot                   xfs     defaults        0 0
      /dev/mapper/centos-root /                       xfs     defaults        0 0
      #
      # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
      # Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
      #
      # Created by anaconda on Wed Sep  5 21:24:35 2018
      # /etc/fstab
      #

      取出文件後兩行;

      [root@node1 ~]# sed  ‘$!N;$!D‘ /etc/fstab
      UUID=38a2a3be-952e-4541-814b-77553d4e9204 /boot                   xfs     defaults        0 0
      /dev/mapper/centos-swap swap                    swap    defaults        0 0

    刪除原有的所有空白行,而後為所有的非空白行後添加一個空白行;

    
    [root@node1 ~]# sed ‘/^$/d;G‘ /etc/fstab
    #
    
    # /etc/fstab
    
    # Created by anaconda on Wed Sep  5 21:24:35 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
    
    #
    
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    
    UUID=38a2a3be-952e-4541-814b-77553d4e9204 /boot                   xfs     defaults        0 0
    
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    
    顯示奇數行;
    
    [root@node1 ~]# sed  ‘n;d‘ /etc/fstab
    # /etc/fstab
    #
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    /dev/mapper/centos-root /                       xfs     defaults        0 0
    /dev/mapper/centos-swap swap                    swap    defaults        0 0
    

    Linux 程序包管理及sed基礎