第二周学习收获

bash基础特性及基础命令(02)_recv

bash的基礎特性(1):

(1) 命令歷史
    history
        環境變量:
            HISTSIZE: 命令歷史記錄的條數;
            HISTFILE: ~/.bash_history;
            HISTFILESIZE: 命令歷史文件記錄歷史的條數;

        history -d OFFSET
        -c
        history #: 顯示歷史中最近的#條命令;
        -a: 手動追加當前會話緩衝區的命令歷史至歷史文件中;

    調用歷史中的命令:
        !#: 重複執行第#條指令;
        !!:
        !string:

    調用上一條命令的最後一個參數:
        !$:
        ESC, .
        Alt+.

    控制命令歷史的記錄方式:
        環境變量: HISTCONTROL
            ignoredups: 忽略重複的命令;連續且相同方位“重複”;
            ignorespace: 忽略所有以空白開頭的命令;
            ignoreboth: ignoredups, ignorespace;

        修改環境變量值的方式:export 變量名=“值”
            變量賦值:把賦值符號后面的數據存儲于變量名指向的內存空間;

(2) 命令補全
    bash執行命令:
        內部命令:
        外部命令: bash根據PATH環境變量定義的路徑,自左而右在每個路徑搜尋以給定命令名命名的文件,第一次找到的即為要執行的命令;

            直接補全: Tab, 用戶給定的字符串只有一條唯一對應的命令;
            以用戶給定的字符串為開頭對應的命令不唯一,則再次Tab會給出列表;

(3) 路徑補全
    把用戶給出的字符串當做路徑開頭,并在其指定上級目錄下搜索以指定的字符串開頭的文件名;
        如果唯一: 則直接補全;
        否則: 再次Tab, 給出列表;

(4) 命令行展開
    ~: 展開為用戶的主目錄
    ~USERNAME: 展開為指定用戶的主目錄
    {}: 可承載一個以逗號分隔的列表,并將其展開為多個路徑
        /tmp/{a,b} = /tmp/a, /tmp/b
        /tmp/{tom,jerry}/hi = /tmp/tom/hi, /tmp/jerry/hi

(5) 命令的執行狀態結果
    成功
    失敗

    bash使用特殊變量$?保存最近一條命令的執行狀態結果
        echo $?:
            0: 成功
            1-255: 失敗

    程序執行有兩類結果:
        程序的返回值;
        程序的執行狀態結果;

目錄管理類命令:
cd, pwd, ls

mkdir, rmdir, tree

mkdir /etc/a/b/c/d

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

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

rmdir: 刪除空目錄
    rmdir [POTION]... 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}}

文本文件查看類命令:
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: 跟蹤顯示文件新追加的內容;

文件的時間戳管理工具:
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: 如果文件不存在,則不予創建

第04天【文件管理、管道、用户及组管理、用户及权限管理】

文件管理、命令别名和glob(01)_recv

回顧:
文件系統、 bash的基礎特性、 目錄管理及文件查看

    文件系統:
        boot, bin, sbin, lib, lib64, dev, home, root, mnt, media, etc, proc, sys
        usr
        var

    bash的基礎特性:
        命令補全
        路徑補全
        命令歷史
        命令行展開:
            ~, {}
        命令的狀態結果
            成功:0
            失敗:1-255

    目錄管理: mkdir, rmdir

    文件查看: more, less, tail, head

    時間戳管理: touch
        -a, -m, -t
        -c

文件管理:
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是目錄: 則創建指定目錄,并複製SRC目錄中所有文件至DEST中;

    常用選項:
        -i: 交互式
        -r, -R: 遞歸複製目錄及內部的所有內容;
        -a: 歸檔,相當於-dR --preserve=all
            -d: --no-dereference --preserve=links
            --preserve[=ATTR_LIST]
                mode: 權限
                ownership: 屬主屬組
                timestamp: 時間戳
                links: 鏈接屬性
                xattr: 擴展文件屬性
                context: 安全上下文
                all: 包含以上所有

        -p: --preserve=mode,ownership,timestamps
        -v: --verbose
        -f: --force

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

   如果SRC是單個文件:
       如果DEST不存在:

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

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

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

        rm -rf

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

bash的基礎特性(2):

1、 命令別名(alias)
    通過alias命令實現:
        (1) alias
            顯示當前shell進程所有可用的命令別名;
        (2) alias NAME=‘VALUE‘
            定義別名NAME, 其相當於執行命令VALUE;

        注意: 在命令行中定義的別名,僅對當前shell進程有效;如果想永久有效,要定義在配置文件中;
            僅對當前用戶有效: ~/.bashrc
            對所有用戶有效: /etc/bashrc

            Note: 編輯配置給出的新配置不會立即生效;

            bash進程重新讀取配置文件
                source /path/to/config_file
                .  /path/to/config_file

    撤銷別名: unalias
        unalias [-a] name [name...]

    Note: 如果別名同原命令的名稱,則如果要執行原命令,可使用"/COMMAND";

2、 glob (globbing)
    bash中用於實現文件名“通配”

        通配符: *, ?, []

        (1) *
            任意長度的任意字符
                a*b:
                    aab, ab, a123b
                    abc
        (2) ?
            任意單個字符
                a?b:
                    aab
                    ab, a12b, abc
        (3) []
            匹配指定範圍內的任意單個字符
                [0-9]
                [a-z]: 不區分字符大小寫
                [A-Z]: 大寫字母
        (4) [^]
            匹配指定範圍外的任意單個字符
                [^0-9]

        專用字符集合:
            [:digit:]: 任意數字,相當於0-9
            [:lower:]: 任意小寫字母
            [:upper:]: 任意大寫字母
            [:alpha:]: 任意大小寫字母
            [:alnum:]: 任意數字或字母
            [:space:]: 空格字符
            [:punct:]: 標點符號

        [:alnum:]  [:alpha:]  [:blank:]  [:cntrl:]
        [:digit:]  [:graph:]  [:lower:]  [:print:]
        [:punct:]  [:space:]  [:upper:]  [:xdigit:]

    練習:
    1、 顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄;
        # ls -d /var/l*[0-9]*[[:lower:]]

    2、 顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄;
        # ls -d /etc/[0-9]*[^0-9]

    3、 顯示/etc目錄下,以非字母開頭,後面跟了一個字母及其它任意長度任意字符的文件或目錄;
        # ls -d /etc/[^[:alpha:]]*[[:alpha:]]*

    4、 複製/etc目錄下,所有以m開頭,以非數字結尾的文件或目錄至/tmp/mageedu目錄中;
        # cp -a /etc/m*[^0-9] /tmp/mageedu

    5、 複製/etc目錄下,所有以.d結尾的文件或目錄至/tmp/magedu.com目錄中;
        # cp -a /etc/*.d /tmp/magedu.com

    6、 複製/etc目錄下,所有以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/mageedu.com目錄中;
        # cp -a /etc/[mnrp]*.conf /tmp/mageedu.com

IO重定向、管道及文本处理工具(02)_recv

3、 bash的快捷鍵

    Ctrl+l: 清屏,相當於clear命令;

    Ctrl+a: 跳轉至命令開始處;
    Ctrl+e: 跳轉至命令結尾處;

    Ctrl+c: 取消命令的執行;

    Ctrl+u: 刪除命令行首至光標所在處的所有內容;
    Ctrl+k: 刪除光標所在處至命令行尾部的所有內容;

4、 bash的I/O重定向及管道

    程序: 指令+數據
        輸入數據: Input
        輸出數據: Output

    打開的文件都有一個fd: file descriptor(文件描述符)

    標準輸入: keyboard, 0
    標準輸出: monitor, 1
    標準錯誤輸出: monitor, 2

    I/O重定向:改變標準位置

    輸出重定向: COMMAND > NEW_POS, COMMAND >> NEW_POS
        >: 覆蓋重定向,目標文件中的原有內容會被清除;
        >>: 追加重定向,新內容會追加至目標文件尾部;

        # set -C: 禁止將內容覆蓋輸出至已有文件中;
            強制覆蓋: >|
        # set +C: 允許將內容覆蓋輸出至已有文件中;   

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

        標準輸出和錯誤輸出各自定向至不同位置;
            COMMAND > /path/to/file.out 2> /path/to/error.out

        合併標準輸出和錯誤輸出為同一個數據流進行重定向;
            &>: 覆蓋重定向
            &>>: 追加重定向

            COMMMAND > /path/to/file.out 2> &1
            COMMAND >> /path/to/file.out 2>> &1

    輸入重定向: <

        tr命令: 轉換或刪除字符
            tr [OPTION]... SET1 [SET2]

    HERE Documentation: <<
        # cat << DOF
        # cat > /path/to/somefile << EOF

管道:
    COMMAND1 | COMMAND2 | COMMAND3 |...

    Note: 最後一個命令會在當前shell進程的子shell進程中執行;

    tee命令:
        tee [OPTION]... [FILE]...

練習:
    1、 將/etc/passwd文件中的前5行內容轉換為大寫后保存至/tmp/passwd.out文件中;
        # head -n 5 /etc/passwd | tr ‘a-z‘ ‘A-Z‘ > /tmp/passwd.out

    2、 將登錄至當前系統上用戶信息中的后3行的信息轉換為大寫后保存至/tmp/who.out文件中;
        # who | tail -n 3 | tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out

文件處理工具: wc, cut, sort, uniq

wc命令:
    wc [OPTION]... [FILE]...
        -l: lines
        -w: words
        -c: characters

cut命令:
    cut OPTION... [FILE]...
        -d DELIMITER: 指明分隔符
        -f FIELDS:
            #: 第#個字段
            #,#[,#]: 離散的多個字段,例如1,3,6
            #-#: 連續的多個字段,例如1-6

            混合使用: 1-3,7
        --output-delimiter=STRING

sort命令:
    sort [OPTION]... [FILE]...
        -f: 忽略字符大小寫
        -r: 逆序
        -t DELIMITER: 字段分隔符
        -k #: 以指定字段為標準排序
        -n: 以數值大小進行排序
        -u: uniq, 排序后去重

uniq命令:
    uniq [OPTION]... [INPUT [OUTPUT]]
        -c: 顯示每行重複出現的次數;
        -d: 僅顯示重複過的行;
        -u: 僅顯示未曾重複的行;

    Note: 連續且完全相同方為重複

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

用户及组管理(03)_recv

回顧:
文件管理命令、 bash的基礎特性、 文本管理命令

文件管理命令: cp, mv, rm

bash基礎特性: alias/unalias, glob(*, ?, [], [^]), 快捷鍵

IO重定向、 管道:
    標準輸出重定向: >, >>
    標準錯誤重定向: 2>, 2>>
    將二者合二為一: &>, &>>
                   COMMAND > /path/to/somefile.out 2> &1

    輸入重定向: <
        顯式使用: tr
        隱式使用: ...

    管道: COMMAND1 | COMMAND2 | ...

文本處理命令: wc, cut, sort, uniq

用戶和組管理
資源分派:
Authentication: 認證
Authorization: 授權
Accounting: 審計
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

    用戶名:密碼(佔位符x):UIE:GID:GECOS:主目錄:默認shell

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

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

/etc/shadow:
    login name:用戶名;
    encrypted password:加密了的密碼;
    date of last password change:最近一次更改密碼的日期;
    minimum password age:密碼的最小使用期限;
    maximum password age:密碼的最大使用期限;
    password warning period:密碼警告時間段;
    password inactivity period:密碼禁用期;
    account expiration date:賬戶過期日期;
    reserved field:保留字段;

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

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

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

                redhatioturio
                redhat8t43bie

                $6$wBHlaP.PYvVIvyAY$E0OcbhiclbYzhucWLr3mWzU4itjNiLsOoWEPCspOkXlD3wMqU307gNB1eIvv7sYj3nsnigJAwxmJ2I/9Wk1ge1

        密碼的複雜性策略:
            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";

用户及权限管理(04)_recv

組創建: 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 [options] 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 [options] LOGIN
        -r: 刪除用戶家目錄;

組屬性修改: groupmod
    groupmod [options] GROUP
        -n group_name: 新名字
        -g GID: 新的GID;

組刪除: groupdel
    groupdel [options] GROUP

組密碼:gpasswd
    gpasswd [option] group

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

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

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

修改用戶屬性: chage
    chage [options] LOGIN
        -d, --lastday 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

權限管理:

文件的權限主要針對三類對象進行定義:
    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
        chown [OPTION]... [OWNER][:[GROUP]] FILE...
        chown [OPTION]... --reference=RFILE FILE...

            -R: 遞歸

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

    umask: 查看
    umask #: 設定

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

第05天(半天)【shell编程初步、grep及正则表达式】

shell编程初步(01)_recv

回顧:
文件管理、 用戶管理、 權限管理、 bash的基礎特性
文件管理: cp, mv, rm
用戶管理:
useradd, usermod, chsh, chfn, chage, userdel
groupadd, groupmod, groupdel
passwd, gpasswd, pwck
id, finger, who, whoami, w
su
配置文件: /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow
權限管理:
perm: mode(rwxrwxrwx), ownership
chmod
chown
chgrp
-R, --reference=RFILE

            FILE: 666-umask
            DER: 777-umask

            umask [UMASK]

bash基礎特性:
    命令行展開: ~, {}
    命令別名: alias/unalias
    命令歷史: history
    命令和路徑補全: $PATH
    glob: *, ?, [], [^]
    快捷鍵: Ctrl={a,e,l,c,u,k}
    命令hash: hash

bash的基礎特性(3)
1、 提供了編程環境

    程序: 指令+數據

    程序編程風格:
        過程式: 以指令為中心,數據服務于指令
        對象式: 以數據為中心,指令服務于數據

    shell程序: 提供了編程能力,解釋執行

    程序的執行方式:
        計算機: 運行二進制指令;
        編程語言:
            低級: 彙編
            高級:
                編譯: 高級語言-->編譯器-->目標代碼
                    C、 C++,java
                解釋: 高級語言-->解釋器-->機器代碼
                    shell, perl, python

    過程式編程:
        順序執行
        循環執行
        選擇執行

        shell編程: 過程式、 解釋執行
            編程語言的基本結構:
                數據存儲: 變量、 數組
                表達式
                語句

shell腳本: 文本文件
    shebang機制:
    #!/bin/bash
    #!/usr/bin/python
    #!/usr/bin/perl

    ls /etc

    magic number: 魔數

    運行腳本:
        1、 給予執行權限,通過具體的文件路徑指定文件執行;
        2、 直接運行解釋器,將腳本作為解釋器程序的參數運行;

變量:
    命名的內存空間:

    數據存儲方式: ASCII
        字符: 110: 24
        數值: 110 --> 8
            整型
            浮點型

            110+12=122
                11012

            110*10=1100
                110110110110110110110110110110

    變量: 變量類型
        作用:
            1、 數據存儲格式;
            2、 參與的運算;
            3、 表示的數據範圍;

        類型:
            字符
            數值:
                整型
                浮點型
                不二型

        編程語言:
            強類型:
            弱類型: bash
                把所有要存儲的數據統統當做字符進行
                不支持浮點數;

        邏輯運算:
            true, false
              1  ,  0

            與:
                1 && 1 = 1
                1 && 0 = 0
                0 && 1 = 0
                0 && 0 = 0
            或:
                1 || 1 = 1
                1 || 0 = 1
                0 || 1 = 1
                0 || 0 = 0
            非:
                ! 1 = 0
                ! 0 = 1
            異或:
                兩個數值相同則為假,不同則為真;

        短路運算:
            與:
                第一個為0,結果必定為0;
                第一個為1,第二個必須要參與運算;
            或:
                第一個為1,結果必定為1;
                第一個為0,第二個必須要參與運算;

grep及正则表达式(02)_recv

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:]
        匹配次數: 用在要指定次數的字符後面,用於指定前面的字符要出現的次數;
            * : 匹配前面的字符任意次(包括0次);
                例如: grep "x*y"
                    abxy
                    xay
                    xxxxxxy
                    x
                    y

                貪婪模式
            .*: 任意長度的任意字符;
            \?: 匹配其前面的字符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開頭的行;(要求:使用兩種方式)
        # grep -i ‘^s‘ /proc/meminfo;
        # grep ‘^[Ss]‘ /proc/meminfo

    2、 顯示/etc/passwd文件中不以/bin/bash結尾的行;
        # grep -v ‘/bin/bash$‘ /etc/passwd

    3、 顯示/etc/passwd文件中ID號最大的用戶的用戶名;
        # sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1

    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/grub2.cfg文件中,至少以一個空白字符開頭的且後面存在非空白字符的行;
        # 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用戶在線;否則說明其未登錄;
        # w | grep "^root\>" &> /dev/null && echo "root logged" || echo "root not logged"

第06天【egrep、bash环境配置及脚本、vim编辑器】

egrep及bash中的变量(01)_recv

回顧: shell的基礎特性、 grep

shell:
    #!/bin/bash

    過程式: 以指令為中心
    對象式: 以數據為中心

grep: 文本過濾器
    PATTERN

    REGEXP:
        BRE、 ERE

    BRE:
        字符匹配: ., [], [^]
        次數匹配: *, \?, \+, \{m\}, \{m,n\}
        位置錨定: ^, $, \<, \b, \>, \b
        分組: \(\)
            後向引用: \1, \2, ...

    vim, sed, awk, nginx, 

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
            (C|c)at: 

練習:
    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取出其基名(basename);
        # echo ‘/mnt/sdc/‘ | grep -E -o ‘[^/]+/?$‘ | cut -d‘/‘ -f1
       進一步地:使用egrep取出路徑的目錄名,類似於dirname命令的結果;

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

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

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

bash的基礎特性(4)

變量類型:
    數據存儲格式、 存儲空間大小、 參與運算種類;

    字符型
    數值型:
        整型
        浮點型

    強類型: 定義變量時,必須指定類型;參與運算必須符合類型要求;调用未声明变量会产生错误
    弱類型: 定義變量時,無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;变量无需事先定义可直接调用
        bash

bash中的变量的种类:
     根据变量的生效范围等标准:
         本地变量:生效范围为当前shell进程:对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
         环境变量:生效范围为当前shell进程及其子进程
         局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
         位置变量:$1,$2...来表示,用于让脚本在脚本代码中调用通过命令行传递给他的参数
         特殊变量:$?,$0,$*,[email protected],$#

         本地变量:
             变量赋值:name=‘value
                可以使用引用:
                      value:
                          (1) 可以是直接字串:name="username"
                          (2) 变量引用:name="$username"
                          (3)命令引用:name=`command`,name=$(command)
             变量引用:$(name),$name
             "":弱引用,其中的变量引用会被替换为变量值
             ‘’:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
             显示已定义的所有变量:
               set
            销毁变量:
                  unset name
        环境变量:
            变量声明、赋值:
                export name=‘VALUE‘
                declare -x name=‘VALUE‘
            变量引用:$name, $(name)
            显示所有环境变量:
               export
               env
               printenv
            销毁变量:
              unset name

        bash有许多内建的环境变量:PATH,SHELL,UID,HISTSIZE,HOME,PWD,OLD,HISTFILE,PS1 ...
     变量命名法则 :
         1、 不能使程序中的保留字,例如if,for
         2、只能使用数字、字母及下划线,且不能以数字开头
         3、见名知义

    只读变量:
         readonly name
          declare -r name

    位置变量:
         在脚本代码中调用通过命令行传递给脚本的参数
         $1,$2, ...对应调用第1、第2等参数

            shift 【n】

         $0 : 命令本身

         $*:传递给脚本的所有参数
         [email protected]:传递给脚本的所有参数
         $#:传递给脚本的参数的个数

bash的配置文件:

  按生效范围划分,存在两类:

      全局配置:/etc/profile
                   etc/profile.d/*.sh
                /etc/bashrc

      个人配置:
             ~/.bash_profile
             ~/.bashrc

  按功能划分,存在两类:
       profile类:为交互式登陆的shell提供配置
       bashrc类:为非交互式登陆的shell提供配置

bash中的算术运算
+,-, *, /, %,
实现算术运算:
(1)let var=算术表达式
(2)var =$[算术表达式]
(3)var =$((算术表达式))
(4)var =$(expr arg1 arg2 arg3 ...)
乘法符号有些场景中需要转义

       bash有内奸的随机数生成器:$RANDOM

  增强型赋值:
     += ,-=, *= , /= , %=
      例如: let count+=1

  自增、自减:````

原文地址:http://blog.51cto.com/14127501/2334722

时间: 2024-10-12 12:40:16

第二周学习收获的相关文章

第二周学习收获和问题

  第二周学习的是计算机的硬件层部分.   第4章是门和电路,讲述了各种门是如何运作的,以及如何通过晶体管去构造门.把一个门的输出作为另一个门的输入可以把门组合成电路.还引出了CPU的概念.   第5章是计算部件,涉及到构成计算机的各种设备.它们各有特征,包括速度.大小和效率.   冯·诺依曼体系结构是当今大多数计算机的底层体系结构.有5个主要组成部分,读取--执行周期是这个处理过程的核心.   RAM和ROM是两种计算机内存的缩写.前者表示随机存取存储器,ROM表示只读存储器.二级存储设备可以

20165302第二周学习总结

第二周学习总结 学习内容 Ubuntu中命令行的使用 课本第二三章java代码的编译和运行 带包的代码编译运行 数据类型 (逻辑类型,整数类型,字符类型,浮点类型)的使用 预习第二三章的内容 第一周查漏补缺 第二周总结 通过第二周的学习我学到了很多新的东西,并解决了很多之前存在的问题,获得了比较大的收获,虽然其中还存在很多没有解决的问题,但我相信随着今后学习的推进,这些问题一定会得到解决. 预习内容 第二章 1.逻辑类型常量true,false,变量用Boolean声明,整数类型int型变量,使

王之泰201771010131《面向对象程序设计(java)》第二周学习总结

王之泰201771010131<面向对象程序设计(java)>第二周学习总结 第一部分:理论知识学习部分 第三章 第三章内容主要为Java语言的基础语法,主要内容如下 1.基础知识 1.1标识符 a)标识符可用作类名.变量名.方法名.数组名.文件名等. 注:第一个符号不能为数字,即不能用数字开头. 1.2关键字 a)关键字是Java语言中已经被赋予特定意义的一些单词. b)常见有:class.public.try.catch.if. float.import.void等. 注:关键字不做变量名

《Java程序设计》第二周学习总结

20175314 <Java程序设计>第二周学习总结 教材学习内容总结 我在APPstore上发现了一个可以支持我们在IOS系统上学习实践Java程序的开发环境,只需要购买专业版就可以使用,能够让我们随时随地地编辑.编译和运行代码 第二章:基本数据类型与数组 数据类型转换时,格式为(类型名)要转换的值,级别低的变量赋给级别高的变量时,系统会自动完成类型转换.但是当级别高的变量要赋给级别低的变量,就必须要用到类型转换运算. 输入数据:使用Scanner创建一个对象,比如Scanner reade

2019-2020-1学期 20192404 《网络空间安全导论》第二周学习总结

第二周学习总结 本周我们自学了计算机概论的四.五章的内容,四.五章向我们介绍了有关计算机硬件层的知识,通过这两章的学习我了解到了一些关于 门和电路 以及 计算部件的知识. /第四章门和电路/ 电路:电路是由相互关联的门的组合,用于实现特定的逻辑函数. 关于门和电路我同时也学到了三种不同的表示方法: 1.布尔代数:它是由英国数学家布尔发明的一种代数运算,它的表达式是演示电路活动的极好方式. 2.逻辑框图:它是电路的图形化表示.每种类型的门都由一个特定的图形符号来表示. 3.真值表:它列出了一种门可

20155336 2016-2017-2《JAVA程序设计》第二周学习总结

20155336 2016-2017-2 <JAVA 程序设计>第二周学习总结 教材学习内容 1: GIT版本检测 2: JAVA中基本类型 整数 字节 浮点数 字符 布尔(▲) 通过API可以得知各个类型可存储的数值范围 public class Range {public static void main(String[] args){ //byte.short.int.long的范围 System.out.printf("%d~%d%n", Byte.MIN_VALU

20145301第二周学习总结

20145301第二周学习总结 教材学习内容总结 3.1 类型.变量与运算符 整数 short 2字节,int 4字节,long 8字节 字节 byte 1字节 浮点数 float 4字节,double 8字节 字符 char 2字节(包括字母.汉字) 布尔 boolean 不用在意它的存储空间(只有true/false) 注释 // 单行注释,/ / 多行注释 下图为各类型范围: 常量定义 final加在定义类型之前,表示定义的该变量将不能改变其值,如 final int a=10; 局部变量

20145326《Java程序设计》第二周学习总结

20145326<Java程序设计>第二周学习总结 教材学习内容总结 本周学习教材第三章,本章主要讲述了java语言中的一些基础语法,java是个支持面向对象的程序语言,但在正式进入面向对象支持语法的探讨前,对于类型.变量.运算符.流程控制等,这些各种程序语言都会有的基本语法元素,还是要有一定的基础.虽然各种程序语言都有这些基本语法元素,但千万别因此而轻忽它们,因为各种程序语言都有其诞生的宗旨与演化过程,对这些基本语法元素,也就会有其独有的特性. 1. 类型 在java的世界中,并非每个东西都

2017面向对象程序设计(Java)第二周学习总结

2017面向对象程序设计(Java)第二周学习总结 直系学妹学弟们好!额...不要问我为什么把学妹放前面,我也不知道!我只是你们和蔼可亲的学长一枚而已.也不要问为什么是第二周学习总结而不是第一周,因为第一周学长正在家里吃西瓜吹空调.好了,闲言少叙.我先为你们介绍一下助教的职责,而后再对你们的学习情况进行总结! 身为你们本学期Java课程的助教...之一,我的任务是:指导你们学习,批改我所负责学习小组的实验作业.阅读博文并回复.其他学习小组会有另外三位助教负责.由于我们每周五都会汇总你们的情况,其