日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux基础 -- 命令执行顺序控制与管道

發布時間:2025/6/15 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux基础 -- 命令执行顺序控制与管道 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

1、命令執行順序的控制

1.1、順序執行多條命令

Linux中讓命令順序執行,可以使用;來完成。和Java中很像,分號用來分隔多條命令,被分隔的命令依次執行。比如:

$ sudo apt-get update # 等待——————————然后輸入下面的命令 $ sudo apt-get install some-tool # 等待——————————然后輸入下面的命令 $ some-tool

這三條命令,中間需要等待,等一條完成后再輸入下一條。實際上我們可以將其用分號分隔,一次性輸入,達到同樣的效果,而無需等待一個完成之后才輸入下一條命令:

$ sudo apt-get update;sudo apt-get install some-tool;some-tool # 讓它自己運行

1.2、有選擇地執行命令

關于上面的操作,不知你有沒有思考過一個問題,如果我們在讓它自動順序執行命令時,前面的命令執行不成功,而后面的命令又依賴與上一條命令的結果,那么就會造成花了時間,最終卻得到一個錯誤的結果,而且有時候直觀的看你還無法判斷結果是否正確。那么我們需要能夠有選擇性的來執行命令比如上一條命令執行成功才繼續下一條,或者不成功又該做出其它什么處理,比如我們使用which來查找是否安裝某個命令,如果找到就執行該命令,否則什么也不做(雖然這個操作沒有什么實際意義,但可幫你更好的理解一些概念):

$ which cowsay>/dev/null && cowsay -f head-in ohch~

你如果沒有安裝cowsay,你可以先執行一次上述命令,你會發現什么也沒發生,你再安裝好之后你再執行一次上述命令,你也會發現一些驚喜。

上面的&&就是用來實現選擇性執行的,它表示如果前面的命令執行結果(不是表示終端輸出的內容,而是表示命令執行狀態的結果)返回0則執行后面的,否則不執行(注意,Linux中命令執行狀態為成功時,返回0),你可以從$?環境變量獲取上一次命令的返回結果:

[pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ which cosway /usr/bin/which: no cosway in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/pierre_cai/.local/bin:/home/pierre_cai/bin) [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ echo $? 1 [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ which cat /usr/bin/cat [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ echo $? 0

學習過 C 語言的用戶應該知道在 C 語言里面&&表是邏輯與,而且還有一個||表示邏輯或,同樣 Shell 也有一個||,它們的區別就在于,shell中的這兩個符號除了也可用于表示邏輯與和或之外,就是可以實現這里的命令執行順序的簡單控制。||在這里就是與&&相反的控制效果,當上一條命令執行結果為≠0($?≠0)時則執行它后面的命令

$ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"

除了上述基本的使用之外,我們還可以結合這&&和||來實現一些操作,比如:

$ which cowsay>/dev/null && echo "exist" || echo "not exist"

我畫個流程圖來解釋一下上面的流程:

2、管道

管道是什么,管道是一種通信機制,通常用于進程間的通信(也可通過socket進行網絡通信),它表現出來的形式就是將前面每一個進程的輸出(stdout)直接作為下一個進程的輸入(stdin)

管道又分為匿名管道具名管道(這里將不會討論在源程序中使用系統調用創建并使用管道的情況,它與命令行的管道在內核中實際都是采用相同的機制)。

  • 我們在使用一些過濾程序時經常會用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的內容中我們已經多次使用到了。
  • 具名管道簡單的說就是有名字的管道,通常只會在源程序中用到具名管道。下面我們就將通過一些常用的可以使用管道的"過濾程序"來幫助你熟練管道的使用。

2.1、試用

先試用一下管道,比如查看/etc目錄下有哪些文件和目錄,使用ls命令來查看:

$ ls -al /etc

有太多內容,屏幕不能完全顯示,這時候可以使用滾動條或快捷鍵滾動窗口來查看。不過這時候可以使用管道:

$ ls -al /etc | less

通過管道將前一個命令(ls)的輸出作為下一個命令(less)的輸入,然后就可以一行一行地看。

2.2、cut命令,打印每一行的某一字段

打印/etc/passwd文件中以:為分隔符的第1個字段和第6個字段分別表示用戶名和其家目錄:

$ cut /etc/passwd -d ':' -f 1,6

比如:

[pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ cut /etc/passwd -d ':' -f 1,6 | tail -n 1 pierre_cai:/home/pierre_cai

打印/etc/passwd文件中每一行的前N個字符:

# 前五個(包含第五個) $ cut /etc/passwd -c -5 # 前五個之后的(包含第五個) $ cut /etc/passwd -c 5- # 第五個 $ cut /etc/passwd -c 5 # 2到5之間的(包含第五個) $ cut /etc/passwd -c 2-5

例如:

[pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ cut /etc/passwd -c -6 | tail -1 pierre

2.3、grep命令,在文本中或stdin中查找匹配字符串

grep命令是很強大的,也是相當常用的一個命令,它結合正則表達式可以實現很復雜卻很高效的匹配和查找,不過在學習正則表達式之前,這里介紹它簡單的使用,而關于正則表達式后面將會有單獨一小節介紹到時會再繼續學習grep命令和其他一些命令。

grep命令的一般形式為:

grep [命令選項]... 用于匹配的表達式 [文件]...

查找當前用戶根目錄下所有包含指定字符的文本文件,并顯示出現在文本中的行號::

[pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ grep -rnI "pierre" ~ /home/pierre_cai/.bash_history:21:ls /home/pierre_cai /home/pierre_cai/.bash_history:22:groups pierre_cai /home/pierre_cai/.bash_history:28:cat /etc/group | gre-E pierre_cai /home/pierre_cai/.bash_history:29:cat /etc/group | grep -E pierre_cai /home/pierre_cai/.bash_history:32:sudo cat /etc/group | grep -E pierre_cai /home/pierre_cai/.bash_history:34:sudo cat /etc/group | grep -E pierre_cai /home/pierre_cai/.bash_history:43:ls /home/pierre_cai /home/pierre_cai/.bash_history:46:ls /home/pierre_cai

-r?參數表示遞歸搜索子目錄中的文件,-n表示打印匹配項行號,-I表示忽略二進制文件。

當然也可以在grep命令中使用正則表達式。

2.4、wc命令,簡單小巧的計數工具

wc 命令用于統計并輸出一個文件中行、單詞和字節的數目,比如輸出/etc/passwd文件的統計信息:

$ wc /etc/passwd

分別只輸出行數、單詞數、字節數、字符數和輸入文本中最長一行的字節數:

# 行數 $ wc -l /etc/passwd # 單詞數 $ wc -w /etc/passwd # 字節數 $ wc -c /etc/passwd # 字符數 $ wc -m /etc/passwd # 最長行字節數 $ wc -L /etc/passwd

注意:

  • 對于西文字符來說,一個字符就是一個字節,但對于中文字符一個漢字是大于2個字節的,具體數目是由字符編碼決定的。
[pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ wc -l /etc/passwd 25 /etc/passwd [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ wc -w /etc/passwd 48 /etc/passwd [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ wc -c /etc/passwd 1201 /etc/passwd [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ wc -m /etc/passwd 1201 /etc/passwd [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ wc -L /etc/passwd 99 /etc/passwd

再來結合管道來操作一下,下面統計 /etc 下面所有目錄數

$ ls -dl /etc/*/ | wc -l [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ ls -dl /etc/*/ | wc -l 88

2.5、sort排序命令

這個命令前面我們也是用過多次,功能很簡單就是將輸入按照一定方式排序,然后再輸出,它支持的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定字段進行排序等等。

  • 默認為字典排序:
$ cat /etc/passswd | sort
  • 反轉排序:
$ cat /etc/passwd | sort -r
  • 按特定字段排序:
$ cat /etc/passwd | sort -t':' -k 3

上面的-t參數用于指定字段的分隔符,這里是以":"作為分隔符;-k 字段號用于指定對哪一個字段進行排序。這里/etc/passwd文件的第三個字段為數字,默認情況下是以字典序排序的,如果要按照數字排序就要加上-n參數,比如:

$ cat /etc/passwd | sort -t':' -k 3 -n

2.6、uniq去重命令

uniq命令可以用于過濾或者輸出重復行

  • 過濾重復行

我們可以使用history命令查看最近執行過的命令(實際為讀取${SHELL}_history文件,如我們環境中的~/.zsh_history文件),不過你可能只想查看使用了那個命令而不需要知道具體干了什么,那么你可能就會要想去掉命令后面的參數然后去掉重復的命令:

$ history | cut -c 8- | cut -d ' ' -f 1 | uniq

然后經過層層過濾,你會發現確是只輸出了執行的命令那一列,不過去重效果好像不明顯,仔細看你會發現它確實去重了,只是不那么明顯,之所以不明顯是因為uniq命令只能去連續重復的行,不是全文去重,所以要達到預期效果,我們先排序:

$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq # 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u [pierre_cai@izwz9gtdx1ch4f9gn56b32z ~]$ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq cat cd chmod cut echo exit export grep groupadd groups history ls ls;ls;ls; man passwd pwd rm su sudo touch useradd wc which who

這就是 Linux/UNIX 哲學吸引人的地方,大繁至簡,一個命令只干一件事卻能干到最好

  • 輸出重復行
# 輸出重復過的行(重復的只輸出一個)及重復次數 $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc # 輸出所有重復的行 $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D

?

轉載于:https://my.oschina.net/pierrecai/blog/1524492

總結

以上是生活随笔為你收集整理的Linux基础 -- 命令执行顺序控制与管道的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。