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