1. 程式人生 > >《Linux命令列大全》學習筆記

《Linux命令列大全》學習筆記

第一部分  學習shell

第1章  shell是什麼
date:顯示當前系統的時間和日期
cal:顯示當月的日曆
df:顯示磁碟驅動器當前的可用空間
free:顯示可用記憶體
exit:結束終端會話

第2章  導航
pwd:檢視當前工作目錄
cd:改變目錄
ls:列出目錄內容
.代表工作目錄,..代表工作目錄的父目錄,幾乎所有情況下都可以省略./
cd:將工作目錄改變成主目錄
cd-:將工作目錄改變成先前的工作目錄
cd~username:將工作目錄改變成username的主目錄
ls-a:列出以.字元開頭的隱藏的檔案

第3章  Linux系統
ls:列出目錄內容
file:確定檔案型別
less:檢視檔案內容
ls命令的常用選項:
-a --all 列出所有檔案,包括以點號開頭的檔案,這些檔案通常不列出來
-d --directory 檢視目錄的資訊,而不是目錄中的內容
-F --classify 在每個所列出的名字後面加上型別指示符,例如,如果名字是目錄名,則會加上一個斜槓
-h --human-readable 以長格式列出,以人們可讀的方式而不是位元組數來顯示檔案的大小
-l 以長格式顯示結果
-r --reverse 以相反的順序顯示結果,通常,ls命令按照字母升序排列顯示結果
-S 按檔案大小對結果排序
-t 按修改時間排序
ls長列表欄位:-rw-r-- 1 root root 32059 2012-04-03 11:05 oo-cd-cover.odf
-rw-r-r 對檔案的訪問許可權。第一個字元表示檔案的型別。在不同型別之間,開頭的-表示該檔案是一個普通檔案,d表示目錄。接著的三個字元表示檔案所有者的訪問許可權,再接著的三個字元表示檔案所屬組中成員的訪問許可權,最後三個字元表示其他所有人的訪問許可權。
1 檔案硬連線數目
root 檔案所有者的使用者名稱
root 檔案所屬使用者組的名稱
32059 以位元組數表示的檔案大小
2012-04-03 11:05 上次修改檔案的日期和時間
oo-cd-cover.odf 檔名
less命令:
PAGE UP或b 後翻一頁
PAGE DOWN或Spacebar 前翻一頁
向上箭頭鍵 向上一行
向下箭頭鍵 向下一行
G 跳轉到文字檔案的末尾
1G或g 跳轉到文字檔案的開頭
/charecters 向前查詢指定的字串
n 向前查詢下一個出現的字串,這個字串是之前所指定查詢的
h 顯示幫助螢幕
q 推出less

第4章  操作檔案與目錄
cp:複製檔案和目錄
mv:移動或重新命名檔案和目錄
mkdir:建立目錄
rm:移除檔案和目錄
in:建立硬連結和符號連結
萬用字元:
* 匹配任意多個字元(包括0個和1個)
? 匹配任一單個字元(不包括0個)
[characters] 匹配任意一個屬於字符集中的字元
[!characters] 匹配任意一個不屬於字符集中的字元
[[:class:]] 匹配任意一個屬於指定字元類中的字元
常用字元類:
[:alnum:] 匹配任意一個字母或數字
[:alpha:] 匹配任意一個字母
[:digit:] 匹配任意一個數字
[:lower:] 匹配任意一個小寫字母
[:upper:] 匹配任意一個大寫字母
midir dir1:建立單個dir1目錄
mkdir dir1 dir2 dir3:建立3個目錄,分別命名為dir1,dir2和dir3
cp item1 item2:將單個檔案或目錄item1複製到檔案或目錄item2中
cp item... directory:將多個專案(檔案或目錄)複製進一個目錄中
cp命令選項:
-a --archive 複製檔案和目錄及其屬性,包括所有權和許可權。通常來說,複製的檔案具有使用者所操作檔案的預設屬性
-i --interactive 在覆蓋一個已存在的檔案前,提示使用者進行確認。如果沒有指定該選項,cp會預設覆蓋檔案
-r --recursive 遞迴地複製目錄及其內容。複製目錄時需要這個選項(或-a選項)
-u --update 當將檔案從一個目錄複製到另一個目錄時,只會複製那些目標目錄中不存在的檔案或是目標目錄相應檔案的更新檔案
-v --verbose 複製檔案時,顯示資訊性訊息
mv item1 item2:將檔案(或目錄)item1移動(或重新命名)為item2
mv item... directory:將一個或多個條目從一個目錄移動到另一個目錄下
mv選項:
-i --interactive 覆蓋一個已存在的檔案之前,提示使用者確認。如果沒有指定該選項,mv會預設覆蓋檔案
-u --update 將檔案從一個目錄移動到另一個目錄,只移動那些目標目錄中不存在的檔案或是目標目錄裡相應檔案的更新檔案
-v --verbose 移動檔案時顯示資訊性訊息
rm選項:
-i --interactive 刪除一個已存在的檔案前,提示使用者確認。如果沒有指定這個選項,rm命令會預設刪除檔案
-r --recursive 遞迴地刪除目錄。要刪除一個目錄,則必須指定該選項。
-f --force 忽略不存在的檔案並無需提示確認。該選項會覆蓋--interactive選項
-v --verbose 刪除檔案時顯示資訊性訊息
ln file link:建立硬連結
ln -s item link:建立符號連結

第5章  命令的使用
type:顯示命令的型別
which:顯示可執行程式的位置
man:顯示命令的手冊頁
apropos:顯示一系列合適的命令
info:顯示命令的info條目
whatis:顯示一條命令的簡述
alias:建立一條命令的別名,(在命令列定義的別名當shell會話結束時也隨之消失)
手冊文件的組織結構:
1 使用者命令
2 核心系統呼叫的程式介面
3 C庫函式程式介面
4 特殊檔案,如裝置節點和驅動程式
5 檔案格式
6 遊戲和娛樂,例如螢幕保護程式
7 其他雜項
8 系統管理命令
info命令:
? 顯示命令幫助
PAGE UP or BACKSPACE 返回上一頁
PAGE DOWN or Spacebar 翻倒下一頁
n Next-顯示下一個節點
p Previous-顯示上一個節點
u Up-顯示目前顯示節點的父節點(通常是一個選單)
ENTER 進入游標所指的超連結
q 退出
alias foo='cd /usr; ls; cd -':將cd /usr; ls; cd - 這三條命令整合成一條新命令foo

第6章  重定向
cat:合併檔案,將它們複製到標準輸出檔案中
sort:對文字行排序
uniq:報告或刪除檔案中重複的行
wc:列印檔案中的換行符,字和位元組的個數
grep:列印匹配行
head:輸出檔案的第一部分內容
tail:輸出檔案的最後一部分內容
tee:讀取標準輸入的資料,並將其內容輸出到標準輸出和檔案中
>:重定向操作符,後接檔名,可以把標準輸出重定向到另一個檔案中,而不是顯示在螢幕上。
ls -l /usr/bin > ls-output.txt:建立/usr/bin目錄的一個長列表資訊,並把結果輸出到ls-output.txt檔案中
> ls-output.txt:刪除ls-output.txt檔案的內容,或建立空的ls-output.txt檔案
>>:重定向符,不從檔案的首位開始覆蓋檔案,而是從檔案的尾部開始新增輸出內容
ls -l /usr/bin >> ls-output.txt:將結果新增到ls-output.txt檔案末尾
ls -l /usr/bin 2> ls-error.txt:將標準錯誤重定向到ls-error.txt檔案中(shell在內部將標準輸入檔案,標準輸出檔案和標準錯誤檔案分別索引為0,1和2)
ls -l /bin/usr &> ls-output.txt:將標準輸出和錯誤輸出重定向到ls-output.txt檔案中
ls -l /bin/usr 2> /dev/null:將錯誤資訊丟棄
cat ls-output.txt:顯示ls-output.txt檔案的內容
cat movie.mpeg.0* > movie.mpeg:將movie.mpeg.001 movie.mpeg.002...movie.mpeg.099連線在一起
cat > lazy_dog.txt:把標準輸入複製到檔案lazy_dog.txt中
cat < lazy_dog.txt:把檔案lazy_dog.txt中的內容輸入到標準輸出中
ls -l /usr/bin | less:通過管道|將ls -l /usr/bin命令的結果輸出到less中
ls -l /bin /usr/bin | sort | less:將/bin和/usr/bin目錄下的所有可執行程式合併成一個列表,並按照順序排列,並檢視這個列表;把多個命令合在一起構成一個管道,稱為過濾器
ls -l /bin /usr/bin | sort | uniq | less:忽略列表中重複的行
ls -l /bin /usr/bin | sort | uniq -d | less:檢視重複的行
wc ls-output.txt:顯示ls-output.txt檔案中包含的行數,字數和位元組數
ls /bin /usr/bin | sort | uniq | wc -l:檢視已排序好的列表中的條目數
ls /bin /usr/bin | sort | uniq | grep zip:從列表中搜索出文件名中包含zip的所有檔案(-i,搜尋時忽略大小寫;-v,只輸出和模式不匹配的行)
head -n 5 ls-output.txt:輸出檔案ls-output.txt的前5行,預設是前10行
tail -n 5 ls-output.txt:輸出檔案ls-output.txt的後5行,預設是後10行
ls /usr/bin | tail -n 5:顯示命令ls /usr/bin的後5行結果
tail -f /var/log/messages:顯示目錄/var/log下的messages檔案,-f表示tail將持續監視這個檔案,直到按下Ctrl-C才停止
ls /usr/bin | tee ls.txt | grep zip:將目錄列表輸出到ls.txt檔案中,再用grep命令過濾管道中內容

第7章  透過shell看世界
echo:顯示一行文字
echo *:將*擴充套件為當前目錄下的所有檔名,然後echo將其顯示出來
echo D*:顯示當前目錄下以D開頭的檔名
echo *s:顯示當前目錄下以s結尾的檔名
echo [[:upper:]]*:顯示當前目錄下以大寫字母開頭的檔名
echo /usr/*/share:檢視主目錄之外的目錄,結果為/usr/kerberos/share /usr/local/share
ls -d .* | less:顯示以.開頭的檔名
ls -d .[!.]?*:顯示以.開頭的檔名,檔名中並不包含第二個點字元,但包含至少一個額外的字元,後面也可跟著其它字元
echo ~:顯示當前使用者的主目錄
echo ~foo:顯示foo使用者的主目錄
echo $((2+2)):算術擴充套件,顯示2+2的結果,其格式為$((expression))
算術運算子:
+ 加
- 減
* 乘
/ 除
% 求餘
** 取冪
echo Front-{A,B,C}-Back:花括號擴充套件,顯示為Front-A-Back Front-B-Back Front-C-Back
echo Number_{1..5}:顯示Number_1 Number_2 Number_3 Number_4 Number_5
echo {Z..A}:顯示Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
echo a{A{1,2},B{3,4}}b:顯示aA1b aA2b aB3b aB4b
mkdir {2009..2011}-0{1..9} {2009..2011}-{10..12}:建立目錄2009-01 2009-02 .. 2011-12
echo $USER:顯示變數USER中包含的使用者名稱
printenv | less:檢視可用的變數列表
echo $(ls):把命令ls的輸出作為擴充套件模式使用
ls -l $(which cp):顯示cp所在路徑的詳細列表
file $(ls /usr/bin/* | grep zip):將管道的輸出為file命令的引數列表
echo this is a test:輸出this is a text
echo The total is $100.00:輸出The total is 00.00,因為$1是一個未定義的變數,所以引數擴充套件把$1的值替換為空字串
ls -l "two words.txt":使用雙引號可以阻止單詞分割,但引數擴充套件、算術擴充套件和命令替換在雙引號中依然生效,沒有用雙引號包含起來的空格、製表符和換行符不會被當成文字的一部分,而只是被當成分割符
echo $(cal):輸出為五月 2016 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
echo "$(cal)":輸出為
      五月 2016     
日 一 二 三 四 五 六
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31             
單詞分割機制會把換行符當成界定符
echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER:輸出為text /home/me/ls-output.txt a b foo 4 me
echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER:輸出為text ~/*.txt {a,b} foo 4 me
echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER:輸出為text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER,單引號能抑制所有擴充套件,隨著引用級別加強,越來越多的擴充套件將被抑制
echo "The balance for user $USER is: \$5.00":輸出為The balance for user me is: $5.00,轉義字元常用來消除檔名中某個字元的特殊含義,注意單引號中的反斜槓將失去它的特殊含義
反斜槓轉義字元序列:
\a 響鈴(警告聲-計算機發出的嗶嗶聲)
\b 退格
\n 新的一行
\r 回車
\t 製表
sleep 10; echo -e "Time's up\a":等待10秒,顯示Time's up並響鈴,在echo命令中帶上-e選項,就能夠解釋轉義字元序列

第8章  高階鍵盤技巧
clear:清屏
history:顯示歷史列表的記錄
游標移動命令:
Ctrl-A: 移動游標至行首
Ctrl-E: 移動游標至行尾
Ctrl-F: 游標向前移動一個字元,和右箭頭作用一樣
Ctrl-B: 游標向後移動一個字元,和左箭頭作用一樣
Alt-F: 游標向前移動一個字
Alt-B: 游標向後移動一個字
Ctrl-L:清屏並把游標移到左上角,和clear命令的作用一樣
文字編輯命令:
Ctrl-D: 刪除游標處的字元
Ctrl-T: 使游標處的字元和它前面的字元對調位置
Alt-T: 使游標處的字和它前面的字對調位置
Alt-L: 把從游標到字尾的字元轉換成小寫字母形式
Alt-U: 把從游標到字尾的字元轉換成大寫字母形式
剪下和貼上命令:
Ctrl-K:剪下從游標到行尾的文字
Ctrl-U:剪下從游標到行首的文字
Alt-D: 剪下從游標到當前詞尾的文字
Alt-Backspace: 剪下從游標到詞頭的文字,如果游標在一個單詞的開頭,則剪下前一個單詞
Ctrl-Y: 把kill-ring緩衝區中的文字貼上到游標位置
自動補齊:在輸入命令時,按Tab鍵將觸發自動補齊功能
自動補齊命令:
Alt-$: 顯示所有可能的自動補齊列表,在大多數系統中,可通過按兩次Tab鍵實現
Alt-*: 插入所有可能的匹配項
history | less:檢視使用過的命令的歷史記錄
history | grep /usr/bin:顯示包含/usr/bin的歷史記錄
!88:bash將把!88擴充套件為歷史列表中第88行的命令
歷史記錄命令:
Ctrl-P: 移動到前一條歷史記錄,相當於向上箭頭鍵
Ctrl-N: 移動到後一條歷史記錄,相當於向下箭頭鍵
Alt-<: 移動到歷史記錄列表的開始處
Alt->: 移動到歷史記錄列表的結尾處,即當前命令列
Ctrl-R: 逆向遞增地搜尋。從當前命令列向前遞增搜尋
Alt-P: 逆向非遞增地搜尋。按下這個組合鍵,接著輸入待搜尋的字串,按Enter鍵後,搜尋才真正開始執行
Alt-N: 向前非遞增地搜尋
Ctrl-O: 執行歷史記錄列表中的當前項,執行完跳到下一項。若要把歷史記錄中的一系列命令重新執行一遍,使用該組合鍵將很方便
歷史記錄擴充套件命令:
!!: 重複最後一個執行的命令。按向上箭頭鍵再按Enter鍵也可以實現相同的功能,而且操作簡單
!number: 重複歷史記錄中第number行的命令
!string: 重複最近的以string開頭的歷史記錄
!?string: 重複最近的包含string的歷史記錄

第9章  許可權
id: 顯示使用者身份標識
chmod: 更改檔案的模式(許可權)
umask: 設定檔案的預設許可權
su: 以另一個使用者的身份執行shell
sudo: 以另一個使用者的身份來執行命令
chown: 更改檔案所有者
chgrp: 更改檔案所屬群組
passwd: 更改使用者密碼
檔案型別:
- 普通檔案
d 目錄檔案
l 符號連結,其剩下的檔案屬性始終是rwxrwxrwx,它是偽屬性值
c 字元裝置檔案,表示以位元組流形式處理資料的裝置,如終端或調變解調器
b 塊裝置檔案,表示以資料塊方式處理資料的裝置,如硬碟驅動或光碟驅動
許可權屬性:
r 允許開啟和讀取檔案;如果設定了執行許可權,則允許列出目錄下的內容
w 允許寫入或截短檔案,如果也設定了執行許可權,則目錄中的檔案允許被建立、刪除和重新命名;但不允許重新命名或者刪除檔案,是否能重新命名和刪除檔案由目錄許可權決定
x 允許把檔案當作程式一樣執行,用指令碼語言寫的程式檔案必須設定為可讀;允許進入目錄下
以二進位制和八進位制方式表示檔案模式:
八進位制    二進位制    檔案模式
0    000    ---
1    001    --x
2    010    -w-
3    011    -wx
4    100    r--
5    101    r-x
6    110    rw-
7    111    rwx
chmod 600 foo.txt:將foo.txt檔案設定為所有者具有讀寫許可權,而取消組使用者和其他所有使用者的所有許可權。即檔案模式改為-rw-------
chmod命令符號表示法:
u user的簡寫,表示檔案或目錄的所有者
g 檔案所屬群組
o others的簡寫,表示其他所有使用者
a all的簡寫,是'u','g'和'o'三者的組合
chmod命令符號表示法例項:
u+x 為檔案所有者新增可執行許可權
u-x 刪除檔案所有者的可執行許可權
+x 為檔案所有者、所屬群組和其他所有使用者新增可執行許可權,等價於a+x
o-rw 刪除其他所有使用者的讀寫許可權
go=rw 設定所屬群組和其他所有使用者具有讀寫許可權,如果其已具有可執行許可權,則刪除其可執行許可權
u+x, go=rw 為檔案所有者新增可執行許可權,同時設定所屬群組和其他所有使用者具有讀許可權和可執行許可權

umask: 顯示預設許可權的掩碼值(八進位制,預設為0002)
umask 0000: 將預設許可權的掩碼值設定為0000
掩碼值0002與預設許可權對比:
原始檔案模式    ---    rw-    rw-    rw-
掩碼        000    000    000    010
結果        ---    rw-    rw-    r--
su [-[l]] [user]: 用來以另一個使用者的身份啟動shell
su -: 以超級使用者的身份啟動shell
sudo backup_script: 執行超級使用者下的backup_script程式,而不需要輸入超級使用者密碼
sudo -l: 檢視sudo命令可以授予哪些許可權
chown命令引數例項:
引數        結果
bob        把檔案所有者從當前所有者更改為使用者bob
bob:users    把檔案所有者從當前所有者更改為使用者bob,並把檔案所屬群組更改為users組
:admins        把檔案所屬群組更改為admins組,檔案所有者不變
bob:        把檔案所有者從當前所有者更改為使用者bob,並把檔案所屬群組更改為使用者bob登入系統時所屬的組
sudo chown tony: ~tony/myfile.txt: 把檔案myfile.txt的所有者改為tony,並把檔案所屬群組改為tony登入系統時所屬群組
passwd: 更改使用者自己的密碼

第10章  程序
ps: 顯示當前所有程序的執行情況
top: 實時顯示當前所有任務的資源佔用情況
jobs: 列出所有活動作業的狀態資訊
bg: 設定在後臺中執行作業
fg: 設定在前臺中執行作業
kill: 傳送訊號給某個程序
killall: 殺死指定名字的程序
shutdown: 關機或者重啟系統
ps: 輸出和當前終端會話相關的程序資訊
ps x: 顯示所有程序
程序狀態:
R 執行狀態,程式正在執行或準備執行
S 睡眠狀態,程序不在執行,而是在等待某事件發生,如鍵盤輸入或收到網路報文
D 不可中斷的睡眠狀態,程序在等待I/O操作,如磁碟驅動
T 暫停狀態,程序被指示停止(後續還可繼續執行)
Z 無效或殭屍程序,子程序被終止,但是還沒有被其父程序徹底釋放掉
< 高優先順序程序,程序可以被賦予更多的重要性,分配更多的CPU時間
N 低優先順序程序,只有在其他更高優先順序的程序使用完處理器後才能夠獲得使用處理器的時間
ps aux: 顯示屬於每個使用者的程序資訊
BSD模式下ps命令輸出的列標題:
USER 使用者ID
%CPU CPU使用百分比
%MEM 記憶體使用百分比
VSZ 虛擬耗用記憶體大小
RSS 實際使用的記憶體大小,程序使用的實體記憶體大小
START 程序開啟時間
top資訊中的欄位:
行    欄位        含義
1    top        程式名
    14:59:20    當前時間
    up 6:30        正常執行時間,系統已經執行6.5小時
    2 users        有兩個使用者已登入
    load average    負載均值指等待執行的程序數,第一個對應前60秒的均值,第二個對應前5分鐘的均
            值,第三個對應前15分鐘的均值,小於1.0表示機器不忙
2    tasks        統計程序數及各個程序的狀態資訊
3    0.7%us        0.7%的CPU時間被使用者程序佔用
    1.0%sy        1.0%CPU時間被系統程序(核心程序)佔用
    0.0%ni        0.0%CPU時間被友好程序(nice)佔用
    98.3%id        98.3%CPU時間是空閒的
    0.0%wa        0.0%CPU時間用來等待I/O操作
4    Mem:        顯示物理RAM(隨機存取記憶體)的使用情況
5    Swap:        顯示交換空間(虛擬記憶體)的使用情況
xlogo: 執行xlogo程式
Ctrl-C鍵: 關閉xlogo程式
xlogo &: 在後臺執行xlogo程式
jobs: 顯示終端啟動的所有作業
fg %1: 將作業編號為1的程序從後臺返回到前臺
Ctrl-Z鍵: 暫停xlogo程式
bg %1: 讓作業編號為1的程序移到後臺執行
kill 28401: 終止程序號(PID)為28401的程序
kill命令常用訊號:
訊號編號    訊號名    含義
1    HUP    掛起訊號
2    INT    中斷訊號,與Ctrl-C效果一樣
9    KILL    殺死訊號,KILL訊號不會真正意義上傳送到目標程式,而是核心立即終止該程式
15    TERM    終止訊號,kill命令預設傳送的訊號型別,程式接受訊號,然後終止
18    CONT    繼續執行訊號,恢復接受STOP訊號暫停的程序
19    STOP    暫停訊號,與KILL訊號類似,不會被髮送給目標程序
3    QUIT    退出訊號
11    SEGV    段錯誤訊號,如果程式非法使用了記憶體空間,即程式試圖在沒有寫許可權的空間執行寫操作,那麼系統將傳送該訊號
20    TSTP    終端暫停訊號,在按下Ctrl-Z鍵時終端將發出該訊號,與STOP訊號不同,TSTP訊號由程式接受,但程式可以選擇忽略該訊號
28    WINCH    視窗改變訊號,當視窗改變大小時,系統將傳送該訊號
kill -1 13546: 向程序13546傳送HUP訊號,使程序掛起
kill -INT 13601: 向程序13601傳送INT訊號,使程序中斷
kill -SIGINT 13608: 同上
kill -l: 顯示kill命令完整的訊號列表
killall xlogo: 終止多個xlogo程序
其他與程序相關的命令:
pstree: 以樹狀的模式輸出程序列表,該模式顯示了程序間的父/子關係
vmstat: 輸出系統資源使用情況的快照,包括記憶體、交換空間和磁碟IO。若在命令後面加上間隔時間(以秒為單位),將按間隔時間動態更新內容,Ctrl-C可終止輸出
xload: 用來繪製顯示系統時間負載情況圖形的一種圖形化介面程式
tload: 類似於xload,但是圖形是在終端上繪製,Ctrl-C終止輸出

第二部分  配置與環境

第11章  環境
printenv: 列印部分或全部的環境資訊
set: 設定shell選項
export: 將環境匯出到隨後要執行的程式中
alias: 為命令建立一個別名
printenv | less: 顯示環境變數
printenv USER: 顯示變數USER的值
set | less: 顯示shell變數、環境變數以及任何已定義的shell函式
echo $HOME: 顯示變數HOME的值
alias: 顯示環境變數中的別名
環境變數:
DISPLAY 執行圖形介面環境時介面的名稱,通常為:O
EDITOR 用於文字編輯的程式名稱
SHELL 本機shell名稱
HOME 本機主目錄的路徑名
LANG 定義了本機語言的字符集和排序規則
OLD_PWD 先前的工作目錄
PAGER 用於分頁輸出的程式名稱
PATH 以冒號分割的一個目錄列表,當用戶輸入一個可執行程式的名稱時,會查詢該目錄列表
PS1 提示符字串1
PWD 當前工作目錄
TERM 終端型別的名稱
TZ 用於指定本機所處的時區
USER 使用者名稱
login shell的啟動檔案:
/etc/profile 適用於所有使用者的全域性配置指令碼
~/.bash_profile 使用者的個人啟動檔案,可擴充套件或重寫全域性配置指令碼中的設定
~/.bash_login 若~/.bash_profile缺失,則bash嘗試讀取此指令碼
~/.profile 若~/.bash_profile與~/.bash_login均缺失,則bash嘗試讀取此檔案
non-login shell的啟動檔案:
/etc/bash.bashrc 適用於所有使用者的全域性配置指令碼
~/.bashrc 使用者的個人啟動檔案,可擴充套件或重寫全域性配置指令碼中的設定
source .bashrc: 命令bash重新讀取.bashrc檔案

第12章  VI簡介
vi: 啟動vi
:q: 退出vi
:q!: 強制退出vi
vi foo.txt: 啟動vi,並建立foo.txt檔案
i鍵: 進入插入模式
esc鍵: 退出插入模式,返回命令模式
:w: 將檔案寫入硬碟
:wq:儲存並退出vi
vi游標移動功能鍵:
L或右方向鍵 右移一位
H或左方向鍵 左移一位
J或下方向鍵 下移一位,5j下移5行
K或上方向鍵 上移一位
數字0 至本行開頭
Shift-6(^) 至本行第一個非空字元
Shift-4($) 至本行末尾
W 至下一單詞或標點的開頭
Shift-W(W) 至下一單詞的開頭,忽略標點
B 至上一單詞或標點的開頭
Shift-B(B) 至上一單詞的開頭,忽略標點
Ctrl-F或Page Down 下翻一頁
Ctrl-B或Page Up 上翻一頁
number-Shift-G 至第number行,1G會移動到檔案的第一行
Shift-G 至檔案的最後一行
o鍵: 當前行的下方插入一行
O鍵: 當前行的上方插入一行
U鍵: 撤銷最後一次操作
文字刪除命令:
命令    刪除內容
x     當前字元
3x     當前字元和之後2個字元
dd     當前行
5dd     當前行和之後4行
dW     當前字元到下一單詞的起始
d$     當前字元到當前行的末尾
d0     當前字元到當前行的起始
d^     當前字元到當前行下一個非空字元
dG     當前行到檔案末尾
d20G     當前行到檔案第20行
複製命令:
命令    複製內容
yy    當前行
5yy    當前行和之後4行
yW    當前字元到下一單詞的起始
y$    當前字元到當前行的末尾
y0    當前字元到當前行的起始
y^    當前字元到當前行下一個非空字元
yG    當前行到檔案末尾
y20G    當前行到檔案第20行
p鍵:將快取中的內容貼上到游標之後
P鍵:將快取中的內容貼上到游標之前
J鍵:將當前行與下一行合併
fa: 將游標移動到本行下一處出現字元a的地方,輸入分號可重複上次搜尋
/Line: 搜尋整個檔案中的Line字串,輸入n可重複上次搜尋
:%s/Line/line/g: 將檔案中的所有Line替換為line
全域性搜尋和替換語法範例:
組成    含義
:    分號用於啟動一條ex命令
%    確定操作作用範圍,%代表從檔案第1行到最後1行,1,5代表從第1行到第5行,1,$代表從第1行到最後一行,若不指定範圍則命令只在當前行生效
s    指定具體的操作-本次為替換
/Line/line    搜尋和替換的文字
g    代表global,對搜尋到的每一行的每一個例項進行替換,若g缺失,則只替換每一行第一個符合條件的例項
:%s/line/Line/gc: 命令末尾新增c,則在每次替換之前請求使用者確認
替換確認功能鍵:
功能鍵    行為
y    執行替換
n    跳過此次替換
a    執行此次替換和之後的所有替換
q或ESC    停止替換
l    執行此次替換並退出替換
Ctrl-E, Ctrl-Y    分別是向下滾動和向上滾動,用於檢視替換處的上下文
:n: vi開啟多個檔案時從一個檔案切換到下一個檔案,加!則為放棄儲存強制切換
:N: vi開啟多個檔案時從一個檔案切換到上一個檔案,加!則為放棄儲存強制切換
:e ls-output.txt: vi開啟一個檔案時,開啟另一個檔案
:r foo.txt: 將foo.txt中的內容插入到游標處
:w foo1.txt: 將檔案另存為foo1.txt

第13章  定製提示符
echo $PS1: 顯示定義提示符的環境變數PS1的值
shell提示符中使用的轉義字元:
轉義字元    含義
\a    ASCII鈴聲
\d    當前日期,星期、月、日
\h    本地機器的主機名,不帶域名
\H    完整的主機名
\j    當前shell會話中進行的任務數
\l    當前終端裝置的名稱
\n    換行符
\r    回車符
\s    shell程式的名稱
\t    當前時間(24小時制),時:分:秒
\T    當前時間(12小時制)
\@    當前時間(12小時制),AM/PM
\A    當前時間(24小時制),時:分
\u    當前使用者的使用者名稱
\v    shell的版本號
\V    shell的版本號和發行號
\w    當前工作目錄名
\W    當前工作目錄名的最後一部分
\!    當前命令的歷史編號
\#    當前shell會話中輸入的命令數
\$    在非管理員許可權下輸出"$",在管理員許可權下輸出"#"
\[    標誌一個或多個非列印字元序列的開始
\]    標誌非列印字元序列的結束
設定文字顏色的轉義字元:
字元序列        文字顏色
\033[0;30m    黑色
\033[0;31m    紅色
\033[0;32m    綠色
\033[0;33m    棕色
\033[0;34m    藍色
\033[0;35m    紫色
\033[0;36m    青色
\033[0;37m    淡灰色
\033[1;30m    深灰色
\033[1;31m    淡紅色
\033[1;32m    淡綠色
\033[1;33m    黃色
\033[1;34m    淡藍色
\033[1;35m    淡紫色
\033[1;36m    淡青色
\033[1;37m    白色
PS1="\[\033[0;31m\]<\
[email protected]
\h \W>\$ ": 將提示符設為紅色
PS1="\[\033[0;31m\]<\[email protected]\h \W>\$\[\033[0m\] ": 將提示符設為紅色,之後字元設為原來顏色
設定背景顏色的轉義字元:
字元序列        背景顏色
\033[0;40m    黑色
\033[0;41m    紅色
\033[0;42m    綠色
\033[0;43m    棕色
\033[0;44m    藍色
\033[0;45m    紫色
\033[0;46m    青色
\033[0;47m    淡灰色
PS1="\[\033[0;41m\]<\
[email protected]
\h \W>\$\[\033[0m\] ": 將提示符背景設為紅色,之後字元設為原來顏色
游標移動轉義序列:
轉義序列        動作
\033[1;1H    將游標移動至1行1列
\033[nA        將游標向上移動n行
\033[nB        將游標向下移動n行
\033[nC        將游標向前移動n個字元
\033[nD        將游標向後移動n個字元
\033[2J        清空螢幕並將游標移動至左上角(第0行第0列)
\033[K        清空當前游標位置到行末的內容
\033[s        儲存當前游標為至
\033[u        恢復之前儲存的游標位置
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\
[email protected]
\h \W>\$ ": 提示符出現時,螢幕上方繪製出一個紅色橫條,橫條中有黃色文字顯示的時間

第三部分  常見任務和主要工具

第14章  軟體包管理
yum search search_string: 包搜尋命令
yum install package_name: 軟體包安裝命令,從庫源中下載
rpm -i package_file: 低階軟體包安裝命令,從非庫源中下載
yum erase package_name: 軟體包移除命令
yum update: 軟體包更新命令
rpm -U package_file: 低階軟體包更新命令,從非庫源中下載
rpm -qa: 軟體包列表命令
rpm -q package_name: 判斷軟體包是否安裝
yum info package_name: 顯示已安裝軟體包的相關資訊
rpm -qf file_name: 檢視某具體檔案是由哪個軟體包安裝得到

第15章  儲存介質
mount: 掛載檔案系統
unmount: 解除安裝檔案系統
fdisk: 硬碟分割槽命令
fsck: 檢查修復檔案系統
fdformat: 格式化軟盤
mkf: 建立檔案系統
dd: 向裝置直接寫入面向塊資料
genisoimage(mkisofs): 建立一個ISO9600映像檔案
wodim(cdrecord): 向光儲存介質寫入資料
md5sum: 計算MD5校驗碼
mount: 顯示已經掛載的檔案系統列表
umount /dev/hdc: 解除安裝hdc裝置
mount -t iso9660 /dev/hdc /mnt/cdrom: 將hdc裝置掛載到/mnt/cdrom目錄上
sudo fdisk /dev/sdb: 啟動fdisk程式
p: 顯示裝置的分割槽表
l: 顯示分割槽型別對照表
t: 改變分割槽ID
w: 向設別寫入修改後的分割槽表
sudo mkfs -t ext3 /dev/sdb1: 在/dev/sdb1上建立ext3檔案系統
sudo mkfs -t vfat /dev/sdb1: 在/dev/sdb1上建立fat32檔案系統
sudo fsck /dev/sdb1: 檢查/dev/sdb1裝置
dd if=/dev/sdb of=/dev/sdc: 將/dev/sdb中的內容全部複製到/dev/sdc中

第16章  網路
ping: 向網路主機發送ICMP ECHO_REQUEST資料包
traceroute: 顯示資料包到網路主機的路由路徑
netstat: 顯示網路連線、路由表、網路介面資料、偽連線以及多點傳送成員資訊
ftp: 檔案傳輸命令
lftp: 改善後的檔案傳輸命令
wget: 非互動式網路下載器
ssh: OpenSSH版的SSH客戶端(遠端系統登入命令)
scp: secure copy,遠端複製檔案命令
sftp: secure file transfer program,安全檔案傳輸程式
pint linuxcommand.org:向linuxcommand.org傳送IMCP ECHO_REQUEST資料包,Ctrl-C結束
traceroute slashdot.org: 顯示檔案傳送到slashdot.org過程中所有停靠點的列表
netstat -ie: 檢視系統中的網路介面資訊
netstat -r: 檢視網路之間傳送資料包時網路的配置情況
ssh remote-sys: 連線遠端主機remote-sys
ssh [email protected]: 登入遠端系統[email protected]
ssh remote-sys 'ls *' > dirlist.txt: 在遠端系統中執行ls命令後將結果輸出到本地系統檔案中
ssh remote-sys 'ls * > dirlist.txt': 在遠端系統中執行ls命令後將結果輸出到遠端系統檔案中
scp remote-sys:document.txt .: 從遠端系統的home目錄中將document.txt檔案複製到本地系統的當前工作目錄下
scp [email protected]:document.txt .: 同上

第17章  檔案搜尋
locate: 通過檔名查詢檔案
find: 在檔案系統目錄框架中查詢檔案
xargs: 從標準輸入中建立、執行命令列
touch: 更改檔案的日期時間
stat: 顯示檔案或檔案系統的狀態
locate bin/zip: 查詢以zip開頭且目錄名以bin/結尾的檔案
locate zip | grep bin: 查詢包含zip且包含目錄中包含bin的檔案
find ~: 列出主目錄(~)下的檔案列表清單
find ~ | wc -l: 計算主目錄(~)下檔案數
find ~ -type d | wc -l: 對目錄進行搜尋
find ~ -type f | wc -l: 對普通檔案進行搜尋
find支援搜尋的檔案型別:
b    塊裝置檔案
c    字元裝置檔案
d    目錄
f    普通檔案
l    符號連結
find ~ -type f -name "*.JPG" -size +1M | wc -l: 查詢所有符合*.JPG萬用字元格式以及大小超過1MB的普通檔案
find支援的計量單位:
b    512位元組的塊(沒有具體說明時的預設值)
c    位元組
w    兩個位元組的字
k    KB
M    MB
G    GB
find命令的test項引數:
test引數    描述
-cmin n        匹配n分鐘前改變狀態(內容或屬性)的檔案或目錄,如果不到n分鐘,就用-n,如果超過n分鐘,就用+n
-cnewer file    匹配內容或屬性的修改時間比檔案file更晚的檔案或目錄
-ctime n    匹配系統中n*24小時前檔案狀態被改變的檔案或目錄
-empyt        匹配空檔案或空目錄
-group name    匹配屬於name組的檔案或目錄,name為組名或ID號
-iname pattern    與-name test類似,只是不區分大小寫
-inum n        匹配索引結點是n的檔案
-mmin n        匹配n分鐘前內容被修改的檔案或目錄
-mtime n    匹配n*24小時前只有內容被更改的檔案或目錄
-name pattern    匹配有特定萬用字元模式的檔案或目錄
-newer file    匹配內容的修改時間比file檔案更近的檔案或目錄
-nouser        匹配不屬於有效使用者的檔案或目錄
-nogroup    匹配不屬於有效組的檔案或目錄
-perm mode    查詢訪問許可權與既定模式匹配的檔案或目錄,既定模式可以是八進位制或符號形式
-regex pattern    把find輸出的整個結果作為要匹配的物件
-samefile name    匹配與file檔案用相同的inode號的檔案
-size n        匹配n大小的檔案
-user name     匹配屬於name使用者的檔案和目錄,name可以是使用者名稱或ID號
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \): 查詢訪問許可權不是0600的檔案和訪問許可權不是0700的子目錄
find命令的邏輯操作符:
-and    與操作,簡寫為-a
-or    或操作,簡寫為-o
-not    非操作,簡寫為-!
()    括號操作,需用引號引起來,或用反斜槓
預定義的find命令操作:
-delete        刪除匹配檔案
-ls        以標準格式輸出其檔名以及所要求的其他資訊
-print        將匹配的檔案的全路徑以標準形式輸出,當沒有指定任何操作時,該操作是預設操作
-quit        匹配成功便退出
find ~ -type f -name '*.BAK' -delete: 查詢並刪除以.BAK字尾的檔案
find ~ -type f -name 'foo*' -ok ls -l '{}' ';': 查詢並列出以foo開頭的檔案,ls執行前會詢問使用者是否執行
find ~ -type f -name 'foo*' -exec ls -l '{}' ';': 同上,只是不再詢問使用者
find ~ -type f -name 'foo*' -exec ls -l '{}' +: 每次找到匹配檔案後執行一次ls命令
find ~ -type f -name 'foo*' -print | xargs ls -l: 同上
find ~ -iname '*.jpg' -print0 | xargs --null ls -l: 可以查詢檔名中包含空格的檔案,-print0產生以空字元作為引數之間分隔符的輸出,--null接收以空字元為引數分隔符的輸入
touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}: 設定或更新檔案的修改時間,若檔案不存在時,則建立一個空檔案
stat playground/timestamp: 顯示檔案timestamp的所有資訊和屬性
find命令的option選項:
-depth            引導find程式處理目錄前先處理目錄內檔案,當指定-delete操作時,該引數選項會自動呼叫
-maxdepth levels    當執行測試條件行為時,設定find程式陷入目錄數的最大級別數
-mindepth levels    在應用測試條件和行為之前,設定find程式陷入目錄數的最小級別數
-mount            引導find不去遍歷掛載在其他檔案系統上的目錄
-noleaf            指導find程式不要基於“正在搜尋類UNIX檔案系統”的假設來優化它的搜尋

第18章  歸檔和備份
gzip: 壓縮和解壓縮檔案工具
bzip2: 塊排序檔案壓縮工具
tar: 磁帶歸檔工具
zip: 打包和壓縮檔案
rsync: 遠端檔案和目錄的同步
gzip foo.txt: 壓縮檔案foo.txt
gunzip foo.txt: 解壓縮檔案foo.txt
gzip的選項:
-c    將輸出內容寫到標準輸出埠並保持原有檔案
-d    解壓縮
-f    強制壓縮,即便原檔案的壓縮版本已經存在
-h    顯示有用資訊
-l    列出所有壓縮檔案的壓縮統計
-t    如果操作引數用有一個或多個目錄,則遞迴壓縮包含在目錄中的檔案
-r    檢驗壓縮檔案的完整性
-v    在壓縮時顯示詳細資訊
-number    設定壓縮級別,1是速度最快,壓縮比最小,9是速度最慢,壓縮比最大,gzip預設的壓縮級別是6
bzip2 foo.txt: 壓縮檔案foo.txt,犧牲速度以換取高質量
bunzip2 foo.txt.bz2: 解壓縮檔案foo.txt.bz2
tar命令的操作模式:
c    建立檔案和/或目錄列表的歸檔檔案
x    從歸檔檔案中提取檔案
r    在歸檔檔案末尾追加指定路徑名
t    列出歸檔檔案的內容
f    指定歸檔檔名
tar cf playground.tar playground: 將playground資料夾歸檔到playground.tar檔案中
tar tf playground.tar: 列出playground.tar中的內容
tar tvf playground.tar: 列出playground.tar中的詳細內容
tar xf ../playground.tar: 提取playground.tar中的內容到當前目錄
tar xf ../playground2.tar --wildcards 'home/me/playground/dir-*/file-A': 提取playground2.tar中與萬用字元相符的檔案到當前目錄
find playground -name 'file-A' -exec tar rf playground.tar '{}' '+': 將查詢到的檔案新增到playground.tar中
find playground -name 'file-A' | tar cf - --files-from=- | gzip > playground.tgz: 將查詢到的檔案歸檔後壓縮為playground.tgz
find playground -name 'file-A' | tar czf playground.tgz -T -: 同上
find playground -name 'file-A' | tar cjf playground.tbz -T -: 將查詢到的檔案歸檔後壓縮為playground.tbz
zip -r playground.zip playground: 將playground中的內容壓縮排playground.zip
unzip ../playground.zip: 將playground.zip中的內容提取到當前目錄
unzip -l playground.zip playground/dir-087/file-Z: 將playground.zip中檔案file-Z的內容列出
unzip ..playground.zip playground/dir-087/file-Z: 將playground.zip中檔案file-Z提取到當前目錄
find playground -name 'file-A' | zip [email protected] file-A.zip: 將查詢到的檔案壓縮排file-A.zip中
ls -l /etc | zip ls-etc.zip -: 將/etc的列表資訊壓縮排ls-etc.zip中
unzip -p ls-etc.zip | less: 將ls-etc.zip中的內容提取到less中
rsync -av playground foo: 將playground同步到foo,-a遞迴歸檔並保留檔案屬性,-v詳細輸出
sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup: 將/etc /home /usr/local同步到/backup,--delete移除殘留於備份裝置中而源裝置中已經不存在的檔案
sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup: 將/etc /home /usr/local同步到遠端系統remote-sys中的backup中,--rsh=ssh使用ssh命令作為其遠端shell命令

第19章  正則表示式
ls /usr/bin | grep zip: 搜尋/usr/bin中包含zip的所有檔案
grep選項:
-i    忽略大小寫,--ignore-case
-v    不匹配,輸出不包含匹配項的所有行,--invert-match
-c    輸出匹配項數目,--count
-l    輸出匹配項檔名,--files-with-matches
-L    輸出不匹配項檔名,--files-without-match
-n    在每個匹配行前面加上該行在檔案內的行號, --line-number
-h    進行多檔案搜尋時,抑制檔名輸出,--no-filename
grep bzip dirlist*.txt: 在多個檔案dirlist*.txt中搜索包含bzip的行
grep -l bizp dirlist*.txt: 只列出包含bzip的檔案的檔名
grep -L bizp dirlist*.txt: 只列出不包含匹配項的檔案的檔名
grep -h '.zip' dirlist*.txt: 點字元用於匹配任意一個字元,即查詢包含四個字元且後三個字元為zip的行
grep -h '^zip' dirlist*.txt: 插入符(^)表示只與開頭內容進行比較
grep -h 'zip$' dirlist*.txt: 美元符號($)表示只與末尾內容進行比較
grep -h '^zip$' dirlist*.txt: 表示搜尋行開頭和末尾都有zip的行
grep -i '^..j.r$' /usr/share/dict/words: 查詢長度為5、第3個字母是j以及末尾是r的所有單詞
grep -h '[bg]zip' dirlist*.txt: 中括號用於匹配指定字符集中的單個字元,查詢包含bzip或gzip的行
grep -h '[^bg]zip' dirlist*.txt: 中括號中的^表示否定,^之後的字元被當作不應該在指定位置出現的字符集,且^必須出現在中括號表示式的第一個字元位置,若果不是第一個則只是普通字元
grep -h '^[A-Z]' dirlist*.txt: 連字元(-)表示字元範圍,即查詢以大寫字母開頭的行
grep -h '^[A-Za-z0-9]' dirlist*.txt: 查詢以字母和數字開頭的行
grep -h '[-AZ]' dirlist*.txt: 查詢包含連字元(-)、A或Z的行
POSIX字元類:
[:alnum:]    字母字元和數字字元
[:word:]    基本與[:alnum:]一樣,只是多了一個下劃線(_)字元
[:alpha:]    字母字元
[:blank:]    包括空格和製表符
[:cntrl:]    ASCII控制碼,包括ASCII字元0~31以及127
[:digit:]    數字0~9
[:graph:]    可見字元,在ASCII中,包括數字33~126
[:lower:]    小寫字母
[:punct:]    標點符號字元
[:print:]    可列印字元,包括[:graph:]和空格字元
[:space:]    空白字元,如空格符、製表符、回車符、換行符、垂直製表符以及換頁符
[:upper:]    大寫字母
[:xdigit:]    用於表示十六進位制的字元
echo "AAA" | grep -E 'AAA|BBB': 將echo的輸出結果送至grep進行匹配搜尋,"|"表示或,-E表示擴充套件正則表示式
grep -Eh '^(bz|gz|zip)' dirlist*.txt: 查詢以bz、gz或zip開頭的行
grep -Eh '^bz|gz|zip' dirlist*.txt: 查詢以bz開頭或包含gz或zip的行
?--匹配某元素0次或1次
echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$': 括號字元後面“?”表示括號字元只能匹配一次或零次,由於括號字元在ERE中通常是元字元,故在前面加上了反斜槓告訴shell此括號為文字字元
*--匹配某元素多次或零次
echo "This works." | grep -E '^[[:upper:]][[:upper:][:lower:] ]*\.': 匹配是否是一句話,即是否以大寫字母開頭而以句號結束,且中間內容是任意數目的大小寫字母和空格
+--匹配某元素一次或多次
echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$': 匹配由單個空格分隔的一個或多個字元組成的行
{}--以指定次數匹配某元素
指定匹配次數:
{n}    前面的元素恰好出現n次則匹配
{n,m}    前面的元素出現的次數在n~m次之間則匹配
{n,}    前面的元素出現的次數超過n次則匹配
{,m}    前面的元素出現的次數不超過m次則匹配
echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$': 匹配電話號碼形式,(nnn) nnn-nnnn和nnn nnn-nnnn
find . -regex '.*[^-_./0-9a-zA-Z].*': 查詢包括[-_./0-9a-zA-Z]字符集之外字元的檔案,.代表當前目錄,-regex要求整個路徑名與正則表示式的描述完全一樣
locate --regex 'bin/(bz|gz|zip)': 查詢路徑名中包含bin/bz、bin/gz或bin/zip等字串的檔案,--regex表示支援擴充套件正則表示式

第20章  文字處理
cat: 連線文字並列印到標準輸出
sort: 對文字行排序
uniq: 報告並省略重複行
cut: 從每一行中移除文字區域
paste: 合併檔案文字行
join: 基於某個共享欄位來聯合兩個檔案的文字行
comm: 逐行比較兩個已經排序好的檔案
diff: 逐行比較檔案
patch: 對原檔案打補丁
tr: 轉換或刪除字元
sed: 用於過濾和轉換文字的流編輯器
aspel: 互動式拼寫檢查器
cat > foo.txt: 向foo.txt中輸入內容,Ctrl-D表示到達檔案末尾
cat -A foo.txt: 顯示foo.txt中的內容,-A顯示非列印字元
cat -ns foo.txt: -n對行編號,-s禁止輸出多個空白行
sort > foo.txt: 將標準輸入的行進行排序後寫入too.txt
sort file1.txt file2.txt file3.txt > final_sorted_list.txt: 將多個檔案融合為一個排序好的檔案
常見的sort選項:
選項    全域性選項            描述
-b    --ignore-leading-blanks    忽略行開頭的空格,並且從第一個非空白字元開始排序
-f    --ignore-case        排序時不區分字元的大小寫
-n    --numeric-sort        基於字串的長度進行排序
-r    --reverse        逆序排序
-k    --key=field1[,field2]    對field1與field2之間的字元排序,而不是整個文字行
-m    --merge            將每個輸入引數當作已排好序的檔名,將多個檔案合併為一個排好序的檔案,而不執行額外的排序操作
-o    --output=file        將排序結果輸出到檔案而不是標準輸出
-t    --field-separator=char    定義欄位分隔符,預設情況下,欄位是由空格或製表符分開的
du -s /usr/share/* | head: 列出一個以路徑名順序排列的列表,head只輸出前10項
du -s /usr/share/* | sort -nr | head: 列出按數值逆序排列的列表
ls -l /usr/bin | sort -nr -k 5 | head: 根據每行第5個字串進行逆序排序
sort --key=1,1 --key=2n distros.txt: --key=1,1指定對第一個欄位排序,--key=2n指定第二個欄位是排序的鍵值,並且按照數值排序,也可以使用-k 1 -k 2n格式
sort -k 3.7nbr -k 3.1nbr -k3.4nbr distros.txt: -k 3.7nbr從第3個欄位的第7個字元開始排序,nr進行逆序數值排序,b刪除第3個欄位中開頭的空格(行與行之間的空格字元數量不同,會影響排序結果)
sort -t ':' -k 7 /etc/passwd | head: -t指定':'字元作為欄位分隔符
sort foo.txt | uniq: uniq只對已排好序的文字其作用,即只能移除相鄰的重複行
常見uniq選項:
-c    輸出重複行列表,並且重複行前面加上其出現的次數
-d    只輸出重複行,而不包括單獨行
-f n    忽略每行前n個欄位,欄位之間以空格分開
-i    行與行之間比較時忽略大小寫
-s n    跳過(忽略)每行的前n個字元
-u    僅輸出不重複的行,該選項是預設的
cut選項:
-c char_list     從文字行中提取char_list定義的部分內容
-f field_list    從文字行中提取field_list定義的一個或多個欄位
-d delim_char    指定-f選項後,使用delim_list作為欄位的分界符,預設時,欄位必須以單個Tab製表符隔開
--complement    從文字中提取整行,除了那些由-c或-f指定的部分
cut -f 3 distros.txt: 提取第3個欄位
cut -f 3 distros.txt | cut -c 7-10: 提取第3個欄位中第7至第10個字元
cut -d ':' -f 1 /ect/passwd | head: 指定':'為分界符,提取每行的第1個欄位
paste distros-dates.txt distros-versions.txt: 讀取兩個檔案並將每個檔案中提取的欄位結合為一個整體的標準輸出流
join distros-key-names.txt distros-key-vernums.txt | head: 檔案必須以共有欄位排好序,且按共有欄位進行拼接
comm file1.txt file2.txt: 比較兩個已排序好的檔案,結果中第一列為第一個檔案中獨有的行,第二列為第二個檔案中獨有的行,第三列為兩個檔案共有的行
comm -12 file1.txt file2.txt: 省略結果中第1列和第2列的內容,-3則為省略結果中第3列的內容
diff file1.txt file2.txt: 檢測兩檔案的並不同
diff改變命令:
r1ar2    將第二個檔案中r2位置的行新增到第一個檔案中的位置r1處
r1cr2    用第二個檔案r2處的行替代第一個檔案r1處的行
r1dr2    刪除第一個檔案r1處的行,並且刪除的內容作為第二個檔案r2行範圍的內容
diff -c file1.txt file2.txt: 以上下文格式輸出比較結果
diff上下文格式差異識別符號:
(無)    該行表示上下文文字,表示兩個檔案共有的行
-    缺少的行,指此行內容只在第一個檔案中出現,第二個檔案中則沒有
+    多餘的行,指此行內容只有第二個檔案才有,第一個檔案則沒有
!    改變的行,兩個版本的內容都後顯示出來,每一個都各自出現在差異組中相應的部分
diff -u file1.txt file2.txt: 以統一格式輸出比較結果
diff統一格式差異識別符號:
(無)    兩個檔案共有的行
-    相對於第二個檔案而言,第一個檔案中沒有的行
+    第一個檔案中多餘的行
diff -Naur file1.txt file2.txt > patchfile.txt: 建立將file1.txt更新為file2.txt的diff檔案
patch < patchfile.txt: 將file1.txt修補為file2.txt
tr--替換或刪除字元
echo "lowercase letters" | tr a-z A-Z: 將小寫字母替換為相應的大寫字母
echo "lowercase letters" | tr [:lower:] A: 將小寫字母全部替換為A
echo "secret text" | tr a-zA-Z n-za-mN-ZA-M: 將每個字母在字母表中向上移動13位,成為POT13編碼
echo "frperg grkg" | tr a-zA-Z n-za-mN-ZA-M: 再向上移動13位則得到原始碼
echo "aaabbbccc" | tr -s ab: 刪除重複出現的字元,且重複的字元必須時毗鄰的
sed--用於文字過濾和轉換的流編輯器
echo "front" | sed 's/front/back/': s指替換,front為被替換的欄位,back為用於替換的欄位
echo "front" | sed 's_front_back_': 任意字元均可作為分界符
echo "front" | sed '1s/front/back/': 1代表替換操作只對輸入流的第一行起作用
sed的地址表示法:
n        n是正整數,表示行號
$        最後一行
/regexp/    用POSIX基本正則表示式描述的行
addr1,addr2    行範圍,表示從addr1至addr2的所有行
first~step    代表行號從first行開始,以step為間隔的所有行
addr1,+n    addr1行以及其後的n行
addr!        除了addr行之外的所有行
sed -n '1,5p' distros.txt: 顯示distros.txt檔案中第1行到第5行的內容,-n為禁止自動列印,p命令為輸出指定匹配行的內容
sed -n '/SUSE/p' distros.txt: 使用正則表示式/SUSE/,查詢包含SUSE字串的文字行
sed -n '/SUSE/!p' distros.txt: 顯示那些與正則表示式不匹配的行
sed基本編輯指令:
=            輸出當前行號
a            在當前行後附加文字
d            刪除當前行
i            在當前行前輸入文字
p            列印當前行
q            退出sed不再處理其他行,如果沒有指定-n,就會輸出當前行
s/regexp/replacement/    將regexp的內容替換為replacement代表的內容
y/set1/set2        將字符集set1轉換為字符集set2,sed要求兩字符集等長
sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' distros.txt:將distros.txt中12/07/2006格式的欄位改為2006-12-07格式,其中( { / 前要用\轉義,\1\2\3分別代表之前用括號括起來的相應欄位
echo "aaabbbccc" | sed 's/b/B/g': g代表對每行的所有匹配項進行替換
sed -f distros.sed distros.txt: -f表示執行命令指令碼檔案distros.sed
aspell check foo.txt: 檢查檔案的拼寫錯誤
aspell -H check foo.txt: 檢查HTML檔案的拼寫錯誤

第21章  格式化輸出
nl: 對行進行標號
fold: 設定文字行長度
fmt: 簡單的文字格式化工具
pr: 格式化列印文字
printf: 格式化並列印資料
grof: 文件格式化系統
nl distros.txt | head: 對行進行標號
nl標記:
\:\:\:    邏輯頁頁首開頭
\:\:    邏輯頁正文開頭
\:    邏輯頁頁尾開頭
nl常用選項:
-b style    按照style格式對正文進行編號,style是下面型別中的一種
        a 對每行編號
        t 僅僅對非空白行編號,此選項是預設的
        n 不對任何行進行編號
        pregexp 只對與基本正則表示式匹配的行進行編號
-f style    以style的格式對頁尾進行編號,預設選項是n(無)
-h style    以style的格式對標題進行編號,預設選項是n(無)
-i number    設定頁編號的步進值為number,預設值是1
-n format    設定編號格式為format,format是下面型別中的一種
        ln 左對齊,無縮排
        rn 右對齊,無縮排,這是預設選項
        rz 右對齊,有縮排
-p        在每個邏輯頁的開始不再進行頁編碼重置
-s string    在每行行號後面增加string作為分隔符,預設情況下是一個簡單的tab製表符
-v number    將每個邏輯頁的第一個行號設定為number,預設是1
-w width    設定行號欄位的寬度為width,預設值是6
sort -k 1,1 -k 2n distros.txt | sed -f distros-nl.sed | nl: 結合sort、sed和nl建立的一個增強版的報告
echo "The quick brown fox jumped over the lazy dog." | fold -w 12: 將文字行以指定的長度分解,-w指定寬度,預設是80個字元
echo "The quick brown fox jumped over the lazy dog." | fold -w 12 -s: -s指定在到達width字元數前最後一個有效空格處將原文字行斷開
fmt -w 50 fmt-info.txt | head: 每行50字元格式化輸出文字
fmt -cw 50 fmt-info.txt | head: -c保留段落前兩行的縮排,隨後的行都與第二行的縮排對齊
fmt選項:
-c        保留段落前兩行的縮排,隨後的行都與第二行的縮排對齊
-p string    只格式化以字首字串string開頭的行,格式化後,string的內容仍然會作為每一個格式化行的字首
-s        "僅截斷行"模式,只根據指定的列寬階段行,而短行並不會與其他行結合
-u        字元間隔統一,字元之間間隔一個空格字元,句子之間間隔兩個空格字元
-w width    格式化文字使每行不超過width個字元,預設值是75
fmt -w 50 -p '# ' fmt-code.txt: 格式化註釋內容而不改變程式碼行
pr -l 15 -w 65 distros.txt: 格式化為一系列包含15行每行65個字元的頁
printf "I formatted the string: %s \n" foo: 格式化輸出,結果為I formatted the string: foo
常用pringf資料型別指定符:
D    將一個數字格式化為有符號的十進位制表示形式
F    格式化數字並以浮點數的形式輸出
O    將一個整數格式化為八進位制格式的整數
s    格式化字串
x    將一個整數格式化為十六進位制的數,並且在使用字母時,用小寫字母a~f表示
X    與x類似,只是字母用大寫字母表示
%    列印文字元號"%"
printf轉換規範的組成部分:
flags        總共5個flag
        # 使用替代格式輸出,o類輸出結果以0開頭,x和X類輸出結果以0x和0X開頭
        0 用0填充輸出,如000380
        - 輸出左對齊,預設情況下是右對齊
        (空格) 為正數產生一個前導空格
        + 輸出正數符號,預設情況只會輸出負數的符號
width        一個數字,該數字指定了最小欄位寬度
.precision    對於浮點數,指定小數點後的小數精確度,對於字串轉換,指定輸出字元的個數
zcat /usr/share/man/man1/ls.1.gz | groff -mandoc -T ascii | head: 指定為mandoc“巨集包”以及ASCII的輸出
zcat /usr/share/man/man1/ls.1.gz | groff -mandoc | head: 未指定輸出格式時,預設格式為PostScript
zcat /usr/share/man/man1/ls.1.gz | groff -mandoc > ~/Desktop/foo.ps: 將groff命令的輸出結果存於foo.ps中
ps2pdf ~/Desktop/foo.ps ~/Desktop/foo.pdf: 將foo.ps轉換成pdf格式
sort -k 1,1 -k 2n distros.txt | sed -f distros-tbl.sed | groff -t -T ascii 2> /dev/null: -t表示先用tbl預處理文字流,-T則輸出ASCII格式的資料

第22章  列印
pr: 轉換文字檔案,從而進行列印操作
lpr: 列印檔案
lp: 列印檔案(System V)
a2ps: 格式化檔案,以在PostScript印表機上列印
lpstat: 顯示列印狀態資訊
lpq: 顯示印表機佇列狀態
lprm: 取消列印任務
cancel: 取消列印任務(System V)
常見的pr選項:
+first[:last]    輸出一個從first開始以last結束的頁範圍
-columns    將頁的內容分成指定的columns列
-a        預設情況下,多列輸出是垂直列出的,-a選項時內容是水平列出的
-d        隔行列印輸出
-D format    用format格式來格式化頁首的顯示日期
-f        使用換頁符而不是回車符作為頁與頁之間的分隔符
-h header    在頁首的中間部分,使用header代替正在處理的檔名
-l length    將頁的長度設為length,預設是66行
-n        對行進行編號
-o offset    建立一個有offset字元寬度的左頁邊距
-w width    設定頁面寬度為width,預設是72個字元
-t        省略頁首頁尾
ls /usr/bin | pr -3 -w 65 | head: 用pr將結果格式化為分頁的、三列輸出
ls /usr/bin | pr -3 | lpr: 將結果送至系統預設印表機
lpstat -a: 檢視系統印表機列表
常用lpr選項:
-# number    列印number份副本
-p        每一頁都將包括日期、時間、工作名稱和頁碼的頁首用陰影打印出來
-P printer    指定用於列印輸出的印表機名,如未指定則用系統預設印表機
-r        列印結束後刪除檔案
常見lp選項:
-d printer        設定目標印表機為printer,如果未指定則使用系統預設印表機
-n number        列印number份副本
-o landscape        將輸出設定為橫向
-o fitplot        根據頁面大小縮放檔案
-o scaling=number    設定檔案縮放比為number,100時正好填充一頁紙,如果小於100,則一頁紙填不滿,大於100則列印內容將列印在多個頁面上
-o cpi=number        設定每英寸輸出字元數位number,預設是10
-o lpi=number        設定每英寸輸出指定number的行,預設是6
-o page-bottom=points
-o page-left=points    
-o page-right=points    設定頁邊距
-o page-top=points
-P pages        指定頁列表,如1,3,5,7-10
ls /usr/bin | pr -4 -w 90 -l 88 | lp -o page-left=36 -o cpi=12 -o lpi=8
ls /usr/bin | pr -3 -t | a2ps -o ~/Desktop/ls.ps -L 66: 將內容轉換成PostScript檔案,-t省略頁首頁尾,-o輸出到檔案,-L每頁66行
a2ps選項:
--center-title text    將中心頁標題設為text
--columns number    將頁分成n列,預設值