技術(shù)交流QQ群:1027579432,歡迎你的加入!
一、命令執(zhí)行順序的控制
-
- 順序執(zhí)行多條命令
- 通常情況下,每次只能在終端輸入一條命令,執(zhí)行完成后,再輸入第二條命令,然后再按回車執(zhí)行。要想一次性輸入完執(zhí)行,可以使用簡單的順序執(zhí)行";"來完成。例如:
sudo apt-get update
sudo apt-get install cowsay
cowsay hello curry - 可以一次性輸入sudo apt-get update; sudo apt-get install cowsay; cowsay hello curry
-
- 有選擇的執(zhí)行命令
- 在順序執(zhí)行任務(wù)時(shí),如果前面的命令執(zhí)行不成功,而后面的命令又依賴于上一條命令的結(jié)果,那么就會(huì)造成花了時(shí)間,最終卻得到一個(gè)錯(cuò)誤的結(jié)果。那么需要能夠有選擇性的來執(zhí)行命令。比如:上一條命令執(zhí)行成功才繼續(xù)下一條,或者不成功又該做出其他什么處理,比如:可以使用which來查看是否安裝某個(gè)命令,如果找不到就執(zhí)行該命令,否則什么也不做。which cowsay> /dev/null && cowsay -f -head -in ohch~
- 在C語言中,&&表示邏輯與,||表示邏輯或,同樣shell中也有這兩個(gè)符號(hào)。它們的區(qū)別在于,shell中的這兩個(gè)符號(hào)除了可以用于表示邏輯的與和或之外,也可以實(shí)現(xiàn)命令執(zhí)行順序的簡單控制。&&表示如果前面的命令執(zhí)行結(jié)果返回0時(shí),則執(zhí)行后面的指令;否則不執(zhí)行。||就是與&&相反的控制效果,當(dāng)上一條命令執(zhí)行結(jié)果不是0時(shí),則執(zhí)行它后面的命令??梢詮??環(huán)境變量獲取上一次命令的返回結(jié)果:
which cowsay
echo $? cowsay未安裝,結(jié)果為1
which cat
echo $? 結(jié)果為0 - 除了基本的使用外,還可以結(jié)合&&和||來實(shí)現(xiàn)一些操作,比如:
which cowsay> /dev/null && echo "exist" || echo "not exist"
二、管道
- 管道是一種通信機(jī)制,通常用于進(jìn)程間的通信(也可以通過socket進(jìn)行網(wǎng)絡(luò)通信),它表現(xiàn)出來的形式就是將前面每一個(gè)進(jìn)程的輸出stdout直接作為下一個(gè)進(jìn)程的輸入stdin。
- 管道又分為匿名管道和具名管道,在使用一些過濾程序時(shí)會(huì)經(jīng)常用到的就是匿名管道,在命令行中由|分隔符表示。
-
- 試用
- 先試用一下管道,比如查看/etc目錄下有哪些文件和目錄,使用ls命令來查看:
ls -al /etc - 有太多的內(nèi)容,屏幕不能完全顯示,這時(shí)候可以使用滾動(dòng)條或快捷鍵滾動(dòng)窗口來查看。不過這時(shí)候可以使用管道:
ls -al /etc | less - 通過管道將前一個(gè)命令ls的輸出作為下一個(gè)命令less的輸入,然后就可以一行一行的查看。
-
- cut命令,打印每一行的某一段
- 打印/etc/passwd文件中以:分隔符的第一個(gè)字段和第六個(gè)字段分別表示用戶名和home目錄:
cut /etc/passwd -d ':' -f 1,6
-
- grep命令,在文本或stdin中查找匹配字符串
- grep命令是很強(qiáng)大的,也是相當(dāng)常用的一個(gè)命令,它結(jié)合正則表達(dá)式可以實(shí)現(xiàn)很復(fù)雜卻很高效的匹配和查找。搜索/home/cdl目錄下所有包含"cdl"的所有文本文件,并顯示出現(xiàn)在文本中的行號(hào):
grep -rnI "cdl" ~ - 參數(shù)說明:
- -r:表示遞歸搜索子目錄中的文件
- -n:表示打印匹配的行號(hào)
- -I:表示忽略二進(jìn)制文件
- 也可以在匹配字段中使用正則表達(dá)式,查看環(huán)境變量中以"roon"結(jié)尾的字符串
export | grep ".*roon表示一行的末尾
-
- wc命令,簡單小巧的計(jì)數(shù)工具
- wc命令用于統(tǒng)計(jì)并輸出一個(gè)文件中行、單詞和字節(jié)的數(shù)目,參數(shù)可以通過wc --help查看。輸出/etc/passwd文件的統(tǒng)計(jì)信息:
wc /etc/passwd - 再來結(jié)合管道來操作一下,下面統(tǒng)計(jì)/etc下面的所有目錄數(shù):
ls -dl /etc/*/ | wc -l
-
- sort排序命令
- sort功能很簡單就是將輸入按照一定的方式排序,然后再輸出,它支持的排序有按字典排序、數(shù)字排序,按月排序,隨機(jī)排序,反轉(zhuǎn)排序,指定特定字段進(jìn)行排序等等。
- 默認(rèn)為字典排序:
cat /etc/passwd | sort - 按特定字段排序:
cat /etc/passwd | sort -t ':' -k 3 -n - 參數(shù)說明:
- 默認(rèn)為字典排序:
- -t:用于指定字段的分隔符
- -k:用于指定對(duì)哪個(gè)字段進(jìn)行排序
- -n:如果安裝數(shù)字排序就要加上-n參數(shù)
-
- uniq去重命令
- uniq命令可以用于過濾或輸出重復(fù)行,使用history命令查看最近執(zhí)行過的命令:
history | cut -c 8- | cut -d ' ' -f 1 | uniq - 然后,經(jīng)過層層篩選和過濾,可以發(fā)現(xiàn)的確只輸出了執(zhí)行的命令那一列。不過,去重效果不明顯,之所以不明顯是因?yàn)閡niq命令只能去除連續(xù)重復(fù)的行,所以要達(dá)到預(yù)期效果,需要先進(jìn)行排序:
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq - 輸出重復(fù)過的行(重復(fù)的只輸出一個(gè))及重復(fù)次數(shù):
history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
-