1. 程式人生 > >標準I/O與管道;用戶、組和權限;文件處理工具及正則表達式總結

標準I/O與管道;用戶、組和權限;文件處理工具及正則表達式總結

程序 模式 group tails 匹配 -c 壓縮 表達 for

四、標準I/O與管道
標準輸入和輸出
程序:指令+數據
讀入數據:Input
輸出數據:Output
?打開的文件都有一個fd: file descriptor (文件描述符)
?Linux給程序提供三種I/O設備
?標準輸入(STDIN)-0 默認接受來自鍵盤的輸入
?標準輸出(STDOUT)-1 默認輸出到終端窗口
?標準錯誤(STDERR)-2 默認輸出到終端窗口
?I/O重定向:改變默認位置
把輸出和錯誤重新定向到文件
?STDOUT和STDERR可以被重定向到文件
命令 操作符號 文件名
支持的操作符號包括:

把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件
?> 文件內容會被覆蓋

set –C 禁止將內容覆蓋已有文件,但可追加
| file 強制覆蓋
set +C 允許覆蓋
?>> 原有內容基礎上,追加內容
把輸出和錯誤重新定向到文件
?2> 覆蓋重定向錯誤輸出數據流
?2>> 追加重定向錯誤輸出數據流
?標準輸出和錯誤輸出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
?合並標準輸出和錯誤輸出為同一個數據流進行重定向
? &> 覆蓋重定向
? &>> 追加重定向
?COMMAND > /path/to/file
?tr 命令是:轉換和刪除 常用選項 -d:delete,刪除 -s:squeeze-repeat,壓縮
從文件中導入STDIN
?使用<來重定向標準輸入
?某些命令能夠接受從文件中導入的STDIN
tr ‘a-z’ ‘A-Z’< /etc/issue
該命令會把/etc/issue中的小寫字符都轉換成大寫字符
?tr –d abc < /etc/fstab
刪除fstab文件中的所有abc中任意字符
?cat > file
mage
wangxiaochun
按ctrl+d離可以使用文件來代替鍵盤的輸入
?cat < file1 > file2
?Cat < file1 >> file1
把多行發送給STDIN
mail -s "Please Call" [email protected] <<END
Hi Wang

Please give me a call when you get in. We may need
to do some maintenance on server1.

Details when you‘re on-site
Zhang
END
管道
管道(使用符號“|”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的
STDIN
?STDERR默認不能通過管道轉發,可利用2>&1 或 |& 實現
?最後一個命令會在當前shell進程的子shell進程中執行
?組合多種工具的功能
ls | tr ‘a-z’ ‘A-Z
重定向到多個目標(tee)
?命令1 | tee [-a ] 文件名 | 命令2
把命令1的STDOUT保存在文件中,做為命令2的輸入
-a 追加
?使用:
?保存不同階段的輸出
?復雜管道的故障排除
?同時查看和記錄輸出
五、用戶、組、權限
用戶user
?令牌token,identity
?Linux用戶:Username/UID
?管理員:root, 0
?普通用戶:1-60000 自動分配
系統用戶:1-499, 1-999 (CentOS7)
對守護進程獲取資源進行權限分配
登錄用戶:500+, 1000+(CentOS7)
交互式登錄
組group
?Linux組:Groupname/GID
?管理員組:root, 0
?普通組:
系統組:1-499, 1-999(CENTOS7)
普通組:500+, 1000+(CENTOS7)
用戶和組的配置文件
?Linux用戶和組的主要配置文件:
/etc/passwd:用戶及其屬性信息(名稱、UID、主組ID等)
/etc/group:組及其屬性信息
/etc/shadow:用戶密碼及其相關屬性
/etc/gshadow:組密碼及其相關屬性
passwd文件格式 :共七項
?login name:登錄用名(wang)(1):用戶名。
?passwd:密碼 (x) (2):密碼(已經加密)
?UID:用戶身份編號 (1000) (3):UID(用戶標識),操作系統自己用的
?GID:登錄默認所在組編號 (1000) (4):GID組標識。
?GECOS:用戶全名或註釋 (5):用戶全名或本地帳號
?home directory:用戶主目錄 (/home/wang) (6):開始目錄
?shell:用戶默認使用shell (/bin/bash) (7):登錄使用的Shell,就是對登錄命令進行解析的工具。
shadow文件格式?
登錄用名?用戶密碼:一般用sha512加密?從1970年1月1日起到密碼最近一次被更改的時間?密碼再過幾天可以被變更(0表示隨時可被變更)?密碼再過幾天必須被變更(99999表示永不過期)?密碼過期前幾天系統提醒用戶(默認為一周)?密碼過期幾天後帳號會被鎖定?從1970年1月1日算起,多少天後帳號
group文件格式
?群組名稱:就是群組名稱
?群組密碼:通常不需要設定,密碼是被記錄在 /etc/gshadow
?GID:就是群組的 ID
?以當前組為附加組的用戶列表(分隔符為逗號)
gshdow文件格式
?群組名稱:就是群的名稱
?群組密碼:
?組管理員列表:組管理員的列表,更改組密碼和成員
?以當前組為附加組的用戶列表:多個用戶間用逗號分隔當前組為附加組的用戶列表(分隔符為逗號)
用戶創建:useradd
?useradd [options] LOGIN
-u UID
-o 配合-u 選項,不檢查UID的唯一性
-g GID 指明用戶所屬基本組,可為組名,也可以GID
-c "COMMENT“ 用戶的註釋信息
-d HOME_DIR 以指定的路徑(不存在)為家目錄
-s SHELL 指明用戶的默認shell程序,可用列表在/etc/shells文件中
-G G
用戶屬性修改
?usermod [OPTION] login
-u UID: 新UID
-g GID: 新主組
-G GROUP1[,GROUP2,...[,GROUPN]]]:新附加組,原來的附加組將會被
覆蓋;若保留原有,則要同時使用-a選項
-s SHELL:新的默認SHELL
-c ‘COMMENT‘:新的註釋信息
-d HOME: 新家目錄不會自動創建;若要創建新家目
查看用戶相關的ID信息
?id [OPTION]... [USER]
-u: 顯示UID
-g: 顯示GID
-G: 顯示用戶所屬的組的ID
-n: 顯示名稱,需配合ugG使用
切換用戶或以其他用戶身份執行命令
?su [options...] [-] [user [args...]]
?切換用戶的方式:
su UserName:非登錄式切換,即不會讀取目標用戶的配置文件,不改變
當前工作目錄
su - UserName:登錄式切換,會讀取目標用戶的配置文件,切換至家目
錄,完全切換
?root su至其他用戶無須密碼;非root用戶切換時需要密
設置密碼
?passwd [OPTIONS] UserName: 修改指定用戶的密碼
?常用選項:
-d:刪除指定用戶密碼
-l:鎖定指定用戶
-u:解鎖指定用戶
-e:強制用戶下次登錄修改密碼
-f:強制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:提前多少天開始警告
-i inactivedays:非活動期
修改用戶密碼策略
?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
-l 顯示密碼策略
?示例:
chage -d 0 tom 下一次登錄強制重設密碼
chage -m 0 –M 42 –W 14 –I 7 tom
chage -E 2016-09-10 tom
文件權限:例如、-rwxr-xrw- 5 root root 25195 Dec 17 10:43 f1
-:文件屬性 rwxr-xrw- :權限 5:連接數 root:屬主 root:屬組 25195:大小 Dec:時間 f1:文件名
修改文件的屬主和屬組
?修改文件的屬主:chown
chown [OPTION]... [OWNER][:[GROUP]] FILE...
用法說明:
OWNER
OWNER:GROUP
:GROUP,冒號也可用 . 替換
-R: 遞歸
chown [OPTION]... --reference=RFILE FILE...
?修改文件的屬組:chgrp
chgrp [OPT
文件權限
?文件:
r 可使用文件查看類工具獲取其內容
w 可修改其內容
x 可以把此文件提請內核啟動為一個進程
?目錄:
r 可以使用ls查看此目錄中文件列表
w 可在此目錄中創建文件,也可刪除此目錄中的文件
x 可以使用ls -l查看此目錄中文件元數據(須配合r),可以cd進入此目錄
X 只給目錄x權限,不給文件x權限I
修改文件權限
?chmod [OPTION]... OCTAL-MODE FILE...
-R: 遞歸修改權限
?chmod [OPTION]... MODE[,MODE]... FILE...
MODE:
修改一類用戶的所有權限
u= g= o= ug= a= u=,g=
修改一類用戶某位或某些位權限
u+ u- g+ g- o+ o- a+ a- + -
?chmod [OPTION]... --
新建文件和目錄的默認權限
?umask值 可以用來保留在創建文件權限
?新建文件的默認權限: 666-umask,如果所得結果某位存在執行(奇數)權
限,則將其權限+1
?新建目錄的默認權限: 777-umask
?非特權用戶umask是 002
?root的umask 是 022
?umask: 查看
?umask # 設定
示例:umask 002
umask u=rw,g=r,o=
?umask –S 模式方式顯示
?umask –p 輸出可被調用
?全局設置: /etc/bashrc 用戶設置:~/.bashrc
權限位映射
?SUID: user,占據屬主的執行權限位
s:屬主擁有x權限
S:屬主沒有x權限
?SGID: group,占據屬組的執行權限位
s: group擁有x權限
S:group沒有x權限
?Sticky: other,占據other的執行權限位
t:other擁有x權限
T:other沒有x權限
六、文本處理工具、正則表達式
抽取文本的工具?
文件內容:less和 cat?
文件截取:head和tail?
按列抽取:cut?
按關鍵字抽取:grep
顯示文本前或後行內容
?head [OPTION]... [FILE]...
-c # 指定獲取前#字節
-n # 指定獲取前#行
-# 指定行數
?tail [OPTION]... [FILE]...
-c # 指定獲取後#字節
-n # 指定獲取後#行
-# 同上
-f 跟蹤顯示文件fd新追加的內容,常用日誌監控
相當於 --follow=descriptor
-F 跟蹤文件名,相當於--follow=name --retry
?tailf 類似tail –f,當文件不增長時並不訪問文件
按列抽取文本cut和合並文件paste
?cut [OPTION]... [FILE]...
-d DELIMITER: 指明分隔符,默認tab
-f FILEDS:
#: 第#個字段
#,#[,#]:離散的多個字段,例如1,3,6
#-#:連續的多個字段, 例如1-6
混合使用:1-3,7
-c 按字符切割
--output-delimiter=STRING指定輸出分隔符
cut和paste
?顯示文件或STDIN數據的指定列
cut -d: -f1 /etc/passwd
cat /etc/passwd | cut -d: -f7
cut -c2-5 /usr/share/dict/words
?paste 合並兩個文件同行號的列到一行
paste [OPTION]... [FILE]...
-d 分隔符:指定分隔符,默認用TAB
-s : 所有行合成一行顯示
收集文本統計數據wc
?計數單詞總數、行總數、字節總數和字符總數
?可以對文件或STDIN中的數據運行
wc story.txt
39 237 1901 story.txt
行數 字數 字節數
?常用選項
-l 只計數行數
-w 只計數單詞總數
-c 只計數字節總數
-m只計數字符總數
-L 顯示文件中最長行的長度
文本排序sort
?把整理過的文本顯示在STDOUT,不改變原始文件
sort [options] file(s)
?常用選項
-r 執行反方向(由上至下)整理
-R 隨機排序
-n 執行按數字大小整理
-f 選項忽略(fold)字符串中的字符大小寫
-u 選項(獨特,unique)刪除輸出中的重復行
-t c 選項使用c做為字段界定符
-k X 選項按照使用c字符分隔的X列來整理能夠使用多次
uniq
?uniq命令:從輸入中刪除前後相接的重復的行
?uniq [OPTION]... [FILE]...
-c: 顯示每行重復出現的次數
-d: 僅顯示重復過的行
-u: 僅顯示不曾重復的行
註:連續且完全相同方為重復
?常和sort 命令一起配合使用:
sort userlist.txt | uniq -c
Grep:文本過濾(模式:pattern)工具
grep命令選項
? --color=auto: 對匹配到的文本著色顯示
? -v: 顯示不被pattern匹配到的行
? -i: 忽略字符大小寫
? -n:顯示匹配的行號
? -c: 統計匹配的行數
? -o: 僅顯示匹配到的字符串
? -q: 靜默模式,不輸出任何信息
? -A #: after, 後#行
? -B #: before, 前#行
? -C #:context, 前後各#行
? -e:實實現多個選項間的邏輯or關系
grep –e ‘cat ’ -e ‘dog’ file
? -w:匹配整個單詞
? -E:使用ERE
? -F:相當於fgrep,不支持正則表達式
? -f file: 根據模式文件處理
正則表達式
匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數

  • 匹配前面的字符任意次,包括0次
    貪婪模式:盡可能長的匹配
    . 任意長度的任意字符
    \? 匹配其前面的字符0或1次
    + 匹配其前面的字符至少1次
    {n} 匹配前面的字符n次
    {m,n} 匹配前面的字符至少m次,至多n次
    {,n} 匹配前面的字符至多n次
    {n,} 匹配前面的字符至少n次
    位置錨定:定位出現的位置
    ^ 行首錨定,用於模式的最左側
    $ 行尾錨定,用於模式的最右側
    ^PATTERN$ 用於模式匹配整行
    ^$ 空行
    ^[[:space:]]
    $ 空白行
    \< 或 \b 詞首錨定,用於單詞模式的左側
    \> 或 \b 詞尾錨定,用於單詞模式的右側
    \<PATTERN\> 匹配整個單詞
    分組:() 將一個或多個字符捆綁在一起,當作一個整體處理,如:(root)+
    ?分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些
    變量的命名方式為: \1, \2, \3, ...
    ?\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
    ?示例: (string1+(string2))
    \1 :string1+(string2)

    \2 :string2
    ?後向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
    ?或者:|
    示例:a|b: a或b C|cat: C或cat (C|c)at:Cat或cat
    ^ 行首
    $ 行尾
    . 任意單一字符
    [] []內任意單一字符
    [^] 除[]內任意單一字符
  • 前面字符重復不確定次數
    + +前面字符重復一次以上不確定次數
    \? ?前面字符重復0或1次
    \ 轉義符
    .
    任意長度字符
    {n} 前面字符重復n次
    {n,} 前面字符重復n次以上
    {m,n} 前面字符重復m次和n次之間
    egrep及擴展的正則表達式
    ?egrep = grep -E
    ?egrep [OPTIONS] PATTERN [FILE...]
    ?擴展正則表達式的元字符:
    ?字符匹配:
    . 任意單個字符
    [] 指定範圍的字符
    [^] 不在指定範圍的字符
    次數匹配:
  • 匹配前面字符任意次
    ? 0或1次
  • 1次或多次
    {m} 匹配m次
    {m,n} 至少m,至多n次
    位置錨定:
    ^ 行首
    $ 行尾
    \<, \b 語首
    \>, \b 語尾
    ?分組:
    ()
    後向引用:\1, \2, ...
    ?或者:
    a
    b a或b
    C
    cat C或cat
    (C
    c)at Cat或cat
    Vim 文本編輯器
    vim [OPTION]... FILE...
    +# 打開文件後,讓光標處於第#行的行首,+默認行尾
    +/PATTERN 讓光標處於第一個被PATTERN匹配到的行的行首
    –b file 二進制方式打開文件
    –d file1 file2… 比較多個文件
    -m file 只讀打開文件
    ?vim -e file 或 ex file 直接進入ex模式
    ?如果該文件存在,文件被打開並顯示內容
    如果該文件不存在,當編輯後第一次存盤時創建它
    vim:一個模式編輯器
    ?擊鍵行為是依賴於 vim的 的“模式”
    ?三種主要模式:
    ?命令(Normal)模式:默認模式,移動光標,剪切/粘貼文本
    ?插入(Insert)或編輯模式:修改文本
    ?擴展命令(extended command )模式:保存,退出等
    ?Esc鍵 退出當前模式
    ?Esc鍵 Esc鍵 總是返回到命令模式
    模式轉換
    ?命令模式 --> 插入模式
    i insert, 在光標所在處輸入
    I 在當前光標所在行的行首輸入
    a append, 在光標所在處後面輸入
    A 在當前光標所在行的行尾輸入
    o 在當前光標所在行的下方打開一個新行
    O 在當前光標所在行的上方打開一個新行
    插入模式 --------> 命令模式
    ESC
    ?命令模式 --------> 擴展命令模式

    ?擴展命令模式 --------> 命令模式
    ESC,enter
    關閉文件
    ?擴展命令模式:
    :q 退出
    :q! 強制退出,丟棄做出的修改
    :wq 保存退出
    :x 保存退出
    ?命令模式
    ZZ 保存退出
    ZQ 不保存退出

標準I/O與管道;用戶、組和權限;文件處理工具及正則表達式總結