部分轉(zhuǎn)自實(shí)驗(yàn)樓。
順序執(zhí)行多條命令
$ sudo apt-get update
# 等待——————————然后輸入下面的命令
$ sudo apt-get install some-tool //這里some-tool是指具體的軟件包,例如:banner
# 等待——————————然后輸入下面的命令
$ some-tool
簡單的順序執(zhí)行你可以使用 ; 來完成,比如上述操作你可以:
$ sudo apt-get update;sudo apt-get install some-tool;some-tool
# 讓它自己運(yùn)行
有選擇地執(zhí)行命令
$ which cowsay>/dev/null && cowsay -f head-in ohch~
&&就是用來實(shí)現(xiàn)選擇性執(zhí)行的,它表示如果前面的命令執(zhí)行結(jié)果(不是表示終端輸出的內(nèi)容,而是表示命令執(zhí)行狀態(tài)的結(jié)果,0為執(zhí)行成功,≠0為執(zhí)行不成功)返回0則執(zhí)行后面的,否則不執(zhí)行,你可以從$?環(huán)境變量獲取上一次命令的返回結(jié)果:

||在這里是與&&相反的控制效果,當(dāng)上一條命令執(zhí)行結(jié)果為≠0($?≠0)時(shí)則執(zhí)行它后面的命令。
管道
管道又分為匿名管道和具名管道。我們?cè)谑褂靡恍┻^濾程序時(shí)經(jīng)常會(huì)用到的就是匿名管道,在命令行中由 | 分隔符表示,| 在前面的內(nèi)容中我們已經(jīng)多次使用到了。具名管道簡單的說就是有名字的管道,通常只會(huì)在源程序中用到具名管道。
先試用一下管道,比如查看/etc目錄下有哪些文件和目錄,使用ls命令來查看:
$ ls -al /etc
有太多內(nèi)容,屏幕不能完全顯示,這時(shí)候可以使用滾動(dòng)條或快捷鍵滾動(dòng)窗口來查看。不過這時(shí)候可以使用管道:
$ ls -al /etc | less
通過管道將前一個(gè)命令(ls)的輸出作為下一個(gè)命令(less)的輸入,然后就可以一行一行地看。
cut 命令,打印每一行的某一字段
打印/etc/passwd文件中以:為分隔符的第1個(gè)字段和第6個(gè)字段分別表示用戶名和其家目錄:
$ cut /etc/passwd -d ':' -f 1,6
打印/etc/passwd文件中每一行的前N個(gè)字符:
# 前五個(gè)(包含第五個(gè))
$ cut /etc/passwd -c -5
# 前五個(gè)之后的(包含第五個(gè))
$ cut /etc/passwd -c 5-
# 第五個(gè)
$ cut /etc/passwd -c 5
# 2到5之間的(包含第五個(gè))
$ cut /etc/passwd -c 2-5
grep 命令,在文本中或 stdin 中查找匹配字符串
grep命令的一般形式為:
grep [命令選項(xiàng)]... 用于匹配的表達(dá)式 [文件]...
我們搜索/home/shiyanlou目錄下所有包含"shiyanlou"的文本文件,并顯示出現(xiàn)在文本中的行號(hào):
$ grep -rnI "shiyanlou" ~

-r 參數(shù)表示遞歸搜索子目錄中的文件,-n表示打印匹配項(xiàng)行號(hào),-I表示忽略二進(jìn)制文件。當(dāng)然也可以在匹配字段中使用正則表達(dá)式,下面簡單的演示:
# 查看環(huán)境變量中以"yanlou"結(jié)尾的字符串
$ export | grep ".*yanlou$"
export命令用于設(shè)置或顯示環(huán)境變量。$就表示一行的末尾。
wc 命令,簡單小巧的計(jì)數(shù)工具
wc 命令用于統(tǒng)計(jì)并輸出一個(gè)文件中行、單詞和字節(jié)的數(shù)目,比如輸出/etc/passwd文件的統(tǒng)計(jì)信息:
$ wc /etc/passwd
分別只輸出行數(shù)、單詞數(shù)、字節(jié)數(shù)、字符數(shù)和輸入文本中最長一行的字節(jié)數(shù):
# 行數(shù)
$ wc -l /etc/passwd
# 單詞數(shù)
$ wc -w /etc/passwd
# 字節(jié)數(shù)
$ wc -c /etc/passwd
# 字符數(shù)
$ wc -m /etc/passwd
# 最長行字節(jié)數(shù)
$ wc -L /etc/passwd
注意:對(duì)于西文字符來說,一個(gè)字符就是一個(gè)字節(jié),但對(duì)于中文字符一個(gè)漢字是大于2個(gè)字節(jié)的,具體數(shù)目是由字符編碼決定的。
再來結(jié)合管道來操作一下,下面統(tǒng)計(jì) /etc 下面所有目錄數(shù):
$ ls -dl /etc/*/ | wc -l
sort 排序命令
$ cat /etc/passwd | sort -t':' -k 3 -n
上面的-t參數(shù)用于指定字段的分隔符,這里是以":"作為分隔符;-k 字段號(hào)用于指定對(duì)哪一個(gè)字段進(jìn)行排序。這里/etc/passwd文件的第三個(gè)字段為數(shù)字,默認(rèn)情況下是以字典序排序的,如果要按照數(shù)字排序就要加上-n參數(shù)
uniq 去重命令
uniq命令可以用于過濾或者輸出重復(fù)行。
- 過濾重復(fù)行
我們可以使用history命令查看最近執(zhí)行過的命令,不過你可能只想查看使用了哪個(gè)命令而不需要知道具體干了什么,那么你可能就會(huì)要想去掉命令后面的參數(shù)然后去掉重復(fù)的命令:
$ history | cut -c 8- | cut -d ' ' -f 1 | uniq
uniq命令只能去連續(xù)重復(fù)的行,不是全文去重。要達(dá)到預(yù)期效果,我們先排序:
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
# 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u
- 輸出重復(fù)行
# 輸出重復(fù)過的行(重復(fù)的只輸出一個(gè))及重復(fù)次數(shù)
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
# 輸出所有重復(fù)的行
$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D