bash基礎特性及基礎命令(02)_recv java
bash的基礎特性(1):python
(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, lslinux
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, headnginx
more more [OPTIONS...] FILE... -d: 顯示翻頁及退出提示 less less [OPTIONS...] FILE... head head [OPTION]... [FILE]... -c #: 指定獲取前#字節 -n #: 指定獲取前#行 -#: tail tail [OPTION]... [FILE]... -c #: 指定獲取後#字節 -n #: 指定獲取後#行 -#: -f: 跟蹤顯示文件新追加的內容;
文件的時間戳管理工具:
touchgit
文件: 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)_recvshell
回顧:
文件系統、 bash的基礎特性、 目錄管理及文件查看express
文件系統: 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):vim
一、 命令別名(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"; 二、 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:] 練習: 一、 顯示/var目錄下全部以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄; # ls -d /var/l*[0-9]*[[:lower:]] 二、 顯示/etc目錄下,以任意一位數字開頭,且以非數字結尾的文件或目錄; # ls -d /etc/[0-9]*[^0-9] 三、 顯示/etc目錄下,以非字母開頭,後面跟了一個字母及其它任意長度任意字符的文件或目錄; # ls -d /etc/[^[:alpha:]]*[[:alpha:]]* 四、 複製/etc目錄下,全部以m開頭,以非數字結尾的文件或目錄至/tmp/mageedu目錄中; # cp -a /etc/m*[^0-9] /tmp/mageedu 五、 複製/etc目錄下,全部以.d結尾的文件或目錄至/tmp/magedu.com目錄中; # cp -a /etc/*.d /tmp/magedu.com 六、 複製/etc目錄下,全部以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/mageedu.com目錄中; # cp -a /etc/[mnrp]*.conf /tmp/mageedu.com
IO重定向、管道及文本處理工具(02)_recv
三、 bash的快捷鍵 Ctrl+l: 清屏,相當於clear命令; Ctrl+a: 跳轉至命令開始處; Ctrl+e: 跳轉至命令結尾處; Ctrl+c: 取消命令的執行; Ctrl+u: 刪除命令行首至光標所在處的全部內容; Ctrl+k: 刪除光標所在處至命令行尾部的全部內容; 四、 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]... 練習: 一、 將/etc/passwd文件中的前5行內容轉換為大寫後保存至/tmp/passwd.out文件中; # head -n 5 /etc/passwd | tr 'a-z' 'A-Z' > /tmp/passwd.out 二、 將登錄至當前系統上用戶信息中的後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 密碼的複雜性策略: 一、 使用數字、 大寫字母、 小寫字母及特殊字符中至少3種; 二、 足夠長; 三、 使用隨機密碼; 四、 按期更換;不要使用最近曾經使用過的密碼; 用戶和組相關的管理命令: 用戶創建: 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)
一、 提供了編程環境
程序: 指令+數據 程序編程風格: 過程式: 以指令為中心,數據服務於指令 對象式: 以數據為中心,指令服務於數據 shell程序: 提供了編程能力,解釋執行 程序的執行方式: 計算機: 運行二進制指令; 編程語言: 低級: 彙編 高級: 編譯: 高級語言-->編譯器-->目標代碼 C、 C++,java 解釋: 高級語言-->解釋器-->機器代碼 shell, perl, python 過程式編程: 順序執行 循環執行 選擇執行 shell編程: 過程式、 解釋執行 編程語言的基本結構: 數據存儲: 變量、 數組 表達式 語句 shell腳本: 文本文件 shebang機制: #!/bin/bash #!/usr/bin/python #!/usr/bin/perl ls /etc magic number: 魔數 運行腳本: 一、 給予執行權限,通過具體的文件路徑指定文件執行; 二、 直接運行解釋器,將腳本做為解釋器程序的參數運行; 變量: 命名的內存空間: 數據存儲方式: ASCII 字符: 110: 24 數值: 110 --> 8 整型 浮點型 110+12=122 11012 110*10=1100 110110110110110110110110110110 變量: 變量類型 做用: 一、 數據存儲格式; 二、 參與的運算; 三、 表示的數據範圍; 類型: 字符 數值: 整型 浮點型 不二型 編程語言: 強類型: 弱類型: 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 後向引用:引用前面的分組號中的模式所匹配到的字符,而非模式自己; 練習: 一、 顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式) # grep -i '^s' /proc/meminfo; # grep '^[Ss]' /proc/meminfo 二、 顯示/etc/passwd文件中不以/bin/bash結尾的行; # grep -v '/bin/bash$' /etc/passwd 三、 顯示/etc/passwd文件中ID號最大的用戶的用戶名; # sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1 四、 若是用戶root存在,顯示其默認的shell程序; # id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7 五、 找出/etc/passwd中的兩位或三位數; # grep "\<[0-9]\{2,3\}\>" /etc/passwd 六、 顯示/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面存在非空白字符的行; # grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 七、 找出"netstat -tan"命令的結果中以'LISTEN'後跟0、1或多個空白字符結尾的行; # netstat -tan | grep "LISTEN[[:space:]]*$" 八、 添加用戶bash、 testbash、 basher以及nologin(其shell為/sbin/nologin),而後找出/etc/passwd文件中用戶名同shell名的行; # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd 練習: 一、 寫一個腳本,實現以下功能 若是user1用戶存在,就顯示其存在,否則添加之; 顯示添加的用戶的id號等信息; #!/bin/bash id user1 &> /dev/null && echo "user1 exists" || useradd user1 id user1 二、 寫一個腳本,完成以下功能 若是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: 練習: 一、 顯示當前系統root、 centos或user1用戶的默認shell和UID; # grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7 二、 找出/etc/rc.d/init.d/functions文件(centos6)中某單詞後面跟一個小括號的行; # grep -E -o '^[_[:alpha:]]+\(\)' /etc/rc.d/init.d/functions 三、 使用echo輸出一絕對路徑,使用egrep取出其基名(basename); # echo '/mnt/sdc/' | grep -E -o '[^/]+/?$' | cut -d'/' -f1 進一步地:使用egrep取出路徑的目錄名,類似於dirname命令的結果; 四、 找出ifconfig命令結果中1-255之間的數值; 五、 找出ifconfig命令結果中的IP地址; fgrep: 不支持正則表達式搜索;
bash的基礎特性(4)
變量類型: 數據存儲格式、 存儲空間大小、 參與運算種類; 字符型 數值型: 整型 浮點型 強類型: 定義變量時,必須指定類型;參與運算必須符合類型要求;調用未聲明變量會產生錯誤 弱類型: 定義變量時,無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無需事先定義可直接調用 bash bash中的變量的種類: 根據變量的生效範圍等標準: 本地變量:生效範圍爲當前shell進程:對當前shell以外的其餘shell進程,包括當前shell的子shell進程均無效 環境變量:生效範圍爲當前shell進程及其子進程 局部變量:生效範圍爲當前shell進程中某代碼片斷(一般指函數) 位置變量:$1,$2...來表示,用於讓腳本在腳本代碼中調用經過命令行傳遞給他的參數 特殊變量:$?,$0,$*,$@,$# 本地變量: 變量賦值: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 ... 變量命名法則 : 一、 不能使程序中的保留字,例如if,for 二、只能使用數字、字母及下劃線,且不能以數字開頭 三、見名知義 只讀變量: readonly name declare -r name 位置變量: 在腳本代碼中調用經過命令行傳遞給腳本的參數 $1,$2, ...對應調用第一、第2等參數 shift 【n】 $0 : 命令自己 $*:傳遞給腳本的全部參數 $@:傳遞給腳本的全部參數 $#:傳遞給腳本的參數的個數
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 自增、自減:````