Linux操做系統基

閱讀目錄:html

  第一節:操做系統的基礎知識以及LInux系統的入門前端

  第二節:文件管理和重定向java

  第三節:用戶組權限的詳細介紹node

  第四節:文件權限管理python

  第五節:文本處理linux

  第六節:軟件管理nginx

 

 

內容:c++

第一節:操做系統的基礎知識以及LInux系統的入門git

  一、什麼是計算機操做系統正則表達式

    操做系統是一個用來協調、管理和控制計算機硬件和軟件的資源的系統程序,它位於硬件和應用程序之間。

  二、什麼是系統內核

    操做系統內核是一個管理和控制程序,負責管理計算機的全部的物理資源,其中包括:文件系統、內存管理、設備管理、進程管理、網絡管理。

  三、操做系統分類

    服務器OS:RHEL、CentOS、Windows server

    桌面OS:Windows、MAC OS 、Fedora

    移動設備OS:Android,IOS,(YunOS?)

  四、操做系統流派

    目前經常使用的大多數操做系統都源於Unix,或者借鑑了最初的Unix,如:Windows,Mac OS x,Linux,歷史緣由都與Unix有必定的關係。

  五、安裝、配置Linux

    因爲測試方便,使用虛擬機來安裝Linux作說明。通常使用VMware WorkStation或者virtualBox 這兩種虛擬軟件。我使用的是前者。

    ① 下載安裝VMware,具體步驟能夠問某度。

    ② 下載合適版本的Linux發行版鏡像文件,我使用的是CentOS 6.9。第一次使用,建議安裝everything版本

      鏡像文件經常使用的網站:

        https://wiki.centos.org/Download

        https://mirror.aliyun.com

        https://mirror.sohu.com

        https://mirror.163.com

    ③ 開始新建虛擬機,根據本身的筆記本硬件狀況,選擇合理的參數,注意:選擇稍後安裝鏡像。網絡三種模式:橋接模式,NAT模式,僅主機模式,根據本身的需求選擇合適的模式。注意要區分三者的含義:(簡短說一下)-----------參考:https://www.cnblogs.com/linjiaxin/p/6476480.html

      ——橋接模式:wmnet0做爲虛擬交換機,虛擬機經過交換機連接外網,宿主機跟虛擬機在同一個網段

      ——NAT模式:即轉換模式,宿主機網卡跟虛擬機NAT設備連在一塊兒,NAT設備和DHCP服務器連在WMnet8虛擬交換機上。

      ——僅主機模式:Host-Only模式其實就是NAT模式去除了虛擬NAT設備,而後使用VMware Network Adapter VMnet1虛擬網卡鏈接VMnet1虛擬交換機來與虛擬機通訊的,Host-Only模式將虛擬機與外網隔開,使得虛擬機成爲一個獨立的系統,只與主機相互通信。

    ④ 安裝過程當中的各類選項的含義:

      a) install or upgrade an existing system:安裝或升級現有的系統
      b) install system witn basic video driver:安裝系統和基本的視頻驅動程序
      c) rescue installed system:救援安裝系統
      d) boot from local drive:從本地硬盤啓動

    ⑤ 其餘的步驟本身多摸索一下。

  六、Unix認識

    ① 什麼是Unix

      Unix就是一個操做系統

    ② Unix的發展史

       在Unix的發展路上,有不少故事,能夠查看一些書籍瞭解。

  七、不一樣風格的語言的簡單介紹,後期在Python中會有詳細說明

      彙編語言,最接近底層的語言,可是沒法移植。

      C語言(Rust語言),系統級別的開發語言,移植性仍是差,須要在某平臺編譯後,才能在相應的平臺運行。

      應用編程,Python的特色是 write once , run anywhere,代碼簡介,可是運行慢。基於VM虛擬機運行。 

  八、開發接口標準

      ABI:Application Binary Interface 描述了應用程序和OS之間的底層的接口,容許編譯好的代碼在使用兼容ABI的提醒中無需改動就能運行

      API:Application Programming interface 定義了源代碼和庫之間中接口,所以一樣的源代碼能夠在支持這個api的任何系統中編譯 

  九、硬件平臺:

      cpu平臺主要有:X86,ARM,PowerPC(蘋果),Power(IBM),UltraSparc(sun),Alpha(hp)

  十、Linux並非Unix

    Linux是類Unix,是參考了Unix的風格而造成的另外一種操做系統。而所謂的Linux是指kernel,平時所說的Linux操做系統是指發行版,是Linux內核+GNU提供的應用程序

  十一、常見的發行版

    ReadHat、Debian、SUSE

    ReadHat ---------> CentOS

    Debain    ---------> Ubuntu

    SUSE      ---------> openSUSE 

      做爲碼農,經常使用的系統有:ArchLinux --------->支持程序的滾動更。若是爲了裝X,可使用Mac OS X。

      Linux分支參考網站:http://futurist.se/gldt/

  十二、關於版本號

    內核版本號:3.10.0-693.el7 

    

       注:一、版本號的第二位數字,能夠肯定Linux內核版本的類型

          開發版本:第二位數字是奇數 3.9.1......

          穩定版本:第二位數字是偶數 3.10.0......

         二、發行版本號版本:與內核版本號不一樣 內核版本號:4.17.9

   1三、開源協議

       開源 open source ,軟件和源代碼提供給全部人自由分發軟件和源代碼,可以修改和建立衍生做品

      軟件分類:

          商業版,共享版,自由版

      ① 常見的開源協議

          GPLv二、GPLv三、LGPL:通用公共許可copyleft------->GNU提供

          Apache,BSD,MIT。。。

      ② 開源協議

         注:協議很重要,一樣的應用程序在不一樣的發行版上可能使用狀況不經相同。

 

   1四、Linux的哲學思想

      ① 一切皆文件,包括硬件

      ② 小型,單一用途的程序(功能儘可能單一)--------> 目前是一個程序集合多個單一功能的程序完成複雜的功能

      ③ 連接程序,完成複雜的任務,須要用戶竄起來

      ④ 避免使人困惑的用戶界面

      ⑤ 配置數據存儲在文件中-----爲了通用

  1五、圖形界面分類

      GUI:graphical user interface 圖形化界面接口  

        桌面系統的發行方式:

            Gnome:C開發的

            KDE:C++開發的

            XFCE:用於嵌入式較多(輕量級桌面)

       CLI:command line interfacce 命令行接口

            sh > bsh

            csh,bash,zsh

            shell -----特質命令行shell

  1六、什麼是shell

     shell是LInux的用戶界面,提供了一種用戶能夠和內核交互操做的一種接口,接受用戶輸入的命令並把它送入內核去執行。

      也成爲Linux的命令解釋器

      查看當前shell:echo $SHELL

      顯示當前系統的全部shell  :  cat /etc/shells

   1七、什麼是程序

      程序 = 指令 + 數據

      程序 = 算法 + 數據結構

          以算法爲中心,數據結構服務於算法,這就是過程是編程

          以數據爲中心,算法服務於數據,這就是對象式編程

   1八、終端類型以及用戶登陸

      物理終端 /dev/console

       虛擬終端 /dev/tty# [1-6] Ctrl+ Alt +F[1-6]

      僞終端     /dev/pts/#    (ssh遠程鏈接,圖形界面開啓的終端)

       圖形終端 /dev/tty7

      串行終端 /dev/ttyS#

      查看當前設備的終端設備命令:tty

  1九、命令分類、執行命令

      命令分:內部命令、外部命令

      內部命令:shell自帶的命令

         help 回車:查看全部的內部命令列表

         enable -n cmd :禁用某個命令

         enable -n:查看被 禁用的命令

         enable cmd :啓用某個命令

      外部命令:文件系統路徑下有對應的可執行文件

         which cmd :查看某個命令的位置     或者     whereis

      注:用type cmd 查看命令是不是內部命令

 

      執行命令回車便可,若是同時執行多個命令,使用分號隔開,如:ls /etc;date

          一個命令可使用\ 分多行

          取消和結束命令執行:Ctrl+c  Ctrl+d

  20、命令別名alias

    alias cmd= ‘CMD’

     unalias cmd:取消別名

    別名的配置文件:

      ~/.bashrc : 僅對當前用戶

      /etc/bashrc :對全部用戶有效

   2一、時間和日期

     Linux的兩種時鐘:

        系統時鐘:由Linux內核經過CPU的工做頻率進行的

        硬件時鐘:主板

      相關命令:date,hwclock

         hwclock :硬件時鐘

        hwclock -s :硬件時鐘同步爲系統時鐘

            -w :系統時鐘同步爲硬件時鐘

         date:系統時間         

          +%a : 周幾的縮寫
          +%A : 周幾的全寫
          +%b :幾月的縮寫 +%h
          +%B :幾月的全寫
          +%c :本地日期時間
          +%C :2018的20
          +%d :某月的幾號 %e
          +%D :日期 07/25/18
          +%F : 日期 2018-07-25
          +%g :2018的18
          +%H :幾點-24小時制 00-23
          +%I :幾點-12小時制 00-12
          +%j :一年的第幾天
          +%k : 0-23
          +%l : 0-12
          +%m : 月
          +%M :分鐘
          +%T : 08:42:11
          +%u : 一週的第幾天 Monday是第一天 1-7
          +%w : 一週的第幾天 SUNday是第一天 0-6
          +%U :一年的第幾周
          +%y : 2018 的18
          +%Y :年

          設置時間:date [-u] [MMDDhhmm][[cc]YY][.SS]]

 

      cal:日曆 

        cal -y 顯示當年所有日曆

 

   2二、關機、重啓

    關機:halt。poweroff , init0(centos6)

    重啓:reboot ,init6

        -f:強制

        -p:切斷電源

    關機或重啓:shutdown

        -r:重啓

        -h:halt

        -c:取消

            now 馬上

            +m:幾分鐘後

  2三、Linux用戶分類

    管理員 uid 0

    普通用戶:

        系統用戶: 1-499 1-999

        登陸用戶: 500+   1000+

      注:root用戶命令行提示是 #,普通用戶命令行提示符是 $.

  2四、用戶登陸:

    whoami,who,w

[root@localhost ~]$ w
     7:26:39 up  1:10,  4 users,  load average: 0.05, 0.05, 0.01
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    root     tty1     :0               16:18    1:10m  4.05s  4.05s /usr/bin/Xorg :
    root     pts/0    :0.0             16:18    1:07m  0.02s  0.02s /bin/bash
    root     pts/1    192.168.112.1    17:23    2:43   0.00s  0.00s -bash
    root     pts/3    192.168.112.1    08:58    0.00s  0.64s  0.17s w
w使用

 

  2五、screen使用

    screen -S name:建立一個名字爲name的新會話
    screen -ls:顯示全部的會話
    screen -r name: 恢復name會話
    Ctrl + a.d 剝離當前會話 也就是關掉當前的會話

  2六、echo 回顯

    -n:不加換行符    

        [root@localhost ~]$ echo -n 'jak'
        jak[root@localhost ~]$

    -e:顯示控制符 如 :\t

        [root@localhost ~]$ echo -n -e 'jak\tda\b'
        jak d[root@localhost ~]$

        常見的控制符:

          \a ::發出警告聲

            \b :退格

          \c: 最後不加換行符

          \n :換行且光標移動至行首

          \r  :回車 ,即光標移動行首,但不換行

          \t  : 製表符tab

          \\ :插入\

   2七、括號擴展

      echo hi{1,2}

      echo {1,2}{3,4}
      cd ~username :切換到用戶家目錄
      echo {1..20} {a..z}

  2八、命令替換

      ls -l $(cd /etc/sysconfig/) :$(cd /etc/sysconfig/) 把獲得的結果傳遞給另外一個命令

      反引號:命令替換 :
      echo hostname ----- echo `hostname`


      雙引號:弱引用:
      [root@localhost ~]$ echo "$PS1"
      \033[30;33m[\u@\h \W]$ \033[0m

      單引號:強引用:是啥就是啥不會替換
      [root@localhost ~]$ echo '$PS1'
      $PS1

   2九、Linux的兩棵樹

      文件樹-/,進程樹-init

          FHS:文件系統層級結構標準

      一切皆文件:
      登陸進shell,每時每刻都處於某個路徑下:
      當前目錄:current dir
      工做目錄:working dir
      相對路徑:
      絕對路徑:
      程序文件
        /bin /sbin /usr/bin, /usr/sbin ,/usr/local/bin,/usr/local/sbin

    Linux的進程管理:    

      Linux啓動後,內核建立進程,對進程進行管理,可是所有由內核管理會致使內核壓力過大,因此內核建立一個init進程,由此進程管理後續生成的進程。

        在LInux中不一樣的版本中,init不一樣(這裏特指CentOS),centos5 sysv init,centos6 upstart,centos7 systemd。

      什麼是殭屍進程:zombie

        在Linux中,模擬的是白髮人送黑髮人,即子進程是黑髮人,子進程結束後,父進程才能結束,不然,父進程結束了,子進程沒有結束,可是子進程處於殭屍狀態。

 

  30、命令歷史

      history 默認保存1000條 $HISTSIZE ------> printenv

        HISTCONTROL =
            ignoredups # 忽略相鄰重複的
            ignorespace # 忽略以空白開頭的命令
            ignoreboth # 二者都忽略

            會保存在用戶家目錄下的.bash_history

 

            history:
              -c:清空命令歷史
              -d offset:刪除歷史中指定的第offset個命令
              n :顯示最近的n條歷史
              -a:追加本次回話新執行的命令到歷史文件中
              -r:將.bash_history顯示到屏幕上
              -w:保存歷史列表到指定文件中

              -n :讀歷史文件中沒有讀過的行到歷史列表中

      重複前一個命令:有4中方法

        使用向上鍵

        使用!!

        使用 !-1

        Ctrl +p 回車執行

      !:0 :執行前一條命令(去除參數)

      !n  :執行對應序號的命令

      !-n : 執行倒數第n條命令

      從新調用前一個命令中的最後一個參數:

        !$  或者  Alt +。  或者 ESc放開在按。

 

  3一、獲取幫助

      內部命令: help history
      外部命令:
        --help -h 獲取幫助
        man and info ------- /usr/share/man
        程序自帶的幫助信息

        whatis:顯示命令的簡短描述,使用數據庫,剛裝不能當即使用,makewhatis|mandb製做數據庫
            whatis cat


      --help:
        []:可選項
        <>或CAPS:表示變化的數據
        ...表示一個列表
        x|y|z:或者的關係
        -abc: -a -b -c
        {}:分組

      man:手冊頁放在/usr/share/man
      man頁面分組爲不一樣的章節
      man命令的配置文件:/etc/man.config | man_db.conf
          MANPATH /PATH/TO/SOMEWHERE: 指明man文件搜索位置
          man -M /PATH/TO/SOMEWHERE COMMAND: 到指定位置下搜索COMMAND命令的手冊頁並顯示

      man章節:
        一、用戶命令
        二、系統調用
        三、C庫調用
        四、設備文件以及特殊文件
        五、配置文件格式
        六、遊戲
        七、雜項
          · 八、管理類命令
        九、linux內核API

  
      man幫助段落說明:
        NAME:名稱及簡要說明
        SYNOPSIS:用法格式
        DESCRIPTION:詳細描述
        OPTIONS:選項說明
        EXAMPLES:實例

        查看手冊:man 1 cat
        列出全部幫助:man -a cat
        搜索man手冊:man -k cat

      翻看man手冊技巧:
        空格:向下翻屏
        b:向上翻屏
        d:向下翻半屏
        u:向上翻半屏
        #:定位到第幾行
        enter:向下一行
        y:向上一行
        1G:回到頂部
        G:到尾部
        /keyword :查找關鍵字,使用N/n翻 ,向後搜
        ?keyword:查找關鍵字,使用N/n翻 ,向前搜

      info:info cat
        方向鍵翻
        tab鍵,移動到下一個連接
        enter:進入選定的連接
        s:文本搜索
        q:退出


    本地幫助文檔:
      /usr/share/doc目錄
      常見文檔:readme,install,changes

      

   注:

    exec bash:exec執行程序,替換當前的進程,能夠經過pstree看出來

    經過在線文檔獲取幫助:第三方應用官方文檔

      http://www.nginx.org
      http://tomcat.apache.org
      http://httpd.apache.org
      http://www.python.org

    經過發行版官方的文檔光盤或網站能夠得到,安裝指南、部署指南、虛擬化指南等,紅帽知識庫和官方在線文檔

      http://kbase.redhat.com
      http://www.redhat.com/docs
      http://access.redhat.com

 第二節:文件管理和重定向

  一、文件系統與目錄結構

    

    ① 文件系統:

      1)在Linux系統中,全部的文件和目錄都被組織成一個單根的倒置樹狀,文件系統從根目錄下開始,用「/」 表示。在Linux中文件名稱是嚴格區分大小寫,以.開頭的文件爲隱藏文件。路徑的分隔是 "/" 。

      注:瞭解兩個特殊的目錄

          一、. 表示當前目錄,即用戶所在的工做目錄。

          二、..表示父目錄,即當前目錄的上一層目錄。

       2)Linux文件系統分層結構遵循FHS(FilesystemHierarchy Standard)即文件系統層級結構標準

          查看FHS文檔:http://www.pathname.com/fhs/

       3)Linux中每個分區都是一個文件系統。

       4)根,整個系統啓動時加載文件的惟一入口。

       5) 文件有兩類數據:

              元數據:metadata

              數據:data

    ② 目錄結構:

      1)文件命名規則:

      • 文件名最長255個字節
      • 包括路徑在內的文件名稱最長4095個字節
      • 顏色表示(ANSI規定):藍色(目錄)、綠色(可執行文件)、紅色(壓縮文件)、淺藍色(連接文件)、灰色(其餘文件)、紫色(套接字) 
      • 文件名的命名可使用除了  /  之外 的任何字符,可是通常不推薦 使用特殊字符。
      • 標準Linux文件系統(ext4,xfs),文件名稱嚴格區分大小寫。        

 

    ③ 文件系統結構中重要的目錄:

      /boot :引導文件存放的目錄,內核文件(vmlinuz)、引導加載器(BootLoader,grub)都存放與此。

      /bin   : 供全部用戶使用的基本命令,不能關聯至獨立分區,OS啓動即會用到的程序。不能做爲其餘分區的訪問入口,只能在根分區上。

      /sbin :管理類的基本命令,不能關聯至獨立分區,OS啓動就會用到的程序。

      /lib    :啓動時程序依賴的基本共享庫文件以及內核模塊文件(/lib/modules)。

      /lib64 :專用於x86_64系統上的輔助共享文件庫存放位置

      /etc    :配置文件

      /home/USERNAME :普通用戶的家目錄

      /root   : 管理員的家目錄

        /media :便攜式設備的掛載點

      /mnt :臨時文件系統掛載點

      /dev :設備文件及特殊文件的存儲位置

          b:block device -----隨機訪問(塊設備)

          c:character device ------線性訪問 (字符設備)

      /opt :第三方用用程序的安裝位置

      /srv :系統上運行的服務用到的數據

      /tmp :臨時文件存儲位置,若是文件30天沒動,會自動刪除。

      /usr :universal shared,read-only data----->能夠單獨分區的(也就是說能夠做爲某個分區的入口)

          bin:保證系統擁有完整功能而提供的應用程序,也就是說啓動操做系統後,啓動一些服務

          lib64:只存在於64位的系統

          lnclude:c程序的頭文件

          share :結構化獨立的數據,如:doc,man等

          local :第三方應用程序的安裝位置(bin ,sbin ,lib,lb64,etc,share)

      /var :variable data files

          cache:應用程序的緩存數據目錄

          lib:應用程序狀態信息數據

          local:專用於爲/usr/local下的應用程序存儲可變數據

          lock:鎖文件

          log:日誌目錄及文件

          opt:專用於爲/opt下的應用程序存儲可變數據

          run:運行中的進程相關數據,一般用於存儲進程pid文件

          spool:應用程序數據池

          tmp:保存系統兩次重啓之間產生的臨時數據。

          /proc:用於輸出內核與進程信息相關的虛擬文件系統

          /sys :用於輸出當前系統上硬件設備相關新消息虛擬文件系統

          /selinux:security enhanced linux,selinux相關的安全策略等信息的存儲位置。

             selinux對於初學linux的比較難,因此建議在平時實驗中關掉selinux

             getenforce:獲取selinux的狀態:

                  enforcing:開啓的

                  permissive:許可的,會有警告,可是不影響操做

                  disabled:禁止的

              setenforce:設置selinux的狀態

                  0:許可,1:開啓的,或者直接修改配置文件,以便之後再登陸再也不修改 /etc/selinux/config

      

      總結: 

        二進制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
        庫文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
        配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
        幫助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

  二、Linux下的文件類型

    -:普通文件

    d:目錄文件

    l :連接文件

    c:字符文件

    b:塊文件

    s:套接字文件

    p:管道文件  

        

      如圖:服務器端、客戶端都是本身,那麼服務器進程和客戶進程相互通訊就使用套接字文件。省去了數據報文封裝等。

    

  三、顯示當前工做目錄

    • 每一個shell和系統進程都有一個當前的工做目錄
    • CWD:current work directory
    • 顯示當前shell CWD的絕對路勁

        pwd:打印工做路徑

    :/var/www/a.txt 

        a.txt :基名

        /var/www/:目錄名

  四、更改目錄

    cd :能夠絕對路徑,cd  /home/log      能夠相對路徑 cd home/log

      cd .. :切換到父目錄

      cd -  :當前目錄和前一個目錄相互切換

        -P:指向符號連接的目標目錄

        -L:指向符號連接的目錄

      相關環境變量:printenv能夠查看到

        PWD:當前目錄路徑

        OLDPWD:上一次目錄路徑

[root@localhost tmp]# ls -al
total 80
drwxrwxrwt. 17 root  root  4096 Jul 28 05:22 .
dr-xr-xr-x. 25 root  root  4096 Jul 28 00:36 ..
drwxr-xr-x.  2 root  tom   4096 Jul 28 05:21 a
drwxr-xr-x.  2 root  tom   4096 Jul 28 05:12 b
drwxr-xr-x.  2 root  root  4096 Jul 28 02:53 bin
-rw-r--r--.  1 root  root   183 Jul 28 03:18 e
drwx------.  2 root  root  4096 Jul 28 01:46 .esd-0
drwx------.  2 jack3 users 4096 Jul 28 01:51 .esd-506
drwx------.  2 jack  jack  4096 Jul 28 01:51 .esd-507
lrwxrwxrwx.  1 root  tom      1 Jul 28 05:22 f -> a
drwxrwxrwt.  2 root  root  4096 Jul 28 01:51 .ICE-unix
drwxr-xr-x.  2 root  root  4096 Jul 28 03:02 lo3od
-rw-r--r--.  1 root  root     0 Jul 28 03:01 lsada55ad5sda5sda5dsa
drwxr-xr-x.  5 root  root  4096 Jul 28 03:13 m
-rw-r--r--.  1 root  tom   1838 Jul 28 05:09 passwd
lrwxrwxrwx.  1 root  tom      6 Jul 28 05:09 passwd.1 -> passwd
drwx------.  2 jack3 users 4096 Jul 28 02:54 pulse-VGs41aKnJWMa
drwxr-xr-x.  2 root  root  4096 Jul 28 02:45 s
drwxr-xr-x.  2 root  root  4096 Jul 28 02:53 sbin
drwxr-xr-x.  4 root  root  4096 Jul 28 02:53 usr
drwxr-xr-x.  4 root  root  4096 Jul 28 02:52 x
-r--r--r--.  1 root  root    11 Jul 28 01:51 .X0-lock
drwxrwxrwt.  2 root  root  4096 Jul 28 01:51 .X11-unix
[root@localhost tmp]# cd -P f
[root@localhost a]# cd ..
[root@localhost tmp]# cd -L f
[root@localhost f]# pwd
/tmp/f
[root@localhost f]# 
-P -L

 

  五、列出目錄內容

    列出當前目錄的內容或指定目錄

    用法: ls  [options] [fies or dir]

      ls -a :顯示全部文件包括隱藏文件

      ls  -A:顯示全部文件,除了.   和 ..

      ls -l :顯示詳細信息,文件元數據等

      ls -R:遞歸顯示目錄下的內容

      ls -ld: 目錄和符號連接信息

      ls -1 :文件分行顯示

      ls -S : 按從小到大排序

      ls -t  :按照mtime排序

      ls -u :配合-t選項,顯示並按atime重新到舊排序

      ls -X :按照文件後綴排序 

      ls -i :顯示inode號  

  六、查看文件狀態

    stat:

[root@localhost etc]$ stat /etc/passwd 
File: `/etc/passwd'
Size: 1611            Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 926217      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-07-26 18:20:01.950396837 +0800
Modify: 2018-07-25 18:14:43.467998719 +0800
Change: 2018-07-25 18:14:43.468998720 +0800
View Code

 

    文件包含兩種數據:元數據metadata,數據data 

    三個時間戳:

      access time:訪問時間,atime,讀取文件內容

      modify time:修改時間,mtime,改變文件內容(數據)

      change time:改變時間,ctime,元數據發生改變

 

  七、文件通配符

    經常使用文件通配符:

      *:匹配任意個字符

      ?:匹配有且只有一個

      ~:當前用戶的家目錄

      ~mage:用戶mage的家目錄

      ~+:當前工做目錄

      ~-:前一個工做目錄

      [0-9]:匹配數字集合,其中的一個

      [a-z],[A-Z]:匹配字母集合,不區分大小寫

      [waf]:匹配列表中的任何一個字符

      [^wad]:匹配集合外的任何一個字符 

    預約義的字符類:用 man 7 glob查看

      [:digit:]:任意數字 0-9

      [:lower:] :任意小寫字母

      [:upper:] :任意大寫字母

      [:alpha:] :任意字母

      [:alnum:]:任意數字和字母

      [:blank:]:水平空白

      [:punct:] :標點符號

      [:space:] : 水平或垂直空白字符

      [:print:] :可打印字符

      [:cntrl:] :控制(非打印字符)

      [:graph:] :圖形字符

      [:xdigit:] : 十六進制字符

    :命令行開頭使用 \ 表示使用命令自己,忽略別名

  八、建立空文件和刷新時間

    touch命令:

      touch [options] FILE

          -a :僅改變atime和ctime

          -m :僅改變mtime和ctime

          -t [[CC]YY]MMDDhhmm[.ss]:指定atime和mtine

          -c :若是文件不存在,則不予以建立(默認是建立的)

  九、複製文件和目錄--cp

    複製CP:

    

 

      cp經常使用選項:複製就是建立新文件!

        -i :覆蓋當前提示

        -r,-R: 遞歸複製目錄及內部的全部的內容

        -d:不復制源文件,只複製連接名,只針對軟鏈接(符號連接)

lrwxrwxrwx. 1 root root    6 Jul 27 05:37 /etc/passwd.2 -> passwd


 cp -d /etc/passwd.2 /tmp/


lrwxrwxrwx.  1 root root    6 Jul 27 16:32 passwd.2 -> passwd
------password處於閃爍狀態
-d

 

         -a:此選項如同:-drp,經常使用於目錄複製

        --preserve[=ATTR_LIST] :屬性列表,使複製的內容保持原有的某些屬性

            mode:權限

            ownership:屬主屬組

            timestamp:時間

            link:連接

            xattr:擴展屬性

            context:保持selinux安全上下文

            all:全部屬性

        -p:等同於--preserve=mode,ownership,timestamp

        -v:詳細信息

        -f:強制複製,不須要問是否覆蓋等。

        -u:只複製源比目標更新文件或目標不存在的文件

        --backup=numbered 目標存在,覆蓋先前備份加數字後綴

[root@localhost tmp]$ cp --backup=numbered /etc/passwd ./
cp: overwrite `./passwd'? y
[root@localhost tmp]$ ls
fonts        orbit-gdm   pulse-Itk8L8wAIJOk  virtual-root.7vnhSk  virtual-root.N0565Z
gconfd-gdm   passwd      pulse-Uu1TjyAHWxiC  virtual-root.AxT2s0  virtual-root.wVSgSR
gconfd-root  passwd.~1~  shadow              virtual-root.iV4aSv  yum.log
--backup=numbered

 

        

          cp是作了別名的 cp = ‘cp -i’,若是讓以原命令執行,在開頭加一個 \

          cp -t DST RUS :-t選項,使目標位置放到前面

  十、移動和重命名文件

      ① 什麼是移動:

        移動,在同一個分區移動速度很快,可是跨分區就很慢,由於,在同一個分區的時候,只是修改了路徑而已,其餘的都不變,而跨分區,須要建立文件,同時移動數據內容,因此很慢,取決於本身的io吞吐能力。

      ② 經常使用選項 :相似於cp,可是不一樣  -r  選項

        mv [option] [-T] source   dest

        mv [option]    dest   source 

         mv [option]  -t dirctory  source 

           -i :交互式

           -f  :強制

        :在同一個目錄下移動,就是重命名。不然就是真正的移動。

  十一、刪除和重命名:文件

    rm [option]  FILE

    經常使用選項:

      -i:交互式

      -f:強制刪除

      -r:遞歸刪除

      --no-preserve-root :do not treat ‘/’ specially    

   十二、目錄操做經常使用命令

    tree 顯示目錄樹

      -d:只顯示目錄 

      -L level :指定顯示的層級數目

      -P pattern :只顯示由指定的pattern匹配到的路徑

    mkdir:建立目錄

      -p :存在不報錯,且可自動建立所需的各目錄

      -v:詳細信息

      -m mode:建立目錄是直接指定權限

    rmdir:刪除 ----空----目錄

       -p:遞歸刪除父空目錄

      -v

    rm -r :遞歸刪除目錄樹(刪除非空)

    :生成中,使用mv 而不用rm     

 

   1三、關於索引節點的介紹

    ①:什麼是inode

    inode(index node):表中包含文件全部文件列表。,一個節點(索引節點)是在一個表項,包括有關文件的信息(元數據),包括:

      文件類型,權限,UID,GID,連接數(指向這個文件名路徑名稱的個數),該文件的大小和不一樣的時間戳,指向磁盤上文件的數據塊指針,有關文件的其餘數據。

    ②:inode表結構:

         磁盤被文件系統分紅數據區和元數據區:

            元數據(inode保存元數據):除了文件名,由於文件名在目錄上。以下圖:如何查找一個數據

            根是目錄,對一個Inode號,在數據區找到對應得數據塊,在數據塊中又有log對應得Inode號,在找到log的數據塊,一步一步最後找到messages的數據內容

 ,   ③:文件操做命令與inode的關係:

      • cp與inode:分配一個空閒的inode號,在inode表中生成新條目在目錄中建立一個目錄項,將名稱與inode編號關聯寶貝數據生成新的文件
      • rm與inode:連接數遞減,從而釋放的inode號能夠被重用,吧數據塊放在空閒列表中,刪除目錄項,數據實際上不會被立刻刪除,但當另外一個文件使用數據塊時將被覆蓋。(bit map、inode map標記爲0)
      • mv與inode:若是目標和源在相同的文件系統,用心的文件名建立對應的行的目錄項,刪除就得目錄項對應的舊的文件名,不影響inode表(除了時間戳)或磁盤上的數據位置:沒有 數據被移動。若是不在同一個文件系統中,mv至關於cp和rm。

        :ext4 對單個文件的大小有限制,而xfs 對其沒有限制。btrfs還在試驗中!

 

  1四、硬連接和軟連接

      ① 硬連接特色:

      • 建立硬連接會增長額外的記錄項以應用文件
      • 對應於同一文件系統上的一個物理文件
      • 每一個項目引用相同的inode號
      • 建立鏈接數遞增
      • 不能跨越分區
      • 刪除文件時:

           rm命令遞減技術的連接

            文件要存在,至少有一個連接數

            當連接數爲0時,該文件被刪除 

        語法:ln filename [linkname]

      ②軟連接特色(符號連接)

      • 一個符號連接指向一個文件
      • ls -l的顯示連接的名稱和引用的文件
      • 一個符號連接的內容 是它引用文件的文件名稱
      • 能夠對目錄進行!!!!!!!
      • 能夠跨分區
      • 執行的是另外一個文件的路徑,其大小爲指向的路徑字符串的長度,不增長或減小目標文件的inode的一弄計數

        語法:ln -s filename linkname

 

        軟連接(左)、硬連接模擬圖:

        

 

  1五、肯定文件內容,類型

      file [option] filename

        -b :列出文件辨識結果時,不顯示文件名稱

        -f filelist 列出文件filelist中文件名的文件類型  如:a.txt裏有 /etc/passwd  /etc/shadow

        -F :使用指定的分隔符替換輸出文件名後默認的 「:」分隔符

        -L 查看對應軟連接對應文件的文件類型     

[root@localhost tmp]$ file -b passwd.2 
ASCII text
[root@localhost tmp]$ file passwd.2 
passwd.2: ASCII text
[root@localhost tmp]$ file passwd.2 shadow
passwd.2: ASCII text
shadow:   ASCII text
[root@localhost tmp]$ file -F - passwd.2 
passwd.2- ASCII text
[root@localhost tmp]$ file -L shadow.1 
shadow.1: ASCII text
 
file

 

  

  1六、標準輸入和輸出

      打開的文件都有文件描述符:fd--file descriptor

      Linux給程序提供了三種I/O設備:

        標準輸入stdin ----0 默認接受來自鍵盤的輸入 ------ /dev/sdtin

        標準輸出stdout  -----1 默認輸出到終端屏幕 ------ /dev/stdout

        標準錯誤stderr -----2 默認輸出到終端 ------ /dev/stdout

      ① stdout 和 stderr 能夠重定向到某個文件

        支持的操做符:

            > :stdout重定向到文件

            2> :stderr重定向到文件

            &> :把全部輸出重定向到文件

        > :文件內容會被覆蓋

          set -C 禁止將內容覆蓋已有文件,可是可追加

          > | file 強制覆蓋

          set + C 容許覆蓋

        >> 原有內容基礎上,追加內容

        2> :覆蓋重定向錯誤輸出數據流

        2>> : 追加 

        二者各自定向只不一樣位置

          command > /path/to/file1 2> /pah/to/file2

        合併到同一個位置

          &> 覆蓋重定向

            &>>: 追加劇定向

          command >  /path/to/file.out  2>&1 (順序很重要)

          command >>  /path/to/file.out  2>&1

         ():合併多個程序的stdout

           (cal 2007;cal2008)> all.txt

    ②輸入重定向不多用可是也有特殊用法:   

        [root@localhost tmp]$ tr 'a-z' 'A-Z' < /etc/issue
        CENTOS RELEASE 6.9 (FINAL)
        KERNEL \R ON AN \M

        

        

        [root@localhost tmp]$ echo 'ssssssss' > b.txt
        [root@localhost tmp]$ clear
        [root@localhost tmp]$ cat > a.txt < b.txt
        [root@localhost tmp]$ cat a.txt b.txt
        ssssssss
        ssssssss

      

[root@localhost tmp]$ cat > b.txt << EOF
> 2
> 2
> 2
> EOF
[root@localhost tmp]$ cat b.txt 
2
2
2
stdin

 

  

  1七、tr命令

    tr :轉換和刪除字符

      tr [option] [file]

        -c -C:取字符集的補集

        -d :刪除全部屬於第一字符集的字符 

echo 'helo23l2o' | tr -d -c [[:digit:]]


232
View Code

 

        -s :把裏連續重複的字符單獨一個字符表示

echo 'helo23l22o' | tr -s 2

helo23l2o
View Code
echo 'helo23l22o' | tr -s 2

helo23l2o
View Code

 

        -t :將第一個字符集對應字符轉化爲第二個字符集對應的字符

        

  1八、管道

     管道(使用符號 | 表示)用來鏈接命令

      命令1 | 命令2  |  命令3 |。。。

      ls | tr 'a-z' 'A-Z'

      管道中的  -  符號

        將 /home 裏面的文件打包,但打包的數據不是記錄到文件,而是傳送到 stdout,通過管道後,將 tar -cvf - /home 傳送給後面的 tar -xvf - , 後面的這個 - 則是取前一個命令的 stdout, 所以,就不須要使用臨時file了

        tar -cvf  -   /home | tar -xvf -  

[root@localhost tmp]$ echo '/etc/passwd' | file
Usage: file [-bchikLNnprsvz0] [--apple] [--mime-encoding] [--mime-type]
            [-e testname] [-F separator] [-f namefile] [-m magicfiles] file ...
       file -C [-m magicfiles]
       file [--help]
[root@localhost tmp]$ echo '/etc/passwd' | file -
/dev/stdin: ASCII text
-的使用        

    注:多重管道,最後一重是在子shell中進行的

  1九、文本查看器

    less:一頁一頁的查看輸入    ls -l /ec/  |less  (快捷鍵使用跟man同樣)

    more:翻到最後直接退出,less不會

    cat:

    tac :倒序查看

  20、tee命令(重定向到多個目標)

     cat /etc/passwd |tr -d 'abc'|  tee /tmp/mypass  :即輸出到屏幕,又輸出到某個文件

 

第三節:用戶組權限的詳細介紹

  一、解釋Linux的安全模型-特定資源給 用戶使用

    Authentication:認證

    Authorization:受權

    Adition:審計  

    ① 用戶user

      令牌token.identity  

      Linux用戶:Username/UID

      管理員:root / 0

      普通用戶:1-65535

        系統用戶:1-499,1-999(CentOS7)

          對守護進程獲取資源進行權限分配,不能登陸系統

        登陸用戶:500+ ,1000+ (CentOS7)

          交互式登陸  

    ② 組group

      LInux組:groupname/ GID

      管理員組:root 、0

      普通組:

        系統組: 1-499 ,1-999

        普通組:500+,1000+    

    ③ 安全上下文

        運行中的程序就是進程,進程時沒有特殊權限的,進程的權限取決因而誰發起了該進程。

         root : /bin/cat

         jack  :/bin/cat

         進程可以訪問資源的權限取決於進程的運行者身份。

      

    ④ 組的類別

        Linux組的類別

          用戶的主要組(primary group)

            用戶必須屬於一個且只有一個主組

            組名同用戶名,且僅包含一個用戶,私有組

          用戶的附加組(supplementary group)

            一個用戶能夠屬於0個或者多個附加組

    ⑤ 用戶和組的配置文件

        Linux用戶和組的主要的配置文件

          /etc/passwd

          /etc/group

          /etc/shadow

          /etc/gshadow

        passwd文件格式:jack:x:500:500::/home/jack:/bin/bash

          • 用戶名
          • 密碼佔位符
          • UID
          • GID
          • 註釋
          • 家目錄
          • 默認使用shell

        shadow文件格式;root:$6$B10sAzu4L7s.p0Vc$8ksttW0UABIDQ/4LNl8bmW0UUORvZ1HYmkZp18mvKPK0tUcV90TesKjIYQhiikFyfFWSm

          • 用戶名
          • 加鹽後加密的密碼
          • 最近一次被改動的時間
          • 密碼再過幾天能夠被修改
          • 密碼再過幾天必須變動
          • 密碼過時前幾天系統提醒用戶
          • 密碼過幾天后鎖定
          • 1970/1/1起,多少天后帳號失效

        group文件格式:  bin:x:1:bin,daemon  

          • 組名
          • 組密碼佔位符
          • GID
          • 以當前組做爲附加組的用戶列表

        gshadow文件格式:bin:::bin,daemon

          • 組名
          • 組密碼
          • 組管理員列表,更改組密碼和成員用 gpasswd
          • 以當前組爲附加組的用戶列表

  二、用戶和組管理命令

      用戶管理命令

        useradd,usermod,userdel

      組管理命令

        groupadd ,groupmod,groupdel

    用戶管理:

    ① 用戶建立:useradd

        -u :UID

        -o :不檢查UID的惟一性(跟-u一塊兒使用)

        -g :GID

        -c :註釋信息

        -d  :用戶家目錄                                 

        -s   :默認shell

        -G :附加組,組必須事先存在

        -N :不建立私用組作主組,使用users組做爲主組

        -r :建立系統用戶 1-499 ,1-999

        -m :建立家目錄,用於系統用戶

        -M :不建立家目錄,用於非系統用戶

        默認值設定:/etc/default/useradd文件中

        顯示或更改默認設置:

            useradd -D           

            useradd -D -s SHELL  等

    ② 用戶屬性修改

        usermod:選項跟useradd的同樣使用,可是注意,修改附加組,不加-a,會覆蓋以前的附加組

    ③ 用戶刪除

        userdel:不會刪除家目錄,使用-r

     ④ 查看用戶相關的ID 信息

        id :

          -u:uid     -g :gid    -G :顯示用戶所屬的組的ID  -n :顯示名稱,須要ugG配合

    

    組管理命令:

    ① 建立組

      groupadd  

        -g :GID

        -r :建立系統組  

    ② 修改和刪除組

       groupmod

          -g :修改gid

          -n :新名字

      groupdel

    ③ 更改組密碼

      gpasswd

        -a user :將user添加至指定組中

        -d user :從指定組中移除用戶user

        -A user1 user2  設置有管理權限的用戶列表

      newgrp:臨時切換主組

        若是用戶不屬於此組,則須要租密碼       

  三、切換用戶或以其餘用戶的身份執行命令

    su  Username:只是簡單的切換一下身份

    su - Username :用這個用戶從新登陸(徹底切換)

    su   -l    userr1    -c   'whoami' : 以user1的身份運行一條命令(-l  login  等於 -  )

  四、設置密碼:

    passwd [option] username

      -d:刪除指定用戶的密碼

      -l :鎖定指定用戶

      -u:解鎖指定用戶

      -e :強制用戶下次登陸修改密碼

      -f :強制操做

      -n :指定最短使用期限  天

      -x :最大使用期限

      -w :提早多少天開始警告

      --stdin:從標準輸入接受用戶密碼

          echo ‘password' | passwd --stdin UserName

 

 第四節:文件權限管理

  一、文件權限

    文件的權限主要針對三類對象定義:

      owner:屬主,u

      group:屬組,g

      other:其餘,o

    每一個文件針對沒類訪問者都定義了三種權限

      r:readable

      w:writeable

      x:eXcutable  

    r、w、x對文件和目錄的意義:

      文件:

        r:可以使用文件查看類工具獲取其內容

        w:可修改其內容

        x:能夠把次文件提請內核啓動爲一個進程  

      目錄:

        r:可使用ls查看此目錄中文件列表

        w:可在此目錄中建立文件,也能夠刪除此目錄中的文件

        x:可使用ls -l 查看此目錄中文件列表,能夠cd進入此目錄

      用8進製表示:    

        --- 000    0
        --x 001    1
        -w- 010   2
        -wx 011   3
        r-- 100     4
        r-x 101     5
        rw- 110    6
        rwx 111    7

          例如: 640:rw-r-----     755:rwxr-xr-x

  二、修改文件權限的命令:chmod

      chmod  [option]..octal-mode file

        -R:遞歸修改權限  

      chmod [option]...mode[,mode] ....file ...

        mode:

          經過八進制數對權限修改:

            chmod 77 passwd  ----  077,默認左側補0

          修改一類用戶的全部權限:

            u=

            g=

            o=

            ug=

            a=  全部的

            u=,g= 

            如:chmod g=rw issue 

          修改某一類戶某一位的權限:

            u+

            u-

            如:

            chmod u+x issue
            chmod og-x issue
            chmod a+x issue

          修改全部用戶的某類權限

            chmod +x issue 都加
            chmod +r issue 都加
            chmod +w issue 只能給屬主加 (默認不可讓其餘類用戶都有權限,不然全部用戶都有權限操做)

       :shell默認有文件或目錄建立時的遮罩碼umask:配置文件在/root/ .bashrc  或者 .bashrc_profile 配置          

            umask: 查看
            umask #: 設定

            (管理員)默認是0022   建立目錄 777-022  建立文件 666-022 默認權限

            (普通用戶)002

              針對文件,即使umask是023這樣的,666-023=643,即other有執行權限的,默認權限都會加1,爲644

      mode [option]... --reference=file FILE:參考file的權限,做爲FILE 的權限    

   三、修改文件的屬主和屬組 (普通用戶沒有權限修改屬主屬組)   

       修改文件的屬主:chown

        chown [option]...[owner][:[group]] FILE...

          用法:        

            chown:也能夠修改屬組
            chown user1:user1 issue
            chown user1.user1 issue

            chown -R hi.dir/     遞歸

            chown [OPTION]... --reference=RFILE FILE...

       修改文件的屬組:chgrp  

  

  四、文件訪問控制列表FACL

      ACL:Access Control List,事先靈活的權限管理

      除了文件的全部者,所屬組和其餘人,能夠對更多的用戶設置權限,讓某用戶對該文件有了必定的權限

      CentOS7 默認建立的XFS和EXT4文件系統具備ACL功能。CentOS7以前版本,默認手工建立ext4文件系統無ACL功能,需手動增長

        tune2fs -o acl /dev/sdb1

        mount -o acl/dev/sdb1 /mnt/test

      ACL生效順序:全部者,自定義用戶,自定義組,其餘人  (屬主-屬組-屬主facl-屬組facl-其餘)

           使用:ls查看文件屬性,最後多了一個+

              添加:

              setfacl -m u:user1:rw a.txt

              setfacl -m g:user1:rw a.txt

              查看:

              getfacl

[root@localhost ~]# setfacl -m u:tom2:r /etc/passwd
[root@localhost ~]# getfacl /etc/passwd
getfacl: Removing leading '/' from absolute path names
# file: etc/passwd
# owner: root
# group: root
user::rw-
user:tom2:r--
group::r--
mask::r--
other::r--

[root@localhost ~]# su - tom2 -c 'ls -al /etc/passwd'
-rw-r--r--+ 1 root root 1838 Jul 28 03:40 /etc/passwd
[root@localhost ~]# su - tom2 -c 'tail -1 /etc/passwd'
tom2:x:557:557::/home/tom2:/bin/bash
[root@localhost ~]# setfacl -x u:tom2:r /etc/passwd
setfacl: Option -x: Invalid argument near character 8
[root@localhost ~]# setfacl -x u:tom2 /etc/passwd
[root@localhost ~]# getfacl 
Usage: getfacl [-aceEsRLPtpndvh] file ...
Try `getfacl --help' for more information.
[root@localhost ~]# getfacl /etc/passwd
getfacl: Removing leading '/' from absolute path names
# file: etc/passwd
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
getfacl

 

               刪除:

              setfacl -x u:user1 a.txt

 

  五、LInux文件系統上的特殊權限

      SUID、SGID、Sticky

      ① 權限有:r、w、x    -------user、group、other

      ② 安全上下文

        前提:進程有屬主和屬組,文件有屬主和屬組

        1)任何一個可執行的程序文件能不能啓動爲今晨,取決於發起者對程序文件是否擁有執行權限

        2)啓動爲進程以後,其進程的屬主爲發起者,進程的屬組爲發起者所屬的組

        3)進程訪問文件的權限,取決於進程的發起者

            a、進程的發起者,同文件的屬主,則應用文件屬主權限

            b、進程的發起者,屬於文件的屬組,則應用文件屬組權限

            c、應用文件「其餘」求權限

      ③ SUID:  

        1)任何一個可執行程序文件能不能啓動爲進程,取決發起者對程序文件是否擁有可執行權限

        2)啓動爲進程以後,其進程的屬主爲源程序文件的屬主

          權限設定:

            chmod u+s FILE     以該文件的屬主的權限運行,普通用戶不能執行某文件,可是+s後,就能夠執行,可是是以該文件的屬主的身份執行

            chmod u-s FILE

            :如上設定,若是原來屬主沒有執行權限,那麼現實s爲大寫S,不然小寫s

      ④ SGID

        默認狀況下,用戶建立文件時,其屬組爲此用戶所屬的基本組,一旦某目錄被設定了SGID,則對此目錄有寫權限的用戶在此目錄中建立的文件所屬的組爲此目錄的屬組

          權限設定:

            chmod g+s DIR...
            chmod g-s DIR...

      ⑤Sticky

        對於一個多人可寫的目錄,若是設置了Sticky,則每一個用戶只能刪除本身的文件。       

          權限設定:
            chmod o+t DIR...
            chmod o-t DIR...

 

      ⑥ 一樣特殊權限也能夠用八進制表示        

         SUID SGID STICKY
                  000 0
                  001 1
                  010 2
                  011 3
                  100 4
                  101 5
                  110 6
                  111 7

          如:chmod 4777 /tmp/a.txt   4表示:100  s--

 

        注:

        • FACL針對某個用戶
        • 特殊權限針對全部用戶
        • SGID和Sticky 通常只用於目錄操做

 第五節:文本處理

   一、經常使用文本查看工具:

      cat,tac,more,less

      head,tail

        tail -f:能夠監視追加的新內容

      wc:單詞統計

      sort:排序

      uniq:去重

      diff:文件對比

      patch:打補丁

  二、文件查看

    cat、tac、rev

      cat:

        -E:顯示行結束符$

        -n :編號

        -A:顯示全部的控制符

        -b:非空行編號

        -s:壓縮連續的空行成一行

      tac:文件總體倒序

      rev:每行都倒序

  三、分頁查看文件內容

      more

      less : 相似man翻頁和查詢

  四、顯示文件文本前幾行後幾行

      head :

        -c #:指定獲取前幾個字節

        -n #:指定獲取前幾行

        -# :指定行數

      tail : 

        -c #: 指定獲取後#字節
        -n #: 指定獲取後#行
        -#:
        -f: 跟蹤顯示文件fd新追加的內容,經常使用日誌監控

      tailf 相似 tail -f  ,當文件不增加時不訪問文件  

  五、按列抽取文本cut和 合併文件paste

      cut [option] ...FILE

        -d  :指明分隔符,默認tab

        -f :

          #:第#個字段

          #,#[,#]:離散的多個字段

          #-#:連續的多個字段,例如 1-4

        混合使用:1-3,7

        -c : 按字符切割

        --output-delimiter=STRING指定輸出分隔符

        例如:       

          顯示文件或STDIN數據的指定列
            cut -d: -f1 /etc/passwd
            cat  /etc/passwd | cut -d: -f7
            cut -c2-5 /usr/share/dict/words

       paste :合併兩個文件同行號的列到一行 

          paste [OPTION]... [FILE]...
          -d 分隔符:指定分隔符,默認用TAB
          -s : 全部行合成一行顯示
          paste f1 f2
          paste -s f1 f2

   六、文本分析工具

      文本數據統計:wc

        計數單詞總數、行總數、字節總數和字符總數
        能夠對文件或STDIN中的數據運行
        wc story.txt
        39     237    1901 story.txt
        行數 字數 字節數
        經常使用選項
          -l 只計數行數
          -w 只計數單詞總數
          -c 只計數字節總數
          -m 只計數字符總數
          -L 顯示文件中最長行的長度

      整理文本:sort 

        把整理過的文本顯示在STDOUT,不改變原始文件
        sort [options] file(s)
          經常使用選項
            -r 執行反方向(由上至下)整理
            -R 隨機排序
            -n 執行按數字大小整理
            -f 選項忽略(fold)字符串中的字符大小寫
            -u 選項(獨特,unique)刪除輸出中的重複行
            -t c 選項使用c作爲字段界定符
            -k X 選項按照使用c字符分隔的X列來整理可以使用屢次

 1 [root@localhost /tmp]$ cat a.txt 
 2 nana:30:5.5
 3 apple:10:2.5
 4 pear:90:2.3
 5 orange:20:3.4
 6 [root@localhost /tmp]$ sort -n -t: -k2 a.txt 
 7 apple:10:2.5
 8 orange:20:3.4
 9 nana:30:5.5
10 pear:90:2.3
sort

 

      比較文件:diff 和 patch

      從輸入中刪除先後相接的重複的行  uniq

        uniq [OPTION]... [FILE]...
          -c: 顯示每行重複出現的次數
          -d: 僅顯示重複過的行
          -u: 僅顯示未曾重複的行
            注:連續且徹底相同方爲重複
              常和sort 命令一塊兒配合使用:
                sort userlist.txt | uniq -c

 

1 以冒號分隔,取出/etc/passwd文件的第6至第10行,並將這些信息按第3個字段的數值大小進行排序;最後僅顯示的各自的第1個字段;
2 
3 [root@localhost /tmp]$ head -10 passwd | tail -5 | sort -n -k3 -t: | cut -d: -f1
4 lp
5 sync
6 shutdown
7 halt
8 mail
練習

 

  七、Linux文本處理三劍客

      grep:文本過濾(模式:pattern)工具(grep,egrep,fgrep(不支持正則表達式)) 

       sed:stream editor,文本編輯工具

      awk:Linux上的實現gawk,文本報告生成器

     ① grep:Global search REgular expression and Print out the line

        做用:文本搜索工具,根據用戶指定的模式對目標文本逐行進行匹配檢查,打印匹配到的行。

        模式:由正則表達式字符及文本字符所編寫的過濾條件。

        REGEXP:由一類特殊字符文本字符所編寫的模式,其中有些字符不表達字符字面意義,而表示控制或者通配的功能。

          分爲兩類:

            基本正則表達式;BRE

            擴展正則表達式:ERE

          注:經過正則表達式引擎對文本逐行匹配檢測。

         grep [option] pattern [file]:

           選項:

              --color=auto:對匹配到的文本着色顯示

              -v:顯示不可以被pattern匹配到的行

              -i:忽略字符大小寫

              -o:僅顯示匹配到的字符串

              -q:靜默模式,不輸出任何信息

                  注:      

                    echo $? 命令結束後的退出碼qw
                        0   :執行正常
                        1-255

              -A #:顯示匹配到的行的後幾行

              -B #:前幾行

              -C #:先後幾行

      

              -E:使用egrep,即擴展正則比卻是

        egrep:

            egrep = grep -E

             

       1)正則表達式元字符:

        基本正則表達式元字符:

          字符匹配:

          • .:匹配任意單個字符
          • [] :匹配指定範圍內的任意單個字符
          • [^] :匹配指定範圍外的任意單個字符
          • [:digit:] .........跟glob同樣

           次數匹配:用在指定次數的字符後面,用於指定前面的字符要出現的次數

          • * :匹配前面的字符任意次   工做在貪婪模式
          • .* :任意長度的任意字符
          • \? :匹配掐面的字符0或1次
          • \+ :匹配前面的字符至少出現一次
          • \{m\} :匹配前面的字符出現m次
          • \{m,n\} :至少m次,最多n次
          • \{,n\} :0-n次

           位置錨定:

          • ^ :行首錨定
          • $ :行尾錨定
          • ^pattern$ :用於模式匹配整行
            • ^$ :空行
            • ^[[:space:]]*$  :可能空行,可能空字符的行
          •  \<  或  \b :詞首錨定
          •  \> 或   \b :詞尾錨定
            • \<pattern\> :整個單詞

           分組:

             \(\) :將一個或多個字符捆綁在一塊兒,看成一個總體進行處理

                  如: \(xy\)*ab    \(c\|C\)at :cat或Cat     

                 

               注:

                分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1,\2,\3

                \1:從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符:

                    \(ab\+\(xy\)*\) :

                       \1 :ab\+\(xy\)*

                         \2 :xy

              後向引用:引用前面的分組括號中的模式所匹配到的字符(而非模式自己)  

              \| :或者

         2)擴展的正則表達式元字符:

          字符匹配:

            . :任意單個字符

            []  :字符集中的任意個

            [^]:字符集外的任意個

          次數匹配:

            * :任意次

            ?:0-1次

            +:至少一次

            {m}:m次   

            {m,n}:m-n次

          位置錨定:

            ^

            $

            \<   \>    \b   \b  (除了這個,基本都不用轉義)

          分組和引用

            ()    \1  \2

          或者

            a|b     C|cat   C或cat

 1 一、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
 2 
 3 [root@localhost /tmp]$ grep '^\(s\|S\)' meminfo 
 4 SwapCached:            0 kB
 5 SwapTotal:       2097148 kB
 6 SwapFree:        2097148 kB
 7 Shmem:              1044 kB
 8 Slab:              78240 kB
 9 SReclaimable:      15956 kB
10 SUnreclaim:        62284 kB
11 s:    12313KB
12 
13 
14 [root@localhost /tmp]$ grep '^[sS]' meminfo 
15 SwapCached:            0 kB
16 SwapTotal:       2097148 kB
17 SwapFree:        2097148 kB
18 Shmem:              1044 kB
19 Slab:              78240 kB
20 SReclaimable:      15956 kB
21 SUnreclaim:        62284 kB
22 s:    12313KB
23 
24         二、顯示/etc/passwd文件中不以/bin/bash結尾的行;
25 [root@localhost /tmp]$ grep '\/bin\/bash$' passwd
26 root:x:0:0:root:/root:/bin/bash
27 jack3:x:506:100::/home/jack3:/bin/bash
28 jack:x:507:507::/home/jack:/bin/bash
29 tom:x:508:508::/home/tom:/bin/bash
30 alex:x:555:100::/home/alex:/bin/bash
31 jack2:x:556:556::/home/jack2:/bin/bash
32 tom2:x:557:557::/home/tom2:/bin/bash
33 
34 
35         三、顯示/etc/passwd文件中ID號最大的用戶的用戶名;
36 sort -n -k3 -t: passwd | cut -d: -f1|tail -1
37 
38 
39         4、若是用戶root存在,顯示其默認的shell程序;
40         # id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
41 
42         五、找出/etc/passwd中的兩位或三位數;
43         # grep -o "\<[0-9]\{2,3\}\>" /etc/passwd
44 
45         六、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且後面存非空白字符的行;
46         # grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
47 
48         七、找出"netstat -tan"命令的結果中以'LISTEN'後跟0、1或多個空白字符結尾的行;
49         # netstat -tan | grep "LISTEN[[:space:]]*$"
50 
51         八、添加用戶bash、testbash、basher以及nologin(其shell爲/sbin/nologin);然後找出/etc/passwd文件中用戶名同shell名的行;
52         # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
練習

 

  ② sed:stream editor:    

      sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。而後讀入下行,執行下一個循環。若是沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並無改變,除非你使用重定向存儲輸出。
      功能:主要用來自動編輯一個或多個文件,簡化對文件的反覆操做,編寫轉換程序等

    格式:

      sed [option]  'script' file ...

         -n:靜默模式,不輸出模式空間內的內容,默認打印模式空間中的內容

         -r :擴展的正則表達式

         -f :文件,指定sed腳本文件

            -e  ‘script‘  -e  ‘script’ :指定多個編輯指令

         -i.bak :備份文件並原處編輯

        編輯命令:

          d:刪除

          p :打印

          i  \ :在被指定到的行前面插入文本

          a  \ :在被指定的行的後面插入文本

          \n :換行

          r   文件 :在指定位置吧另外一個文件的內容插入

          w  文件:將符合條件的全部行保存至指定的文件中

          = :顯示符合條件的行的行號

          !:模式空間中匹配行取反處理

          c :替換    sed ‘/root/c\superman’ /etc/passwd   但這是直接替換整行了

          s/// :查找替換,支持使用其餘分隔符,s@@@  s###

            替換標記:

               g:行內全局替換

               p:顯示替換成功的行

               w /path/to/somefile :將替換成功的行保存至文件中 

                : 還可使用「&」引用前面查找時查找到的整個內容

        地址定界:

          1)不給地址:對全文進行處理

          2)單地址:

              #:指定的行,$:最後一行

              /pattern/ : 被此模式所能匹配到的每一行

          3)地址範圍:  

              #,#

              #,+#

              /pat1/ ,/pat2/ :模式之間的

              # ,/pat/ :第#行到模式匹配到的第一行結束

          4)~ :步進:

              1~2 奇數行

              2~2 偶數行

      :sed的高級編輯命令

        P:打印模式空間開端至\n內容,並追加到默認輸出以前
        h: 把模式空間中的內容覆蓋至保持空間中
        H:把模式空間中的內容追加至保持空間中
        g: 從保持空間取出數據覆蓋至模式空間
        G:從保持空間取出內容追加至模式空間
        x: 把模式空間中的內容與保持空間中的內容進行互換
        n: 讀取匹配到的行的下一行覆蓋至模式空間
        N:讀取匹配到的行的下一行追加至模式空間
        d: 刪除模式空間中的行
        D:若是模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使用合成的模式空間從新啓動循環。若是模式空間不包含換行符,則會像發出d命令那樣啓動正常的新循環

 1 練習:
 2    1)替換/etc/inittab文件中」id:3:initdefault:"一行中的數字爲5
 3     sed 's@\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab         
 4    2)刪除/etc/init.d/funcions文件中的空白行
 5     sed "/^$/d" /etc/init.d/funcions 
 6    3)刪除/etc/inittab文件中位於行首的#
 7      sed 's@^#@@g' /etc/inittab    
 8    4)刪除/etc/rc.d/rc.sysinit文件中以#後跟至少一個空白字符開頭的行的行首的#和空白字符。
 9     sed "s@^#[[:space:]]\{1,\}\@@g" /etc/rc.d/rc.sysinit
10    5)刪除/boot/grub/grub.conf文件中行首的空白字符。
11     sed "s@^[[:space:]]\{1,\}@@g" /boot/grub/grub.conf
12    6)取出一個文件路徑的目錄名稱,如/etc/sysconfig/network,其目錄爲/etc/sysconfig,功能相似dirname命令;
13    echo /etc/sysconfig/network | sed "s@[^/]\{1,\}/\?$@@" 
練習

  ③ awk:

    Pawk:Aho, Weinberger, Kernighan,報告生成器,格式化文本輸出
      有多種版本:New awk(nawk),GNU awk( gawk)
    gawk:模式掃描和處理語言
    基本用法:
      awk [options] ‘program’ var=value file…
      awk [options] -f programfile var=value file…
      awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
      awk 程序一般由:BEGIN語句塊、可以使用模式匹配的通用語句塊、END語句塊,共3部分組成
      program一般是被單引號或雙引號中
        選項:
          -F 指明輸入時用到的字段分隔符
          -v var=value: 自定義變量

      基本格式:awk [options] 'program' file…
        program:pattern{action statements;..}
        pattern和action:
          pattern部分決定動做語句什麼時候觸發及觸發事件
            BEGIN,END
          action statements對數據進行處理,放在{}內指明
          print, printf
        分割符、域和記錄
          awk執行時,由分隔符分隔的字段(域)標記$1,$2..$n稱爲域標識。$0爲全部域,注意:和shell中變量$符含義不一樣
          文件的每一行稱爲記錄
          省略action,則默認執行 print $0 的操做

      awk工做原理:

第一步:執行BEGIN{action;… }語句塊中的語句
第二步:從文件或標準輸入(stdin)讀取一行,而後執行pattern{ action;… }語句塊,它逐行掃描文件,從第一行到最後一行重複這個過程,直到文件所有被讀取完畢。 
第三步:當讀至輸入流末尾時,執行END{action;…}語句塊
BEGIN語句塊在awk開始從輸入流中讀取行以前被執行,這是一個可選的語句塊,好比變量初始化、打印輸出表格的表頭等語句一般能夠寫在BEGIN語句塊中
END語句塊在awk從輸入流中讀取完全部的行以後即被執行,好比打印全部行的分析結果這類信息彙總都是在END語句塊中完成,它也是一個可選語句塊 
pattern語句塊中的通用命令是最重要的部分,也是可選的。若是沒有提供pattern語句塊,則默認執行{ print },即打印每個讀取到的行,awk讀取的每一行都會執行該語句塊
awk工做原理

 

      awk     

        格式: print item1, item2, ...
        print要點:
          (1) 逗號分隔符
          (2) 輸出的各item能夠字符串,也能夠是數值;當前記錄的字段、變量或awk的表達式
          (3) 如省略item,至關於print $0
        示例:
          awk '{print "hello,awk"}'
          awk –F: '{print}' /etc/passwd
          awk –F: ‘{print 「wang」}’ /etc/passwd
          awk –F: ‘{print $1}’ /etc/passwd
          awk –F: ‘{print $0}’ /etc/passwd
          awk –F: ‘{print $1」\t」$3}’ /etc/passwd
          tail –3 /etc/fstab |awk ‘{print $2,$4}’

      awk變量

        變量:內置和自定義變量
        FS:輸入字段分隔符,默認爲空白字符
          awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
          awk –F: '{print $1,$3,$7}’ /etc/passwd
        OFS:輸出字段分隔符,默認爲空白字符
          awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
        RS:輸入記錄分隔符,指定輸入時的換行符
          awk -v RS=' ' ‘{print }’ /etc/passwd
        ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
          awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
        NF:字段數量
          awk -F: ‘{print NF}’ /etc/fstab,引用內置變量不用$
          awk -F: '{print $(NF-1)}' /etc/passwd
        NR:記錄號
          awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab

        FNR:各文件分別計數,記錄號
          awk '{print FNR}' /etc/fstab /etc/inittab
        FILENAME:當前文件名
          awk '{print FILENAME}’ /etc/fstab
        ARGC:命令行參數的個數
          awk '{print ARGC}’ /etc/fstab /etc/inittab
          awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
        ARGV:數組,保存的是命令行所給定的各參數
          awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
          awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab

      自定義變量:

        自定義變量(區分字符大小寫)
        (1) -v var=value
        (2) 在program中直接定義
        示例:
          awk -v test='hello gawk' '{print test}' /etc/fstab
          awk -v test='hello gawk' 'BEGIN{print test}'
          awk 'BEGIN{test="hello,gawk";print test}'
          awk –F:‘{sex=「male」;print $1,sex,age;age=18}’ /etc/passwd
          cat awkscript
          {print script,$1,$2}
          awk -F: -f awkscript script=「awk」 /etc/passwd

      printf命令:

格式化輸出:printf 「FORMAT」, item1, item2, ...
    (1) 必須指定FORMAT
    (2) 不會自動換行,須要顯式給出換行控制符,\n
    (3) FORMAT中須要分別爲後面每一個item指定格式符
格式符:與item一一對應
    %c: 顯示字符的ASCII碼
    %d, %i: 顯示十進制整數
    %e, %E:顯示科學計數法數值    
    %f:顯示爲浮點數
    %g, %G:以科學計數法或浮點形式顯示數值
    %s:顯示字符串
    %u:無符號整數
    %%: 顯示%自身
修飾符:
    #[.#]:第一個數字控制顯示的寬度;第二個#表示小數點後精度,%3.1f
    -: 左對齊(默認右對齊) %-15s
    +:顯示數值的正負符號 %+d
printf
awk -F: ‘{printf "%s",$1}’ /etc/passwd
awk -F: ‘{printf "%s\n",$1}’ /etc/passwd
awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
awk -F: ‘{printf "Username: %s\n",$1}’  /etc/passwd
awk -F: ‘{printf 「Username: %s,UID:%d\n",$1,$3}’
    /etc/passwd
awk -F: ‘{printf "Username: %15s,UID:%d\n",$1,$3}’ 
    /etc/passwd
awk -F: ‘{printf "Username: %-15s,UID:%d\n",$1,$3}’ 
    /etc/passwd
printf 實例

 

      操做符:

算術操做符:
    x+y, x-y, x*y, x/y, x^y, x%y
    -x: 轉換爲負數
    +x: 轉換爲數值
字符串操做符:沒有符號的操做符,字符串鏈接
賦值操做符:
    =, +=, -=, *=, /=, %=, ^=
    ++, --
下面兩語句有何不一樣
awk  ‘BEGIN{i=0;print ++i,i}’
awk  ‘BEGIN{i=0;print i++,i}’
操做符

 

比較操做符:
     ==, !=, >, >=, <, <=
模式匹配符:
       ~:左邊是否和右邊匹配包含    !~:是否不匹配
示例:
    awk –F: '$0 ~ /root/{print $1}‘  /etc/passwd
    awk '$0~「^root"' /etc/passwd 
    awk  '$0  !~ /root/‘   /etc/passwd
    awk  –F: ‘$3==0’  /etc/passwd
操做符2
邏輯操做符:與&&,或||,非!
示例:
awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd
awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd 
awk -F: ‘!($3==0) {print $1}' /etc/passwd
awk -F: ‘!($3>=500) {print $3}’ /etc/passwd
函數調用:    function_name(argu1, argu2, ...)
條件表達式(三目表達式):
    selector?if-true-expression:if-false-expression
示例:
awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
操做符3

 

      awk Pattren:

PATTERN:根據pattern條件,過濾匹配的行,再作處理
(1)若是未指定:空模式,匹配每一行
(2) /regular expression/:僅處理可以模式匹配到的行,須要用/  /括起來
    awk '/^UUID/{print $1}' /etc/fstab
    awk '!/^UUID/{print $1}' /etc/fstab
(3) relational expression: 關係表達式,結果爲「真」纔會被處理
    真:結果爲非0值,非空字符串
    假:結果爲空字符串或0值 
示例:
awk -F:  'i=1;j=1{print i,j}' /etc/passwd
awk  ‘!0’  /etc/passwd ; awk  ‘!1’   /etc/passwd
awk –F: '$3>=1000{print $1,$3}'  /etc/passwd
awk -F: '$3<1000{print $1,$3}'  /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd

4) line ranges:行範圍
    startline,endline:/pat1/,/pat2/ 不支持直接給出數字格式
    awk -F: ‘/^root\>/,/^nobody\>/{print $1}' /etc/passwd
    awk -F: ‘(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
(5) BEGIN/END模式
    BEGIN{}: 僅在開始處理文件中的文本以前執行一次
    END{}:僅在文本處理完成以後執行一次
awk Pattern

      示例:

awk -F : 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "end file"}' /etc/passwd
awk -F : '{print "USER USERID「;print $1":"$3} END{print "end file"}' /etc/passwd
awk -F: 'BEGIN{print "  USER  UID  \n--------------- "}{print $1,$3}' /etc/passwd
awk -F: 'BEGIN{print "  USER UID  \n--------------- "}{print $1,$3}'END{print "=============="} /etc/passwd
seq 10 |awk ‘i=0’  
seq 10 |awk ‘i=1’
seq 10 | awk 'i=!i‘  
seq 10 | awk '{i=!i;print i}‘   
seq 10 | awk ‘!(i=!i)’               
seq 10 |awk -v i=1 'i=!i'
示例

      awk action:

經常使用的action分類
(1) Expressions:算術,比較表達式等
(2) Control statements:if, while等
(3) Compound statements:組合語句
(4) input statements
(5) output statements:print等
action

 

      awk控制語句:

{ statements;… } 組合語句
if(condition) {statements;…} 
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…}
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
delete array[index]
delete array
exit 
控制語句

      awk 控制語句  if-else

語法:if(condition){statement;…}[else statement]
      if(condition1){statement1}else if(condition2){statement2}
        else{statement3}
使用場景:對awk取得的整行或某個字段作條件判斷
示例:
awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
awk '{if(NF>5) print $0}' /etc/fstab
awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
awk -F: '{if($3>=1000) printf "Common user: %s\n",$1;
    else printf "root or Sysuser: %s\n",$1}' /etc/passwd
df -h|awk -F% '/^\/dev/{print $1}'|awk '$NF>=80{print $1,$5}‘
awk 'BEGIN{ test=100;if(test>90){print "very good"}
    else if(test>60){ print "good"}else{print "no pass"}}'
if-else    
while循環
語法:while(condition){statement;…}
條件「真」,進入循環;條件「假」,退出循環
使用場景:
    對一行內的多個字段逐一相似處理時使用
    對數組中的各元素逐一處理時使用
示例:
awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) 
    {print $i,length($i); i++}}' /etc/grub2.cfg

awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10) {print $i,length($i)}; i++}}' /etc/grub2.cfg
控制語句
do-while循環
語法:do {statement;…}while(condition)
意義:不管真假,至少執行一次循環體

示例: 
awk 'BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}‘

for循環
語法:for(expr1;expr2;expr3) {statement;…}
常見用法:
    for(variable assignment;condition;iteration process) 
        {for-body}
特殊用法:可以遍歷數組中的元素
    語法:for(var in array) {for-body}
示例:
 awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg



break [n]
continue [n]

next:
  提早結束對本行處理而直接進入下一行處理(awk自身循環)
  awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
控制語句

 

      awk數組:

若要遍歷數組中的每一個元素,要使用for循環
for(var in array) {for-body}
注意:var會遍歷array的每一個索引
示例:
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]
    ="Tuesday";for(i in weekdays) {print weekdays[i]}}‘
netstat -tan | awk '/^tcp/{state[$NF]++}END
    {for(i in state) { print i,state[i]}}'
awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
數組

      awk函數:

數值處理:
    rand():返回0和1之間一個隨機數
  awk  'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }' 
字符串處理:
length([s]):返回指定字符串的長度
sub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,並將第一個匹配的內容替換爲s
    echo "2008:08:08 08:08:08" | awk 'sub(/:/,「-",$1)'
gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,並所有替換爲s所表示的內容
    echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,「-",$0)'
split(s,array,[r]):以r爲分隔符,切割字符串s,並將切割後的結果保存至array所表示的數組中,第一個索引值爲1,第二個索引值爲2,…
    netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}
END{for (i in count) {print i,count[i]}}'
函數

  

   八、vim使用:

  1 vim編輯器
  2 
  3     簡介
  4         vi: Visual Interface,文本編輯器
  5 
  6         文本:ASCII, Unicode
  7 
  8         文本編輯種類:
  9             行編輯器: sed
 10             全屏編輯器:nano, vi
 11 
 12         VIM - Vi IMproved
 13 
 14     使用
 15         vim:模式化的編輯
 16 
 17             基本模式:
 18                 編輯模式,命令模式
 19                 輸入模式
 20                 末行模式:
 21                     內置的命令行接口
 22 
 23             打開文件:
 24                 # vim [OPTION]... FILE...
 25                     +#: 打開文件後,直接讓光標處於第#行的行首;
 26                     +/PATTERN:打開文件後,直接讓光標處於第一個被PATTERN匹配到的行的行首;
 27 
 28             模式轉換:
 29                 編輯模式 --> 輸入模式
 30                     i: insert, 在光標所在處輸入;
 31                     a: append, 在光標所在處後面輸入;
 32                     o: 在當前光標所在行的下方打開一個新行;
 33                     I:在當前光標所在行的行首輸入;
 34                     A:在當前光標所在行的行尾輸入;
 35                     O:在當前光標所在行的上方打開一個新行;
 36                     c
 37                     C
 38 
 39                 輸入模式 --> 編輯模式
 40                     ESC
 41 
 42                 編輯模式 --> 末行模式
 43                     :
 44 
 45                 末行模式 --> 編輯模式
 46 
 47 
 48                     ESC
 49                 可視模式--->選擇內容
 50                     按v   V    
 51 
 52             關閉文件:
 53                 :q 退出
 54                 :q! 強制退出,丟棄作出的修改;
 55                 :wq 保存退出
 56                 :x 保存退出
 57                 :w /PATH/TO/SOMEWHERE
 58 
 59                 ZZ: 保存退出;
 60 
 61         光標跳轉:
 62             
 63             字符間跳轉:
 64                 h, j, k, l
 65                     h: 左
 66                     l: 右
 67                     j: 下
 68                     k: 上
 69 
 70                 #COMMAND:跳轉由#指定的個數的字符;
 71 
 72             單詞間跳轉:
 73                 w:下一個單詞的詞首
 74                 e:當前或下一單詞的詞尾
 75                 b:當前或前一個單詞的詞首
 76 
 77                 #COMMAND:由#指定一次跳轉的單詞數
 78 
 79             行首行尾跳轉:
 80                 ^: 跳轉至行首的第一個非空白字符;
 81                 0: 跳轉至行首;
 82                 $: 跳轉至行尾;
 83 
 84             行間移動:
 85                 #G:跳轉至由#指定行;
 86                 G:最後一行;
 87                 1G, gg: 第一行;
 88 
 89             句間移動:
 90                 )
 91                 (
 92 
 93             段落間移動:
 94                 }
 95                 {
 96 
 97     vim的編輯命令:
 98 
 99         字符編輯:
100             x: 刪除光標處的字符;
101             #x: 刪除光標處起始的#個字符;
102 
103             xp: 交換光標所在處的字符及其後面字符的位置;
104 
105         替換命令(r, replace)
106             r: 替換光標所在處的字符
107 
108         刪除命令:
109             d: 刪除命令,可結合光標跳轉字符,實現範圍刪除;
110                 d$: 
111                 d^:
112                 d0:
113 
114                 dw
115                 de
116                 db
117 
118                     #COMMAND
119 
120                 dd: 刪除光標所在的行;
121                     #dd:多行刪除;
122 
123         粘貼命令(p, put, paste):
124             p:緩衝區存的若是爲整行,則粘貼當前光標所在行的下方;不然,則粘貼至當前光標所在處的後面;
125             P:緩衝區存的若是爲整行,則粘貼當前光標所在行的上方;不然,則粘貼至當前光標所在處的前面;
126 
127         複製命令(y, yank):
128             y: 複製,工做行爲類似於d命令;
129                 y$
130                 y0
131                 y^
132 
133                 ye
134                 yw
135                 yb
136 
137                     #COMMAND
138 
139                 yy:複製行
140                     #yy: 複製多行;
141 
142         改變命令(c, change)
143             c: 修改
144                 編輯模式 --> 輸入模式
145 
146                 c$
147                 c^
148                 c0
149 
150                 cb
151                 ce
152                 cw
153                     #COMMAND
154 
155                 cc:刪除並輸入新內容
156                 #cc: 
157 
158         其它編輯操做
159 
160             可視化模式:
161                 v: 按字符選定
162                 V:按行行定
163 
164                 Note:常常結合編輯命令;
165                     d, c, y
166 
167             撤消此前的編輯:
168                 u(undo):撤消此前的操做;
169                     #u: 撤消指定次數的操做;
170 
171             撤消此前的撤消: 
172                 Ctrl+r
173 
174             重複前一個編輯操做:
175                 .
176 
177         翻屏操做:
178             Ctrl+f: 向文件尾部翻一屏;
179             Ctrl+b: 向文件首部翻一屏;
180 
181             Ctrl+d: 向文件尾部翻半屏;
182             Ctrl+u:向文件首部翻半屏;
183 
184         vim自帶的練習教程:
185             vimtutor
186 
187     vim中的末行模式:
188         內建的命令行接口
189 
190         (1) 地址定界
191             :start_pos,end_pos
192                 #: 具體第#行,例如2表示第2行;
193                 #,#: 從左側#表示行起始,到右側#表示行結尾;
194                 #,+#: 從左側#表示的行起始,加上右側#表示的行數;
195                 .: 當前行
196                 $: 最後一行
197                     .,$-1
198                 %:全文, 至關於1,$
199 
200                 /pat1/,/pat2/201                     從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束;
202                     #,/pat/
203                     /pat/,$
204 
205             使用方式:
206                 後跟一個編輯命令
207                     d
208                     y
209                     w /PATH/TO/SOMEWHERE: 將範圍內的行另存至指定文件中;
210                     r /PATH/FROM/SOMEFILE:在指定位置插入指定文件中的全部內容;
211 
212         (2) 查找
213             /PATTERN:從當前光標所在處向文件尾部查找;
214             ?PATTERN:從當前光標所在處向文件首部查找;
215                 n:與命令同方向;
216                 N:與命令反方向;
217 
218         (3) 查找並替換
219             s: 在末行模式下完成查找替換操做
220                 s/要查找的內容/替換爲的內容/修飾符
221                     要查找的內容:可以使用模式
222                     替換爲的內容:不能使用模式,但可使用\1, \2, ...等後向引用符號;還可使用「&」引用前面查找時查找到的整個內容;
223                     修飾符:
224                         i: 忽略大小寫
225                         g: 全局替換;默認狀況下,每一行只替換第一次出現;
226 
227                 查找替換中的分隔符/可替換爲其它字符,例如
228                     s@@@
229                     s###
230 
231             練習:
232                 一、複製/etc/grub2.cfg至/tmp/目錄,用查找替換命令刪除/tmp/grub2.cfg文件中的行首的空白字符;
233                     %s/^[[:space:]]\+//g
234 
235                 二、複製/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令爲/tmp/functions的每行開頭爲空白字符的行的行首添加一個#號;
236                     :%s/^[[:space:]]/#&/
237 
238         多文件模式:
239             vim FILE1 FILE2 FILE3 ...
240                 :next 下一個
241                 :prev 前一個
242                 :first 第一個
243                 :last 最後一個
244 
245                 :wall 保存全部
246                 :qall 退出全部
247 
248         窗口分隔模式:
249             vim -o|-O FILE1 FILE2 ...
250                 -o: 水平分割
251                 -O: 垂直分割
252 
253                 在窗口間切換:Ctrl+w, Arrow
254 
255         單文件窗口分割:
256             Ctrl+w,s: split, 水平分割
257             Ctrl+w,v: vertical, 垂直分割
258 
259         定製vim的工做特性:
260             配置文件:永久有效
261                 全局:/etc/vimrc
262                 我的:~/.vimrc
263 
264             末行:當前vim進程有效
265 
266             (1) 行號
267                 顯示:set number, 簡寫爲set nu
268                 取消顯示:set nonumber, 簡寫爲set nonu
269             (2) 括號匹配
270                 匹配:set showmatch, 簡寫爲set sm
271                 取消:set nosm
272             (3) 自動縮進
273                 啓用:set ai
274                 禁用:set noai
275             (4) 高亮搜索
276                 啓用:set hlsearch
277                 禁用:set nohlsearch
278             (5) 語法高亮
279                 啓用:syntax on
280                 禁用:syntax off
281             (6) 忽略字符的大小寫
282                 啓用:set ic
283                 不忽略:set noic
284             (7)set list
285 
286             獲取幫助:
287                 :help 
288                 :help subject
289 
290         問題:如何設置tab縮進爲4個字符?
291 
292         練習:
293             一、複製/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init爲/var/log;
294             二、刪除/tmp/functions文件中全部以#開頭,且#後面至少有一個空白字符的行的行首的#號;
vim使用

 

第六節:軟件管理

  一、軟件運行環境:

    包管理器:    

        二進制應用程序的組成部分:

          二進制文件、庫文件、配置文件、幫助文件

        程序包管理器:

            debian:deb文件, dpkg包管理器

            redhat: rpm文件, rpm包管理器

            rpm: Redhat Package Manager

            RPM  Package Manager

     包命名:

        源代碼:name-VERSION.tar.gz|bz2|xz
           VERSION: major.minor.release
        rpm包命名方式:
           name-VERSION-release.arch.rpm
           例:bash-4.2.46-19.el7.x86_64.rpm
           VERSION: major.minor.release
           release:release.OS
           常見的arch:
           x86: i386, i486, i586, i686
           x86_64: x64, x86_64, amd64    powerpc: ppc
           跟平臺無關:noarch

    包命名和工具:

        包:分類和拆包
           Application-VERSION-ARCH.rpm: 主包
           Application-devel-VERSION-ARCH.rpm 開發子包
           Application-utils-VERSION-ARHC.rpm 其它子包
           Application-libs-VERSION-ARHC.rpm 其它子包
        包之間:可能存在依賴關係,甚至循環依賴
          解決依賴包管理工具:
             yum:rpm包管理器的前端工具
             apt-get:deb包管理器前端工具
             zypper: suse上的rpm前端管理工具
             dnf: Fedora 18+ rpm包管理器前端管理工具

     庫文件:

        查看二進制程序所依賴的庫文件
           ldd /PATH/TO/BINARY_FILE
        管理及查看本機裝載的庫文件
           ldconfig 加載庫文件
           /sbin/ldconfig -p: 顯示本機已經緩存的全部可用庫文件名及文件路徑映射關係
         配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
         緩存文件:/etc/ld.so.cache          

     包管理器:

        程序包管理器:
         功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操做
        包文件組成 (每一個包獨有)
             RPM包內的文件
             RPM的元數據,如名稱,版本,依賴性,描述等
             安裝或卸載時運行的腳本
        數據庫(公共):/var/lib/rpm
             程序包名稱及版本
             依賴關係
             功能說明
             包安裝後生成的各文件路徑及校驗碼信息

         程序包來源:

            管理程序包的方式:
               使用包管理器:rpm
               使用前端工具:yum, dnf
            獲取程序包的途徑:
               (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) 本身製做
                  注意:第三方包建議要檢查其合法性
                     來源合法性,程序包的完整性

  二、rpm包管理

       1)CentOS系統上使用rpm命令管理程序包:
           安裝、卸載、升級、查詢、校驗、數據庫維護
           安裝:
             rpm {-i|--install} [install-options] PACKAGE_FILE…
              -v: verbose
              -vv:
              -h: 以#顯示程序包管理執行進度
             rpm -ivh PACKAGE_FILE ...

      2)rpm包安裝

          [install-options]
             --test: 測試安裝,但不真正執行安裝,即dry run模式
             --nodeps:忽略依賴關係
             --replacepkgs | replacefiles
             --nosignature: 不檢查來源合法性
             --nodigest:不檢查包完整性
             --noscripts:不執行程序包腳本
                %pre: 安裝前腳本; --nopre
                %post: 安裝後腳本; --nopost
                %preun: 卸載前腳本; --nopreun
                %postun: 卸載後腳本;  --nopostun

      3) rpm包升級

          rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
          rpm {-F|--freshen} [install-options] PACKAGE_FILE...
             upgrade:安裝有舊版程序包,則「升級」
                    若是不存在舊版程序包,則「安裝」
             freshen:安裝有舊版程序包,則「升級」
                    若是不存在舊版程序包,則不執行升級操做
               rpm -Uvh PACKAGE_FILE ...
               rpm -Fvh PACKAGE_FILE ...
               --oldpackage:降級
               --force: 強制安裝

      4)升級注意事項

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

      5)包查詢

          rpm {-q|--query} [select-options] [query-options]
          [select-options]
             -a: 全部包
             -f: 查看指定的文件由哪一個程序包安裝生成
             -p rpmfile:針對還沒有安裝的程序包文件作查詢操做
             --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪一個包所提供
             --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪一個包所依賴
          rpm2cpio 包文件|cpio –itv  預覽包內文件
          rpm2cpio 包文件|cpio –id  「*.conf」 釋放包內文件
          [query-options]
              --changelog:查詢rpm包的changelog
              -c: 查詢程序的配置文件
               -d: 查詢程序的文檔
             -i: information
             -l: 查看指定的程序包安裝後生成的全部文件
             --scripts:程序包自帶的腳本
             --provides: 列出指定程序包所提供的CAPABILITY
             -R: 查詢指定的程序包所依賴的CAPABILITY

          經常使用查詢用法:
               -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
               -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
               -qa
      6) 包卸載:
           rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

       7) 包校驗

          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

          包來源合法性驗正及完整性驗正
             完整性驗正:SHA256
             來源合法性驗正:RSA
          公鑰加密
             對稱加密:加密、解密使用同一密鑰
             非對稱加密:密鑰是成對兒的
              public key: 公鑰,公開全部人
              secret key: 私鑰, 不能公開
          導入所須要公鑰
             rpm  -K|checksig  rpmfile  檢查包的完整性和簽名
             rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
             CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
             rpm -qa 「gpg-pubkey*」

       8)rpm數據庫

          數據庫重建:
             /var/lib/rpm
            rpm {--initdb|--rebuilddb}
             initdb: 初始化
                若是事先不存在數據庫,則新建之
                不然,不執行任何操做
             rebuilddb:重建已安裝的包頭的數據庫索引目錄

  三、yum管理

      1)yum

          CentOS: yum, dnf
          YUM: Yellowdog Update Modifier,rpm的前端程序,可解決軟件包相關依賴性,可在多個庫之間定位軟件包,up2date的替代工具

            yum repository: yum repo,存儲了衆多rpm包,以及包的相關的元數據文件(放置於特定目錄repodata下)

            文件服務器:

              http://   https://      ftp://     file://

 

      2) yum 配置文件

 1 yum客戶端配置文件:
 2     /etc/yum.conf:爲全部倉庫提供公共配置
 3     /etc/yum.repos.d/*.repo:爲倉庫的指向提供配置
 4     倉庫指向的定義:
 5         [repositoryID]
 6         name=Some name for this repository
 7         baseurl=url://path/to/repository/
 8         enabled={1|0}
 9         gpgcheck={1|0}
10         gpgkey=URL
11         enablegroups={1|0}
12         failovermethod={roundrobin|priority}
13             roundrobin:意爲隨機挑選,默認值
14             priority:按順序訪問
15         cost=      默認爲1000
yum配置文件

 

       3)yum倉庫

1 yum的repo配置文件中可用的變量:
2     $releasever: 當前OS的發行版的主版本號
3     $arch: 平臺,i386,i486,i586,x86_64等
4     $basearch:基礎平臺;i386, x86_64
5     $YUM0-$YUM9:自定義變量
6 實例:
7     http://server/centos/$releasever/$basearch/
8     http://server/centos/7/x86_64
9     http://server/centos/6/i384
yum倉庫

      4) yum源

 1 阿里雲repo文件:
 2     http://mirrors.aliyun.com/repo/
 3 CentOS系統的yum源
 4 阿里雲:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
 5 教學環境:
 6    http://172.16.0.1/cobbler/ks_mirror/$releasever/
 7 EPEL的yum源: 
 8 阿里雲: 
 9    https://mirrors.aliyun.com/epel/$releasever/x86_64
10 教學環境:
11    http://172.16.0.1/fedora-epel/$releasever/x86_64/
yum源

      5)yum命令

 1 yum命令的用法:
 2     yum [options] [command] [package ...]
 3 顯示倉庫列表:
 4     yum repolist
 5 顯示程序包:
 6     yum list
 7     yum list [all | glob_exp1] [glob_exp2] [...]
 8     yum list {available|installed|updates} [glob_exp1] [...]
 9 安裝程序包:
10     yum install package1 [package2] [...]
11     yum reinstall package1 [package2] [...]  (從新安裝)
12 
13 升級程序包:
14     yum update [package1] [package2] [...]
15     yum downgrade package1 [package2] [...] (降級)
16 檢查可用升級:
17     yum check-update
18 卸載程序包:
19     yum remove | erase package1 [package2] [...]
20 
21 查看程序包information:
22     yum info [...]
23 查看指定的特性(能夠是某文件)是由哪一個程序包所提供:
24     yum provides | whatprovides feature1 [feature2] [...]
25 清理本地緩存:
26     清除/var/cache/yum/$basearch/$releasever緩存
27     yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
28 構建緩存:
29     yum makecache
30 
31 
32 搜索:yum search string1 [string2] [...]
33     以指定的關鍵字搜索程序包名及summary信息
34 查看指定包所依賴的capabilities:
35     yum deplist package1 [package2] [...]
36 查看yum事務歷史:
37     yum history [info|list|packages-list|packages-info|
38     summary|addon-info|redo|undo|
39     rollback|new|sync|stats]
40     yum history
41     yum history info 6
42     yum history undo 6 
43 日誌 :/var/log/yum.log
44 
45 安裝及升級本地程序包:
46     yum localinstall rpmfile1 [rpmfile2] [...]
47         (用install替代)
48     yum localupdate rpmfile1 [rpmfile2] [...]
49         (用update替代)
50 包組管理的相關命令:
51     yum groupinstall group1 [group2] [...]
52      yum groupupdate group1 [group2] [...]
53      yum grouplist [hidden] [groupwildcard] [...]
54      yum groupremove group1 [group2] [...]
55      yum groupinfo group1 [...]
56 
57 yum的命令行選項:
58     --nogpgcheck:禁止進行gpg check
59     -y: 自動回答爲「yes」
60     -q:靜默模式
61     --disablerepo=repoidglob:臨時禁用此處指定的repo
62     --enablerepo=repoidglob:臨時啓用此處指定的repo
63     --noplugins:禁用全部插件
yum命令

 

  四、系統光盤yum倉庫

 1 系統安裝光盤做爲本地yum倉庫:
 2 (1) 掛載光盤至某目錄,例如/mnt/cdrom
 3         mount /dev/cdrom /mnt/cdrom
 4 (2) 建立配置文件
 5         [CentOS7]
 6         name=
 7         baseurl=
 8         gpgcheck=
 9         enabled=
10 建立yum倉庫:
11     createrepo [options] <directory>
系統光盤yum倉庫

 

  五、編譯安裝

1 程序包編譯安裝:
2 Application-VERSION-release.src.rpm --> 安裝後,使用rpmbuild命令製做成二進制格式的rpm包,然後再安裝
3 源代碼-->預處理-->編譯-->彙編-->連接-->執行
4 源代碼組織格式:
5     多文件:文件中的代碼之間,極可能存在跨文件依賴關係
6     C、C++:make 項目管理器
7         configure腳本 --> Makefile.in --> Makefile
8     java: maven
程序包編譯

 

 1 C語言源代碼編譯安裝三步驟:
 2      一、./configure
 3      (1) 經過選項傳遞參數,指定啓用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成Makefile
 4      (2) 檢查依賴到的外部環境,如依賴的軟件包
 5      2、make  根據Makefile文件,構建應用程序
 6      3、make install  複製文件到相應路徑
 7 開發工具:
 8       autoconf: 生成configure腳本
 9       automake:生成Makefile.in
10 注意:安裝前查看INSTALL,README
11 
12 開源程序源代碼的獲取:
13     官方自建站點:
14         apache.org (ASF:Apache Software Foundation)
15         mariadb.org
16        ...
17       代碼託管:
18         SourceForge.net
19         Github.com
20         code.google.com
21 c/c++編譯器: gcc (GNU C Complier)
22 
23 
24 編譯C源代碼:
25     準備:提供開發工具及開發環境
26         開發工具:make, gcc等
27         開發環境:開發庫,頭文件
28             glibc:標準庫
29     實現:經過「包組」提供開發組件
30         Development Tools
31         Server Platform Development
32         
33 
34 
35 第一步:configure腳本

36         選項:指定安裝位置、指定啓用的特性
37         --help: 獲取其支持使用的選項
38     選項分類:
39         安裝路徑設定:
40         --prefix=/PATH: 指定默認安裝位置,默認爲/usr/local/
41         --sysconfdir=/PATH:配置文件安裝位置
42         System types:支持交叉編譯
43 
44 
45 Optional Features: 可選特性
46         --disable-FEATURE
47        --enable-FEATURE[=ARG]
48 Optional Packages: 可選包
49     --with-PACKAGE[=ARG],依賴包
50     --without-PACKAGE,禁用依賴關係
51 注意:一般被編譯操做依賴的程序包,須要安裝此程序包的「開發」組件,其包名通常相似於name-devel-VERSION
52 
53 第二步:make
54 第三步:make install
55 
56 
57 
58 安裝後的配置:
59      (1) 二進制程序目錄導入至PATH環境變量中
60          編輯文件/etc/profile.d/NAME.sh
61              export PATH=/PATH/TO/BIN:$PATH
62      (2) 導入庫文件路徑
63          編輯/etc/ld.so.conf.d/NAME.conf
64              添加新的庫文件所在目錄至此文件中
65          讓系統從新生成緩存:
66              ldconfig [-v]
67 
68 (3) 導入頭文件
69     基於連接的方式實現:
70         ln -sv 
71 (4) 導入幫助手冊
72     編輯/etc/man.config|man_db.conf文件
73         添加一個MANPATH
編譯安裝
相關文章
相關標籤/搜索