1. 程式人生 > >linux 管道、cut、grep、sort詳細用法

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

將會返回1,大於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

Alt
列印/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