Linux下命令執(zhí)行順序控制與管道

技術(shù)交流QQ群:1027579432,歡迎你的加入!

一、命令執(zhí)行順序的控制

    1. 順序執(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
    1. 有選擇的執(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)常用到的就是匿名管道,在命令行中由|分隔符表示。
      1. 試用
      • 先試用一下管道,比如查看/etc目錄下有哪些文件和目錄,使用ls命令來查看:
        ls -al /etc
      • 有太多的內(nèi)容,屏幕不能完全顯示,這時(shí)候可以使用滾動(dòng)條或快捷鍵滾動(dòng)窗口來查看。不過這時(shí)候可以使用管道:
        ls -al /etc | less
      • 通過管道將前一個(gè)命令ls的輸出作為下一個(gè)命令less的輸入,然后就可以一行一行的查看。
      1. cut命令,打印每一行的某一段
      • 打印/etc/passwd文件中以:分隔符的第一個(gè)字段和第六個(gè)字段分別表示用戶名和home目錄:
        cut /etc/passwd -d ':' -f 1,6
      1. 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" 注:\表示一行的末尾
      1. 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
      1. sort排序命令
      • sort功能很簡單就是將輸入按照一定的方式排序,然后再輸出,它支持的排序有按字典排序、數(shù)字排序,按月排序,隨機(jī)排序,反轉(zhuǎn)排序,指定特定字段進(jìn)行排序等等。
        • 默認(rèn)為字典排序:
          cat /etc/passwd | sort
        • 按特定字段排序:
          cat /etc/passwd | sort -t ':' -k 3 -n
        • 參數(shù)說明:
      • -t:用于指定字段的分隔符
      • -k:用于指定對(duì)哪個(gè)字段進(jìn)行排序
      • -n:如果安裝數(shù)字排序就要加上-n參數(shù)
      1. 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容