linux 管道、cut、grep、sort詳細用法
linux 管道、cut、grep、sort用法
linux 管道、cut、grep、sort用法
順序執行、選擇執行、管道、cut 命令、grep 命令、wc 命令、sort 命令等,高效率使用 Linux 的技巧。
順序執行命令
例如一次性執行軟體源更新、安裝軟體、執行軟體。可以這樣:
#一次性解決每次執行完命令等待問題
$ sudo apt-get update;sudo apt-get install some-tool;some-tool
但是上面的方法存在問題,如果第二天命令沒執行成功,而後面的命令又依賴前面的命令,這樣做將會得到錯誤的結果。這時候就需要which
配合&&
和||
來操作了。
例如一下操作:
$ which cowsay>/dev/null && cowsay -f head-in ohch~
以上/dev/null
等同於0
其中:
which
:查詢是否安裝了這個命令&&
:前面的命令返回值為0則執行後面的||
若沒有安裝cowsay則不會有任何反應,這時候可以用echo $?
來返回上一次命令的返回值。當沒有安裝cowsay時,以上命令返回值將會是1,那麼&&
以後的命令將不會執行。若安裝了cowsay,則會返回0,&&
後面的命令將會執行。
如下命令:
$ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"
在沒有安裝cowsay時將會返回which cowsay
dev/null
則||
以前命令為真,後面的指令得以執行,將會在終端打印出cowsay has not been install, please run 'sudo apt-get install cowsay' to install
如圖:管道
管道是一種通訊機制,通常用於程序間的通訊(也可通過socket進行網路通訊),它表現出來的形式就是將前面每一個程序的輸出(stdout)直接作為下一個程序的輸入(stdin)。
管道又分為匿名管道和具名管道(這裡將不會討論在源程式中使用系統呼叫建立並使用管道的情況,它與命令列的管道在核心中實際都是採用相同的機制)。我們在使用一些過濾程式時經常會用到的就是匿名管道,在命令列中由|
分隔符表示。具名管道簡單的說就是有名字的管道,通常只會在源程式中用到具名管道。
例如,使用ls
來檢視/etc
中的檔案和目錄:
$ ls -al /etc
將會發現命令列顯示不完
通過管道將前一個命令ls
的輸出作為下一個命令less
的輸入,然後就可以一行一行地看。按enter換頁。
$ ls -al /etc | less
cut列印每一行的某一欄位
列印/etc/passwd
檔案中以:為分隔符的第1個欄位和第6個欄位分別表示使用者名稱和其家目錄:
$ cut /etc/passwd -d ':' -f 1,6
列印/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
grep 命令,在文字中或 stdin 中查詢匹配字串
grep命令是很強大的,也是相當常用的一個命令,它結合正則表示式可以實現很複雜卻很高效的匹配和查詢。
搜尋/home/shiyanlou目錄下所有包含shiyanlou
的文字檔案,並顯示出現在文字中的行號:
#grep [命令選項]... 用於匹配的表示式 [檔案]...
$ grep -rnI "shiyanlou" ~
其中,-r
引數表示遞迴搜尋子目錄中的檔案,-n
表示列印匹配項行號,-I
表示忽略二進位制檔案。這個操作實際沒有多大意義,但可以感受到grep
命令的強大與實用。
也可以在匹配欄位中使用正則表示式:
# 檢視環境變數中以"yanlou"結尾的字串
$ export | grep ".*yanlou$"
$
表示一行的末尾。
sort 排序命令
將輸入按照一定方式排序,然後再輸出,它支援的排序有按字典排序,數字排序,按月份排序,隨機排序,反轉排序,指定特定欄位進行排序等等。
預設為字典排序:
$ cat /etc/passwd | 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