1. 程式人生 > >一篇文章帶你入門Linux——馬哥Linux基礎學習筆記

一篇文章帶你入門Linux——馬哥Linux基礎學習筆記

更改密碼 自帶 ctime 詳細信息 內嵌 桌面環境 地址定界 格式符 p s

1.課程體系:
中級:
    初級:系統基礎
    中級:系統管理、服務安全及服務管理、Shell腳本;
高級:
    MySQL數據庫;
        cache & storage
    集群:
        Cluster

        lb:
            4layer
            7layer
        ha:
    分布式:
        zookeeper
        分布式文件系統
    虛擬化技術:
        xen
        kvm

    Openstack:IAAS雲;

    運維工具:
        ansible
        puppet(ruby), saltstack(python)

    監控工具:
        zabbix

    大數據處理:
        hadoop
        spark, storm

        elk: elasticsearch, logstash, kibana

    docker:

    Python:

2.計算機基礎知識:

現代計算機設備的組成部分:
    運算器、控制器、存儲器、輸入設備、輸出設備
        CPU
        bus:總線
        memory: 編址存儲設備
        read ahead 高速緩存

    IO: 與外部部件交互
        磁盤 網卡

虛擬機:虛擬計算機

CPU:運算器、控制器
    CPU指令,指令集;
        特權指令:OS運行特權指令;
        普通指令:
    程序員:

OS: Operating System
    軟件程序
    通用目的
        硬件驅動
        進程管理
        內存管理
        網絡管理
        安全管理

    System Call 系統調用

    編程層次:
        硬件規格:hardware specifiacation
        系統調用:
        庫調用:  library call

UI: user interface 用戶接口
    GUI: Graphic User Interface 圖形用戶接口
    CLI: Command Line Interface 命令行接口

ABI: Application Binary Interface      應用二進制接口
API:Application Programming Interface 用用程序接口

CPU架構類型:
    x86
    x64
    arm

    m68000, m68k
    power
    powerpc
    ultrasparc
    alpha
    安騰

Windows
Linux:
    Linus --> Linux

    GNU/Linux

Unix:
    System (Bell Lab)
        AIX (IBM)
        Solaris (SUN)
        HP-UX (HP)
    BSD: (BSRG)Berkeley System Distribution  伯克利軟件套件
        NetBSD
        OpenBSD
        FreeBSD

MIT:Richard Stallman
    GNU: GNU is Not Unix;
        GPL:General Public License
CPU, memory, I/O

程序運行模式:
    用戶空間:user space, us
    內核空間:system space

POS: Portable Operating System 可移植操作系統
    POSIX

    API: 編程接口;

運行程序格式:
    Windows: EXE, dll(dynamic link library 動態鏈接庫文件)
    Linux: ELF, so(shared object 共享對象)

    程序:指令+數據
        指令:只讀
        數據:讀寫

    程序:算法+數據結構

    庫調用,系統調用:允許被調用的程序;

    malloc(), free()

    編程語言:
        匯編語言:微碼編程
            系統中某些與硬件相關的特有代碼、驅動程序開發;
        高級語言C, C++:
            系統級應用、驅動程序
        高級應用java, python, php:
            應用程序

        unix-like

Linux的發行版:
    slackware:
        suse
            opensuse
    debian:
        ubuntu
            mint
    redhat:
        rhel: redhat enterprise linux
            每18個月發行一個新版本
        CentOS:兼容rhel的格式
        fedora:每6個月發行一個新版本

    ArchLinux
    Gentoo
    LFS: Linux From scratch

    Android: kernel+busybox+java虛擬機

GNU: GPLv2, GPLv3, LGPL(lesser)
    Apache: apache
    BSD: bsd

    A: 1000, GPL,
    B: 20000, 20

問題1:CentOS和Linux是什麽關系?CentOS和RHEL是什麽關系?
    CentOS是Linux發行版之一,它是來自於Red Hat Enterprise Linux依照開放源代碼規定釋出的源代碼所編譯而成。
    CentOS 是Community ENTerprise Operating System(社區企業操作系統)的簡稱,是Linux發行版之一,它是來自於Red Hat EnterpriseLinux(即RHEL)依照開放源代碼規定釋出的源代碼所編譯而成。RHEL是很多企業采用的linux發行版本,需要向RedHat付費才可以使用, 並能得到付過費用的服務和技術支持和版本升級。而CentOS可以像REHL一樣的構築linux系統環境,但不需要向RedHat付任何的費用,同樣也 得不到任何有償技術支持和升級服務。
問題2:各種開源協議的具體細節?
    GPL, LGPL, Apache, BSD

3.Linux基礎知識

程序包管理器:
    rpm:
        RHEL, Fedora, S.u.S.E, CentOS
    dpt:
        Debian, Ubuntu

自由軟件:
    自由使用;自由學習和修改;自由分發;自由創建衍生版;

Linux的哲學思想:
    1、一切皆文件;
        把幾乎所有資源,包括硬件設備都組織為文件格式;
    2、由眾多單一目的小程序組成;一個程序只實現一個功能,而且要做好;
        組合小程序完成復雜任務;
    3、盡量避免跟用戶交互;
        目標:實現腳本編程,以自動完成某些功能;
    4、使用純文本文件保存配置信息;
        目標:一款使用的文本編程器即能完成系統配置工作;

如何獲取CentOS的發行版:
    http://mirrors.aliyun.com
    http://mirrors.sohu.com
    http://mirrors.163.com

登錄:
    root/mageedu

    # startx &

終端:
    用戶與主機交互,必然用到的設備;

    物理終端:直接接入本機的顯示器和鍵盤設備;/dev/console

    虛擬終端:附加在物理終端之上的以軟件方式虛擬實現的終端,CentOS 6默認啟動6個虛擬終端
        Ctrl+Alt+F#: [1,6]
        圖形終端:附加在物理終端之上的以軟件方式虛擬實現的終端,但額外會提供桌面環境;

        設備文件路徑:/dev/tty#
    模擬終端:
        圖形界面下打開的命令行接口,基於ssh協議或telnet協議等遠程打開的界面

        設備文件:/dev/pts/#    [0,oo)

    查看當前的終端設備:tty

交互式接口:啟動終端後,在終端設備附加一個交互式應用程序
    GUI:
        X protocol, window manager, desktop

        Desktop:
            GNOME (C, gtk)
            KDE   (C++, qt)
            XFCE  (輕量級桌面)
    CLI:
        shell程序:
            sh (bourn)
            csh 
            tcsh
            ksh (korn)
            bash (bourn again shell), GPL
            zsh 

        顯示當前使用的shell:
            # echo ${SHELL}

        顯示當前系統使用的所有shell:
            # cat /etc/shells

        命令提示符:prompt
            [root@localhost ~]#
                [root@localhost ~]:PS1
                prompt:
                    管理員:#
                    普通用戶:$

命令:
    輸入命令,回車:
        提請shell程序找到鍵入命令所對應的可執行程序或代碼,並由其分析後提交給內核分配資源將其運行起來;
            表現為一個或多個進程;

        在shell中可執行的命令有兩類:
            內建命令:由shell自帶的,而且通過某命令形式提供;
            外部命令:在當前系統的某文件系統路徑下有對應的可執行程序文件;
                which,whereis 用於查找並顯示給定命令的絕對路徑

            區別內部或外部命令:
                # type COMMAND
            例子:[xxl@localhost ~]$ type pwd
                  pwd 是 shell 內嵌
                  [xxl@localhost ~]$ type mkdir
                  mkdir 是 /usr/bin/mkdir
    運行命令:
        命令格式:
            COMMAND [OPTIONS...] [ARGUMENTS...]
                選項:用於啟用或關閉命令的某個或某些功能;
                    短選項:-c, 例如:-l, -h
                        多個短選項可命令使用,例如-l -h, 可寫作-lh;
                    長選項:--word,例如:--long, --human-readable
                參數:命令的作用對象
                      向命令提供數據;
            註意:
                1、多選項,以及多參數和命令之間都應該使用空白字符分隔
                2、取消命令執行:Ctrl+c

    文件系統:
        Windows裏面是這樣的:C:\Program files\office11\word\word.exe
        Linux裏面是這樣的:/etc/sysconfig/network-scripts/ifcfg-eth0

        文件有兩類數據:
            元數據:metadata  元數據指用來描述一個文件的特征的系統數據,諸如訪問權限、文件擁有者以及文件數據塊的分布信息(inode...)等等。
            數據:data  數據是指普通文件中的實際數據。

        1、文件名嚴格區分字符大小寫;file1, File1, FILE1是不同的文件;
        2、文件名可使用除/以外的任意字符,不建議使用特殊字符;  /: 表示根目錄,也用做路徑分隔符;
        3、文件名長度最長不能超過255個字符;
        4、所以.開頭的文件,均為隱藏文件;

        路徑:
            絕對路徑:從根目錄起始的路徑;
            相對路徑:對當前位置起始的路徑;
                當前位置的表示方式:
                    (1) ./: ./sysconfig/network-scripts
                    (2) 省略上述符號: sysconfig/network-scripts

                    ..:表示當前目錄的上一級目錄

            當前目錄:current directory, 也稱作working directory;用.表示
                pwd: printing working directory 打印當前目錄

        LSB: Linux Standard Base Linux標準庫

命令總結:ls, cd, type, tty, cat, which, whereis, pwd, echo

4.Linux命令幫助的獲取

外部命令:都有一個可執行程序,位於文件系統某目錄下;
    which, whereis

    shell程序搜尋可執行程序文件的路徑定義在PATH環境變量中;
        [xxl@localhost ~]$ echo $PATH
        /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/xxl/.local/bin:/home/xxl/bin

        註意:以:分隔,自左至右搜尋

格式:COMMAND [OPTIONS...] [ARGUMENTS...]

內部命令:
    # help COMMAND     
外部命令:
    (1) # COMMAND --help  例如:[xxl@localhost ~]$ mkdir --help
        # COMMAND -h      例如:[xxl@localhost ~]$ mkdir -h
    (2) 使用手冊(manual)
        # man COMMAND     例如:[xxl@localhost ~]$ man mkdir
    (3) 信息頁
        # info COMMAND    例如:[xxl@localhost ~]$ info mkdir
    (4) 程序自身的幫助文檔
        README
        INSTALL
        ChangeLog
    (5) 程序官方文檔
        官方站點:Documentation
    (6) 發行版的官方文檔
    (7) Google

內部命令幫助:
    # help COMMAND

        hash命令:
            shell搜尋到的外部命令的路徑結果會緩存至kv(key-value)存儲中;

        history命令:
            作用是什麽?相關的環境變量是什麽?有用的選項?

            管理命令歷史;
                登錄shell時,會讀取命令歷史文件中記錄下的命令:~/.bash_history
                登錄進shell後新執行的命令只會記錄在緩存中;這些命令會用戶退出時“追加”至命令歷史文件中;

                history:
                    -a: 追加本次會話新執行的命令歷史列表至歷史文件中;
                    -d: 刪除歷史中指定的命令;
                    -c: 清空命令歷史;

            快捷操作:
                !#: 調用歷史中第#條命令;
                !string:調用歷史中最近一個以string開頭的命令;
                !!: 上一條命令

外部命令幫助獲取:
    (2) man COMMAND
        手冊頁:/usr/share/man
            man1 ... man8    記住1,5,8
                man1: 用戶命令
                man2: 系統調用
                man3: C庫調用
                man4: 設備文件及特殊文件
                man5: 配置文件格式
                man6: 遊戲
                man7: 雜項
                man8: 管理類的命令

        註意:有些關鍵在不止一個章節中存在幫助手冊;
            要查看指定章節中的手冊:man # COMMAND

        man命令的配置文件:/etc/man.config
            MANPATH /PATH/TO/SOMEWHERE: 指明新的手冊文件搜索位置

            # man -M /PATH/TO/SOMEWHERE COMMAND: 到指定位置下搜索COMMAND命令的手冊頁並顯示之;

        幫助手冊中的段落說明:
            NAME           簡短的命令,數據名稱說明
            SYNOPSIS       簡短的命令執行語法簡介
            DESCRIPTION    較為完整的說明
            OPTIONS        針對SYNPATH部分中,有列舉的所有可用的選項說明
            EXAMPLES       一些可以參考的範例
            AUTHOR         作者
            REPORTING BUGS 是否有相關的錯誤
            SEE ALSO       這個命令或數據其他說明

        SYNOPSIS:
            []:可選內容
            <>: 必選內容
            a|b:二選一
            ...: 同一內容可出現多次

        man命令的操作方法:
            Space, ^V, ^f, ^F: 向文件尾翻屏;
            b, ^B: 向文件首部翻屏;
            d, ^D: 向文件尾部翻半屏;
            u, ^U: 向文件首部翻半屏;
            RETURN, ^N, e, ^E or j or ^J: 向文件尾部翻一行;
            y or ^Y or ^P or k or ^K:向文件首部翻一行;
            q: 退出;

            #:跳轉至第#行;
            1G: 回到文件首部
            G:翻至文件尾部

        文本搜索:
            /KEYWORD: 
                以KEYWORD指定的字符串為關鍵字,從當前位置向文件尾部搜索;不區分字符大小寫;
                    n: 下一個
                    N:上一個
            ?KEYWORD:
                以KEYWORD指定的字符串為關鍵字,從當前位置向文件首部搜索;不區分字符大小寫;
                    n: 跟搜索命令同方向,下一個
                    N:跟搜索命令反方向,上一個

    (3) info
        info COMMAND

    (4) 程序自身的幫助文檔
        /usr/share/doc/COMMAND-VERSION

    (5) 程序官方文檔

    (6) 發行版的官方文檔
        http://www.redhat.com/docs

    (7) Google

    (8) slideshare
        http://www.slideshare.net/

5.Linux基礎命令:

時間日期命令
date:
    date [OPTION]... [+FORMAT]:顯示日期
        FORMAT: 格式符號
            %D
            %F
            %T
    date [MMDDhhmm[[CC]YY][.ss]]:設置日期
        MM: 月分
        DD:幾號
        hh: 小時
        mm: 分鐘
        YY: 兩位年份
        CCYY: 四位年份
        .ss: 秒鐘

    Linux的兩種時鐘:
        系統時鐘:由Linux內核通過CPU的工作頻率進行的計時;
        硬件時鐘:

        hwclock: 顯示硬件時鐘
            -s, --hctosys
            -w, --systohc

        cal:日歷

        練習:date命令
            顯示今天為周幾?
            設定當前系統時間?
            顯示今天的日期,形如:08/15/15?
            顯示當前的時間,形如: 16:01:21?
-----------------------------------------------------------------
目錄相關的命令:
    當前目錄或工作目錄
    主目錄,家目錄:HOME
        root: /root
        普通用戶:/home/USERNAME
            /home/tom

        ~:用戶的主目錄

    cd: 
        cd 或 cd ~: 回當前用戶的主目錄
        cd ~USERNAME: 切換至指定用戶的主目錄
        cd -: 在上一個目錄和當前目錄之間來回切換

        .
        ..

        相關的環境變量:
            PWD:保存了當前目錄路徑;
            OLDPWD:上一次所在目錄路徑;

    pwd: 顯示當前目錄

    ls: list
        顯示指定路徑下的文件列表;

        ls [OPTION]... [DIR]...
            -a, --all: 顯示所有文件,包括隱藏文件;
            -l: 長格式
                -rw-r--r-- 1 root root 44800 Aug 14 14:32 install.log
                    -rw-r--r--:
                        最左側的第一位:文件類型
                            -, d, l, b, c, p, s
                        後面的9位:訪問權限,perm
                    數字:文件被硬鏈接的次數;
                    左root: 文件的owner
                    右root: 文件的group
                    44800:文件的size
                    Aug 14 14:32 : 文件的最近一次被修改的時間
                    install.log: 文件名
            -h, --human-readable:單位換算
            -d: 顯示目錄自身的相關屬性;通常要與-l一起使用;
            -r, --reverse: 逆序顯示
            -R, --recursive: 遞歸

    stat /PATH/TO/SOMEFILE:獲取指定文件的元數據
    ------------------------------------------------------------------ 
    文件查看命令:cat, tac
        cat [OPTION]... [FILE]...
            -E: 顯示行結束符$
            -n: 對顯示出的每一行進行編號

    文件內容類型查看命令:file
        file /PATH/TO/SOMEWHERE

    回顯命令:echo
        -n: 禁止自動添加換行符號;
        -e: 允許使用轉義符;
            \n: 換行
            \t: 制表符

        echo "$VAR_NAME": 變量會替換,雙引號表弱引用
        echo ‘$VAR_NAME‘: 變量不會替換,強引用

    which:顯示命令對應的程序文件路徑
        which [OPTION] COMMAND
            --skip-alias:禁止顯示別名

    whatis:
        使用mkwhatis命令可將當前系統上所有的幫助手冊及與之對應的關鍵字創建為一個數據庫;
------------------------------------------------------------------ 
系統管理類命令:
    關機:
        halt, poweroff, shutdown, init 0
    重啟:
        reboot, shutdown, init 6
    跟用戶登錄相關:
        who, whoami, w

6.Linux的文件系統:

根文件系統(rootfs):
    root filesystem

LSB, FHS: (FileSystem Heirache Standard)
    /etc, /usr, /var, /root, /home, /dev

    /boot:引導文件存放目錄,內核文件(vmlinuz)、引導加載器(bootloader, grub)都存放於此目錄;
    /bin:供所有用戶使用的基本命令;不能關聯至獨立分區,OS啟動即會用到的程序;
    /sbin:管理類的基本命令;不能關聯至獨立分區,OS啟動即會用到的程序;
    /lib:基本共享庫文件,以及內核模塊文件(/lib/modules);
    /lib64:專用於x86_64系統上的輔助共享庫文件存放位置;
    /etc:配置文件目錄(純文本文件);
    /home/USERNAME:普通用戶家目錄;
    /root:管理員的家目錄;
    /media:便攜式移動設備掛載點;
        cdrom
        usb
    /mnt:臨時文件系統掛載點;
    /dev:設備文件及特殊文件存儲位置;
        b: block device,隨機訪問
        c: character device,線性訪問
    /opt:第三方應用程序的安裝位置;
    /srv:系統上運行的服務用到的數據;
    /tmp:臨時文件存儲位置;
    /usr: universal shared, read-only data;
        bin: 保證系統擁有完整功能而提供的應用程序;
        sbin:
        lib:
        lib64:
        include: C程序的頭文件(header files);
        share:結構化獨立的數據,例如doc, man等;
        local:第三方應用程序的安裝位置;
            bin, sbin, lib, lib64, 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相關的安全策略等信息的存儲位置;

Linux上的應用程序的組成部分:
    二進制程序:/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下的文件類型:
    - (f):普通文件;
    d: 目錄文件;
    b: 塊設備;
    c: 字符設備;
    l: 符號鏈接文件;
    p: 管道文件;
    s: 套接字文件;socket; 

7.系統管理類命令:

    關機:
        halt, poweroff, shutdown, init 0
    重啟:
        reboot, shutdown, init 6
    跟用戶登錄相關:
        who, whoami, w

    關機或重啟:
        halt, poweroff
        reboot

            -f: 強制,不調用shutdown
            -p: 切斷電源

    shutdown:
        shutdown [OPTION]...  TIME [MESSAGE]

            -r: reboot
            -h: halt

            -c:cancel

        TIME: 
            now: 立刻
            +m: 相對時間表示法,從命令提交開始多久之後;例如 +3;
            hh:mm: 絕對時間表示,指明具體時間;

    用戶登錄信息查看命令:
        whoami: 顯示當前登錄有效用戶;
        who: 系統當前所有的登錄會話;
        w: 系統當前所有的登錄會話及所做的操作;


8.目錄管理類命令:

cd, pwd, ls

mkdir, rmdir, tree

mkdir [options] /path/to/somewhere
    -p: 存在於不報錯,且可自動創建所需的各目錄;
    -v: 顯示詳細信息
    -m MODE: 創建目錄時直接指定權限;

tree: 
    -d: 只顯示目錄
    -L level:指定顯示的層級數目
    -P pattern: 只顯示由指定pattern匹配到的路徑;

rmdir:刪除空目錄
    rmdir [OPTION]... DIRECTORY...
        -v: 顯示過程;

練習:
    (1) 如何創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b, /tmp/x/y2/a, /tmp/x/y2/b
        mkdir /tmp/x/{y1,y2}/{a,b}      

    (2) 如何創建x_m, y_m, x_n, y_n
        mkdir {x,y}_{m,n}

    (3) 如何創建/tmp/bin, /tmp/sbin, /tmp/usr, /tmp/usr/bin, /tmp/usr/sbin
        mkdir -p /tmp/{bin,sbin,usr/{bin,sbin}}

9.文本文件查看類命令:

cat, tac
more, less, tail, head

more
    more [OPTIONS...] FILE...
        -d: 顯示翻頁及退出提示

less
    less [OPTIONS...] FILE...

head
    head [OPTION]... [FILE]...
        -c #: 指定獲取前#字節
        -n #: 指定獲取前#行
            -#:

tail 
    tail [OPTION]... [FILE]...
        -c #: 指定獲取後#字節
        -n #: 指定獲取後#行
            -#:
        -f: 跟蹤顯示文件新追加的內容;

10.文件的時間戳管理工具:

touch

文件:metadata, data
    查看文件狀態:stat

    三個時間戳:
        access time:訪問時間,簡寫為atime,讀取文件內容
        modify time: 修改時間, mtime,改變文件內容(數據)
        change time: 改變時間, ctime,元數據發生改變

touch命令:
    touch [OPTION]... FILE...
        -a: only atime
        -m: only mtime
        -t STAMP:
             [[CC]YY]MMDDhhmm[.ss]
        -c: 如果文件不存,則不予創建

11.文件管理:

cp, mv, rm

復制命令:cp
    cp [OPTION]... [-T] SOURCE DEST
    cp [OPTION]... SOURCE... DIRECTORY
    cp [OPTION]... -t DIRECTORY SOURCE...

    cp SRC DEST
        SRC是文件:
            如果目標不存在:新建DEST,並將SRC中內容填充至DEST中;
            如果目錄存在:
                如果DEST是文件:將SRC中的內容覆蓋至DEST中;
                    此時建議為cp命令使用-i選項;
                如果DEST是目錄:在DEST下新建與原文件同名的文件,並將SRC中內容填充至新文件中;

    cp SRC... DEST
        SRC...:多個文件
            DEST必須存在,且為目錄,其它情形均會出錯;

    cp SRC DEST
        SRC是目錄:
            此時使用選項:-r

            如果DEST不存在:則創建指定目錄,復制SRC目錄中所有文件至DEST中;
            如果DEST存在:
                如果DEST是文件:報錯
                如果DEST是目錄:

    常用選項:
        -i:交互式
        -r, -R: 遞歸復制目錄及內部的所有內容;
        -a: 歸檔,相當於-dR --preserv=all
            -d:--no-dereference --preserv=links
            --preserv[=ATTR_LIST]
                mode: 權限
                ownership: 屬主屬組
                timestamp: 
                links
                xattr
                context
                all
        -p: --preserv=mode,ownership,timestamp
        -v: --verbose
        -f: --force

mv: move,移動文件
   mv [OPTION]... [-T] SOURCE DEST
   mv [OPTION]... SOURCE... DIRECTORY
   mv [OPTION]... -t DIRECTORY SOURCE...

   常用選項:
        -i: 交互式
        -f: 強制

rm: remove,刪除
    rm [OPTION]... FILE...

    常用選項:
        -i: 交互式
        -f: 強制刪除
        -r: 遞歸

        rm -rf 

文本編輯器:nano
    全屏編輯器


12.文本處理工具:wc, cut, sort, uniq

wc命令:字數統計
    wc [OPTION]... [FILE]...
        -l: lines 統計行數
        -w: words 統計詞數
        -c: characters 統計字符數
        若不加參數,則列出 行數 詞數 字符數

cut命令:文本分割
    cut [OPTION]... [FILE]... 
        -d DELIMITER: 指明分隔符
        -f FILEDS: 顯示哪些字段
            #: 第#個字段
            #,#[,#]:離散的多個字段,例如1,3,6
            #-#:連續的多個字段, 例如1-6
            混合使用:1-3,7
        --output-delimiter=STRING
            例子:
                使用冒號分割 passwd文件 顯示第1 3至5列
                [root@WebServer ~]# cut -d: -f 1,3-5 /etc/passwd
                使用空格分割文件 顯示1-2列 將標準輸出重定向到新的文件
                [root@WebServer ~]# cut -d‘ ‘ -f 1-2 users >user2
                使用e字符分割文件 取第1列
                [root@WebServer ~]# cut -de -f 1 users  

sort命令:對文本中的行進行排序
    sort [OPTION]... [FILE]...
        -f: 忽略字符大小寫
        -r: 逆序
        -t DELIMITER: 字段分隔符
        -k #:以指定字段為標準排序
        -n: 以數值大小進行排序
        -u: uniq,排序後去重
        例子:
            把users文件的行進行排序輸出 升序
            [root@WebServer ~]# sort users
            把users文件的行進行排序輸出 降序
            [root@WebServer ~]# sort -r users
            使用空格把users文件分割 使用第3列排序
            [root@WebServer ~]# sort -t" " -k3 users
            使用空格把users文件分割 使用第3列排序 去掉重復行
            [root@WebServer ~]# sort -t" " -k3 -u users
            按數值排序 而不是按字符排序
            [root@WebServer ~]# sort -t" " -k3 -n users

uniq命令:對文本中的連續的重復行進行操作
    uniq [OPTION]... [FILE]...
        -c: 顯示每行重復出現的次數;
        -d: 僅顯示重復過的行;
        -u: 僅顯示不曾重復的行;
        例子:(這裏的uniqtest是一個文件)
        連續重復的行只顯示一行
        [root@WebServer ~]# uniq uniqtest
        只顯示重復的行
        [root@WebServer ~]# uniq -d uniqtest 
        顯示全部重復的行
        [root@WebServer ~]# uniq -D uniqtest  
        顯示重復次數
        [root@WebServer ~]# uniq -c uniqtest

練習:以冒號分隔,取出/etc/passwd文件的第6至第10行,並將這些信息按第3個字段的數值大小進行排序;最後僅顯示的各自的第1個字段;

13.用戶和組管理

資源分派:
    Authentication:認證
    Authorization:授權
    Accouting:審計
        Audition

    token, identity(username/password)  

Linux用戶:Username/UID
    管理員:root, 0
    普通用戶:1-65535
        系統用戶:1-499, 1-999
            對守護進程獲取資源進行權限分配;
        登錄用戶:500+, 1000+
            交互式登錄;

Linux組:Groupname/GID
    管理員組:root, 0
    普通組:
        系統組:1-499, 1-999
        普通組:500+, 1000+

Linux安全上下文:
    運行中的程序:進程 (process)

        以進程發起者的身份運行:
            root: cat
            tom: cat

        進程所能夠訪問的所有資源的權限取決於進程的發起者的身份;

Linux組的類別:
    用戶的基本組(主組):
        組名同用戶名,且僅包含一個用戶:私有組
    用戶的附加組(額外組):

Linux用戶和組相關的配置文件:
    /etc/passwd:用戶及其屬性信息(名稱、UID、基本組ID等等);
    /etc/group:組及其屬性信息;
    /etc/shadow:用戶密碼及其相關屬性;
    /etc/gshadow:組密碼及其相關屬性;

/etc/passwd:
    name:password:UID:GID:GECOS:directory:shell

    用戶名:密碼:UID:GID:GECOS:主目錄:默認shell

/etc/group:
    group_name:password:GID:user_list

    組名:組密碼:GID:以當前組為附加組的用戶列表(分隔符為逗號)

/etc/shadow
    用戶名:加密了的密碼:最近一次更改密碼的日期:密碼的最小使用期限:最大密碼使用期限:密碼警告時間段:密碼禁用期:賬戶過期日期:保留字段

        加密機制:
            加密:明文--> 密文
            解密:密文--> 明文

            單向加密:提取數據指紋
                md5: message digest, 128bits
                sha1: secure hash algorithm, 160bits
                sha224: 224bits
                sha256: 256bits
                sha384: 384bits
                sha512: 512bits

                雪崩效應:初始的條件的微小改變,將會引起結果的巨大改變;
                定長輸出:

        密碼的復雜性策略:
            1、使用數字、大寫字母、小寫字母及特殊字符中至少3種;
            2、足夠長;
            3、使用隨機密碼;
            4、定期更換;不要使用最近曾經使用過的密碼;

用戶和組相關的管理命令:
    用戶創建:useradd
        useradd [options] LOGIN
            -u UID: [UID_MIN, UID_MAX], 定義在/etc/login.defs
            -g GID:指明用戶所屬基本組,可為組名,也可以GID;
            -c "COMMENT":用戶的註釋信息;
            -d /PATH/TO/HOME_DIR: 以指定的路徑為家目錄;
            -s SHELL: 指明用戶的默認shell程序,可用列表在/etc/shells文件中;
            -G GROUP1[,GROUP2,...[,GROUPN]]]:為用戶指明附加組;組必須事先存在;
            -r: 創建系統用戶
                CentOS 6: ID<500
                CentOS 7: ID<1000

        默認值設定:/etc/default/useradd文件中
            useradd -D 
                -s SHELL

    練習:創建用戶gentoo,附加組為distro和linux,默認shell為/bin/csh,註釋信息為"Gentoo Distribution"; 

組創建:groupadd
    groupadd [OPTION]... group_name

        -g GID: 指明GID號;[GID_MIN, GID_MAX]
        -r: 創建系統組;
            CentOS 6: ID<500
            CentOS 7: ID<1000

查看用戶相關的ID信息:id
    id [OPTION]... [USER]
        -u: UID
        -g: GID
        -G: Groups
        -n: Name

切換用戶或以其他用戶身份執行命令:su
    su [options...] [-] [user [args...]]

        切換用戶的方式:
            su UserName:非登錄式切換,即不會讀取目標用戶的配置文件;
            su - UserName:登錄式切換,會讀取目標用戶的配置文件;完全切換;

            Note:root su至其他用戶無須密碼;非root用戶切換時需要密碼;

        換個身份執行命令:
            su [-] UserName -c ‘COMMAND‘

        選項:
            -l:“su -l UserName”相當於“su - UserName”

用戶屬性修改:usermod
    usermod [OPTION] login

        -u UID: 新UID
        -g GID: 新基本組
        -G GROUP1[,GROUP2,...[,GROUPN]]]:新附加組,原來的附加組將會被覆蓋;若保留原有,則要同時使用-a選項,表示append;
        -s SHELL:新的默認SHELL;
        -c ‘COMMENT‘:新的註釋信息;
        -d HOME: 新的家目錄;原有家目錄中的文件不會同時移動至新的家目錄;若要移動,則同時使用-m選項;
        -l login_name: 新的名字;

        -L: lock指定用戶
        -U: unlock指定用戶

        -e YYYY-MM-DD: 指明用戶賬號過期日期;
        -f INACTIVE: 設定非活動期限;

給用戶添加密碼:passwd
    passwd [OPTIONS] UserName: 修改指定用戶的密碼,僅root用戶權限
    passwd: 修改自己的密碼;

        常用選項:
            -l: 鎖定指定用戶
            -u: 解鎖指定用戶

            -n mindays: 指定最短使用期限
            -x maxdays:最大使用期限
            -w warndays:提前多少天開始警告
            -i inactivedays:非活動期限;

            --stdin:從標準輸入接收用戶密碼;
                echo "PASSWORD" | passwd --stdin USERNAME

            Note: /dev/null, bit buckets
                  /dev/zero, 

刪除用戶:userdel
    userdel [OPTION]... login
        -r: 刪除用戶家目錄;

組屬性修改:groupmod
    groupmod [OPTION]... group
        -n group_name: 新名字
        -g GID: 新的GID;

組刪除:groupdel
    groupdel GROUP

組密碼:gpasswd
    gpasswd [OPTION] GROUP

        -a user: 將user添加至指定組中;
        -d user: 刪除用戶user的以當前組為組名的附加組

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

    newgrp命令:臨時切換基本組;
        如果用戶本不屬於此組,則需要組密碼;

修改用戶屬性:chage
    chage [OPTION]... LOGIN
        -d LAST_DAY
        -E, --expiredate EXPIRE_DATE
        -I, --inactive INACTIVE
        -m, --mindays MIN_DAYS
        -M, --maxdays MAX_DAYS
        -W, --warndays WARN_DAYS

其它命令:chfn, chsh, finger

命令總結:useradd, groupadd, su, id, usermod, userdel, groupmod, groupdel, passwd, newgrp, pwck, gpasswd, chage, chsh, chfn, finger

14.權限管理:

文件的權限主要針對三類對象進行定義:
    owner: 屬主, u
    group: 屬組, g
    other: 其他, o

每個文件針對每類訪問者都定義了三種權限:
    r: Readable
    w: Writable
    x: eXcutable

    文件:
        r: 可使用文件查看類工具獲取其內容;
        w: 可修改其內容;
        x: 可以把此文件提請內核啟動為一個進程;

    目錄:
        r: 可以使用ls查看此目錄中文件列表;
        w: 可在此目錄中創建文件,也可刪除此目錄中的文件;
        x: 可以使用ls -l查看此目錄中文件列表,可以cd進入此目錄;

    --- 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-----
        rwxr-xr-x: 755

修改文件權限:chmod
    chmod [OPTION]... OCTAL-MODE FILE...

        -R: 遞歸修改權限

    chmod [OPTION]... MODE[,MODE]... FILE...
        MODE:
            修改一類用戶的所有權限:
                u=
                g=
                o=
                ug=
                a=
                u=,g=

            修改一類用戶某位或某些位權限
                u+
                u-

    chmod [OPTION]... --reference=RFILE FILE...
        參考RFILE文件的權限,將FILE的修改為同RFILE;

修改文件的屬主和屬組:
    僅root可用;

    修改文件的屬主:chown
        chown [OPTION]... [OWNER][:[GROUP]] FILE...

            用法:
                OWNER
                OWNER:GROUP
                :GROUP

                Note: 命令中的冒號可用.替換;

            -R: 遞歸

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

    修改文件的屬組:chgrp
        chgrp [OPTION]... GROUP FILE...
        chgrp [OPTION]... --reference=RFILE FILE...

        -R

文件或目錄創建時的遮罩碼:umask
    FILE: 666-umask
        Note: 如果某類的用戶的權限減得的結果中存在x權限,則將其權限+1
    DIR: 777-umask  

    umask: 查看
    umask #: 設定

命令總結:chmod, chown, chgrp, umask


15.grep及正則表達式:

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 -E, egrep

            正則表達式引擎

            grep [OPTIONS] PATTERN [FILE...]

                    選項:
                        --color=auto: 對匹配到的文本著色顯示;
                        -v: 顯示不能夠被pattern匹配到的行;
                        -i: 忽略字符大小寫;
                        -o: 僅顯示匹配到的字符串;
                        -q: 靜默模式,不輸出任何信息;
                        -A #:after, 後#行
                        -B #: before, 前#行
                        -C #:context, 前後各#行

                        -E:使用ERE;

    基本正則表達式元字符:
        字符匹配:
            .:  匹配任意單個字符;
            []: 匹配指定範圍內的任意單個字符
            [^]:匹配指定範圍外的任意單個字符
                [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

        匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數;
            *:匹配前面的字符任意次;
                例如: grep "x*y" 
                    abxy
                    xay
                    xxxxxxy

                貪婪模式
            .*:任意長度的任意字符;
            \?:匹配其前面的字符0或1次;即前面的可有可無;
            \+:匹配其前面的字符至少1次;
            \{m\}:匹配前面的字符m次;
            \{m,n\}:匹配前面的字符至少m次,至多n次;
                \{0,n\}:匹配前面的字符至多n次;
                \{m,\}:匹配前面的字符至少m次;

        位置錨定:
            ^:行首錨定;用於模式的最左側;
            $:行尾錨定;用於模式的最右側;
            ^PATTERN$: 用於模式匹配整行;
                ^$: 空行;
                ^[[:space:]]*$

            \< 或 \b:詞首錨定;用於單詞模式的左側;
            \> 或 \b:詞尾錨定;用於單詞模式的右側;
            \<PATTERN\>:匹配整個單詞;

        分組:
            \(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;
                \(xy\)*ab

            Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式為: \1, \2, \3, ...
                \1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
                    \(ab\+\(xy\)*\):
                        \1: ab\+\(xy\)*
                        \2: xy

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

練習:
    1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)

    2、顯示/etc/passwd文件中不以/bin/bash結尾的行;

    3、顯示/etc/passwd文件中ID號最大的用戶的用戶名;

    4、如果用戶root存在,顯示其默認的shell程序;
    # id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

    5、找出/etc/passwd中的兩位或三位數;
    # grep "\<[0-9]\{2,3\}\>" /etc/passwd

    6、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且後面存非空白字符的行;
    # grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

    7、找出"netstat -tan"命令的結果中以‘LISTEN‘後跟0、1或多個空白字符結尾的行;
    # netstat -tan | grep "LISTEN[[:space:]]*$"

    8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin);而後找出/etc/passwd文件中用戶名同shell名的行;
    # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

練習:
    1、寫一個腳本,實現如下功能
        如果user1用戶存在,就顯示其存在,否則添加之;
        顯示添加的用戶的id號等信息;
            #!/bin/bash
            id user1 &> /dev/null && echo "user1 exists." || useradd user1
            id user1

    2、寫一個腳本,完成如下功能
        如果root用戶登錄了當前系統,就顯示root用戶在線;否則說明其未登錄;

16.egrep及擴展的正則表達式

egrep = grep -E

egrep [OPTIONS] PATTERN [FILE...]

擴展正則表達式的元字符:
    字符匹配:
        .
        []
        [^]
    次數匹配:
        *
        ?: 0或1次;
        +:1次或多次;
        {m}:匹配m次;
        {m,n}:至少m,至多n次;
    錨定:
        ^
        $
        \<, \b
        \>, \b
    分組:
        ()

        後向引用:\1, \2, ...
    或者:
        a|b
            C|cat: C或cat

練習:
    1、顯示當前系統root、centos或user1用戶的默認shell和UID;
    # grep -E ‘^(root|centos|user1)\>‘ /etc/passwd | cut -d: -f1,3,7

    2、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞後面跟一個小括號的行;
    # grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions

    3、使用echo輸出一絕對路徑,使用egrep取出其基名;
    # echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1

    進一步地:使用egrep取出路徑的目錄名,類似於dirname命令的結果;

    4、找出ifconfig命令結果中1-255之間的數值;

    5、找出ifconfig命令結果中的IP地址;

fgrep:不支持正則表達式搜索;


17.vim編輯器

簡介
    vi: Visual Interface,文本編輯器

    文本:ASCII, Unicode

    文本編輯種類:
        行編輯器: sed
        全屏編輯器:nano, vi

    VIM - Vi IMproved

使用
    vim:模式化的編輯

        基本模式:
            編輯模式,命令模式
            輸入模式
            末行模式:
                內置的命令行接口

        打開文件:
            # vim [OPTION]... FILE...
                +#: 打開文件後,直接讓光標處於第#行的行首;
                +/PATTERN:打開文件後,直接讓光標處於第一個被PATTERN匹配到的行的行首;

        模式轉換:
            編輯模式 --> 輸入模式
                i: insert, 在光標所在處輸入;
                a: append, 在光標所在處後面輸入;
                o: 在當前光標所在行的下方打開一個新行;
                I:在當前光標所在行的行首輸入;
                A:在當前光標所在行的行尾輸入;
                O:在當前光標所在行的上方打開一個新行;
                c
                C

            輸入模式 --> 編輯模式
                ESC

            編輯模式 --> 末行模式
                :

            末行模式 --> 編輯模式
                ESC

        關閉文件:
            :q 退出
            :q! 強制退出,丟棄做出的修改;
            :wq 保存退出
            :x 保存退出
            :w /PATH/TO/SOMEWHERE

            ZZ: 保存退出;

    光標跳轉:

        字符間跳轉:
            h, j, k, l
                h: 左
                l: 右
                j: 下
                k: 上

            #COMMAND:跳轉由#指定的個數的字符;

        單詞間跳轉:
            w:下一個單詞的詞首
            e:當前或下一單詞的詞尾
            b:當前或前一個單詞的詞首

            #COMMAND:由#指定一次跳轉的單詞數

        行首行尾跳轉:
            ^: 跳轉至行首的第一個非空白字符;
            0: 跳轉至行首;
            $: 跳轉至行尾;

        行間移動:
            #G:跳轉至由#指定行;
            G:最後一行;
            1G, gg: 第一行;

        句間移動:
            )
            (

        段落間移動:
            }
            {

vim的編輯命令:

    字符編輯:
        x: 刪除光標處的字符;
        #x: 刪除光標處起始的#個字符;

        xp: 交換光標所在處的字符及其後面字符的位置;

    替換命令(r, replace)
        r: 替換光標所在處的字符

    刪除命令:
        d: 刪除命令,可結合光標跳轉字符,實現範圍刪除;
            d$: 
            d^:
            d0:

            dw
            de
            db

                #COMMAND

            dd: 刪除光標所在的行;
                #dd:多行刪除;

    粘貼命令(p, put, paste):
        p:緩沖區存的如果為整行,則粘貼當前光標所在行的下方;否則,則粘貼至當前光標所在處的後面;
        P:緩沖區存的如果為整行,則粘貼當前光標所在行的上方;否則,則粘貼至當前光標所在處的前面;

    復制命令(y, yank):
        y: 復制,工作行為相似於d命令;
            y$
            y0
            y^

            ye
            yw
            yb

                #COMMAND

            yy:復制行
                #yy: 復制多行;

    改變命令(c, change)
        c: 修改
            編輯模式 --> 輸入模式

            c$
            c^
            c0

            cb
            ce
            cw
                #COMMAND

            cc:刪除並輸入新內容
            #cc: 

    其它編輯操作

        可視化模式:
            v: 按字符選定
            V:按行行定

            Note:經常結合編輯命令;
                d, c, y

        撤消此前的編輯:
            u(undo):撤消此前的操作;
                #u: 撤消指定次數的操作;

        撤消此前的撤消:
            Ctrl+r

        重復前一個編輯操作:
            .

    翻屏操作:
        Ctrl+f: 向文件尾部翻一屏;
        Ctrl+b: 向文件首部翻一屏;

        Ctrl+d: 向文件尾部翻半屏;
        Ctrl+u:向文件首部翻半屏;

    vim自帶的練習教程:
        vimtutor

vim中的末行模式:
    內建的命令行接口

    (1) 地址定界
        :start_pos,end_pos
            #: 具體第#行,例如2表示第2行;
            #,#: 從左側#表示行起始,到右側#表示行結尾;
            #,+#: 從左側#表示的行起始,加上右側#表示的行數;
            .: 當前行
            $: 最後一行
                .,$-1
            %:全文, 相當於1,$

            /pat1/,/pat2/:
                從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結束;
                #,/pat/
                /pat/,$

        使用方式:
            後跟一個編輯命令
                d
                y
                w /PATH/TO/SOMEWHERE: 將範圍內的行另存至指定文件中;
                r /PATH/FROM/SOMEFILE:在指定位置插入指定文件中的所有內容;

    (2) 查找
        /PATTERN:從當前光標所在處向文件尾部查找;
        ?PATTERN:從當前光標所在處向文件首部查找;
            n:與命令同方向;
            N:與命令反方向;

    (3) 查找並替換
        s: 在末行模式下完成查找替換操作
            s/要查找的內容/替換為的內容/修飾符
                要查找的內容:可使用模式
                替換為的內容:不能使用模式,但可以使用\1, \2, ...等後向引用符號;還可以使用“&”引用前面查找時查找到的整個內容;
                修飾符:
                    i: 忽略大小寫
                    g: 全局替換;默認情況下,每一行只替換第一次出現;

            查找替換中的分隔符/可替換為其它字符,例如
                s@@@
                s###

        練習:
            1、復制/etc/grub2.cfg至/tmp/目錄,用查找替換命令刪除/tmp/grub2.cfg文件中的行首的空白字符;
                %s/^[[:space:]]\+//g

            2、復制/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令為/tmp/functions的每行開頭為空白字符的行的行首添加一個#號;
                :%s/^[[:space:]]/#&/

    多文件模式:
        vim FILE1 FILE2 FILE3 ...
            :next 下一個
            :prev 前一個
            :first 第一個
            :last 最後一個

            :wall 保存所有
            :qall 退出所有

    窗口分隔模式:
        vim -o|-O FILE1 FILE2 ...
            -o: 水平分割
            -O: 垂直分割

            在窗口間切換:Ctrl+w, Arrow

    單文件窗口分割:
        Ctrl+w,s: split, 水平分割
        Ctrl+w,v: vertical, 垂直分割

    定制vim的工作特性:
        配置文件:永久有效
            全局:/etc/vimrc
            個人:~/.vimrc

        末行:當前vim進程有效

        (1) 行號
            顯示:set number, 簡寫為set nu
            取消顯示:set nonumber, 簡寫為set nonu
        (2) 括號匹配
            匹配:set showmatch, 簡寫為set sm
            取消:set nosm
        (3) 自動縮進
            啟用:set ai
            禁用:set noai
        (4) 高亮搜索
            啟用:set hlsearch
            禁用:set nohlsearch
        (5) 語法高亮
            啟用:syntax on
            禁用:syntax off
        (6) 忽略字符的大小寫
            啟用:set ic
            不忽略:set noic

        獲取幫助:
            :help 
            :help subject

    問題:如何設置tab縮進為4個字符?

    練習:
        1、復制/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init為/var/log;
        2、刪除/tmp/functions文件中所有以#開頭,且#後面至少有一個空白字符的行的行首的#號;


18.文件查找:

在文件系統上查找符合條件的文件;

文件查找:locate, find
    非實時查找(數據庫查找):locate
    實時查找:find

locate:
    依賴於事先構建的索引;索引的構建是在系統較為空閑時自動進行(周期性任務);手動更新數據庫(updatedb);

    索引構建過程需要遍歷整個根文件系統,極消耗資源;

    工作特點:
        查找速度快;
        模糊查找;
        非實時查找;

    locate KEYWORD

find:
    實時查找工具,通過遍歷指定路徑下的文件系統完成文件查找;

    工作特點:
        查找速度略慢;
        精確查找;
        實時查找;

    語法:
        find [OPTION]... [查找路徑] [查找條件] [處理動作]
            查找路徑:指定具體目標路徑;默認為當前目錄;
            查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件;
            處理動作:對符合條件的文件做什麽操作;默認輸出至屏幕;

            查找條件:
                根據文件名查找:
                    -name "文件名稱":支持使用glob
                        *, ?, [], [^]
                    -iname "文件名稱":不區分字母大小寫

                    -regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱;

                根據屬主、屬組查找:
                    -user USERNAME:查找屬主為指定用戶的文件;
                    group GRPNAME: 查找屬組為指定組的文件;

                    -uid UserID:查找屬主為指定的UID號的文件;
                    -gid GroupID:查找屬組為指定的GID號的文件;

                    -nouser:查找沒有屬主的文件;
                    -nogroup:查找沒有屬組的文件;

                根據文件類型查找:
                    -type TYPE:
                        f: 普通文件
                        d: 目錄文件
                        l: 符號鏈接文件
                        s:套接字文件
                        b: 塊設備文件
                        c: 字符設備文件
                        p: 管道文件

                組合條件:
                    與:-a
                    或:-o
                    非:-not, !

                    !A -a !B = !(A -o B)
                    !A -o !B = !(A -a B)

                    找出/tmp目錄下,屬主不是root,且文件名不是fstab的文件;
                        find /tmp \( -not -user root -a -not -name ‘fstab‘ \) -ls
                        find /tmp -not \( -user root -o -name ‘fstab‘ \) -ls

                根據文件大小來查找:
                    -size [+|-]#UNIT
                        常用單位:k, M, G

                        #UNIT: (#-1, #]
                        -#UNIT:[0,#-1]
                        +#UNIT:(#,oo)

                根據時間戳:
                    以“天”為單位;
                        -atime [+|-]#,  
                            #: [#,#+1)
                            +#: [#+1,oo]
                            -#: [0,#)
                        -mtime
                        -ctime

                    以“分鐘”為單位:
                        -amin
                        -mmin
                        -cmin

                根據權限查找:
                    -perm [/|-]MODE
                        MODE: 精確權限匹配
                        /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可;
                        -MODE:每一類對象都必須同時擁有為其指定的權限標準;

            處理動作:
                -print:默認的處理動作,顯示至屏幕;
                -ls:類似於對查找到的文件執行“ls -l”命令;
                -delete:刪除查找到的文件;
                -fls /path/to/somefile:查找到的所有文件的長格式信息保存至指定文件中;
                -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;
                    對於每個文件執行命令之前,都會交互式要求用戶確認;
                -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令; 
                    {}: 用於引用查找到的文件名稱自身;

                註意:find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令;
                有些命令不能接受過多參數,此時命令執行可能會失敗;另一種方式可規避此問題:
                    find | xargs COMMAND 

    練習:
        1、查找/var目錄下屬主為root,且屬組為mail的所有文件或目錄;
            # find /var -user root -group mail

        2、查找/usr目錄下不屬於root、bin或hadoop的所有文件或目錄;
            # find /usr -not -user root -a -not -user bin -a -not -user hadoop
            # find /usr -not \( -user root -o -user bin -o -user hadoop \)

        3、查找/etc目錄下最周一周內其內容修改過,同時屬主不為root,也不是hadoop的文件或目錄;
            # find /etc -mtime -7 -a -not -user root -a -not -user hadoop
            # find /etc/ -mtime -7 -a -not \( -user root -o -user hadoop \)

        4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件或目錄;
            # find / -nouser -a -nogroup -a -atime -7

        5、查找/etc目錄下大於1M且類型為普通文件的所有文件;
            # find /etc -size +1M -type f

        6、查找/etc目錄下所有用戶都沒有寫權限的文件;
        # find /etc -not -perm /222

        7、查找/etc目錄下至少有一類用戶沒有執行權限的文件;
        # find /etc -not -perm -111

        8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件;
        # find /etc/init.d -perm -113

19.Linux文件系統上的特殊權限

SUID, SGID, Sticky

1 權限
    r, w, x

    user, group, other

2 安全上下文
    前提:進程有屬主和屬組;文件有屬主和屬組;
    (1) 任何一個可執行程序文件能不能啟動為進程:取決發起者對程序文件是否擁有執行權限;
    (2) 啟動為進程之後,其進程的屬主為發起者;進程的屬組為發起者所屬的組;
    (3) 進程訪問文件時的權限,取決於進程的發起者:
        (a) 進程的發起者,同文件的屬主:則應用文件屬主權限;
        (b) 進程的發起者,屬於文件的屬組;則應用文件屬組權限;
        (c) 應用文件“其它”權限;

3 SUID
    (1) 任何一個可執行程序文件能不能啟動為進程:取決發起者對程序文件是否擁有執行權限;
    (2) 啟動為進程之後,其進程的屬主為原程序文件的屬主;

    權限設定:
        chmod u+s FILE... 
        chmod u-s FILE...

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

    權限設定:
        chmod g+s DIR...
        chmod g-s DIR...

5 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

    幾個權限位映射:
        SUID: user, 占據屬主的執行權限位;
            s: 屬主擁有x權限
            S:屬主沒有x權限
        SGID: group,  占據group的執行權限位;
            s: group擁有x權限
            S:group沒有x權限            
        Sticky: other, 占據ohter的執行權限位;
            t: other擁有x權限
            T:other沒有x權限

一篇文章帶你入門Linux——馬哥Linux基礎學習筆記