1. 程式人生 > 實用技巧 >grep/uniq/sort/wc/paste/head/cut/tee/shuf/wait/xargs/tr/split/find *nix命令串講

grep/uniq/sort/wc/paste/head/cut/tee/shuf/wait/xargs/tr/split/find *nix命令串講

本文維護更新中!

mutt

mutt是一個命令列裡發郵件的工具。

grep

本來想單獨寫一篇筆記總結grep,但是發現用的指令其實就那幾個,所以就放這裡串講了,可能常用的命令部分,我會把字型加粗展現

grep = global regular expression print,grep主要的功能是搜尋匹配,匹配到的過濾出來列印或者重定向

search input files for a search string, and print the lines that match it. Beginning at the first line in the file, grep copies a line into a buffer, compares it against the search string, and if the comparison passes, prints the line to the screen.
檔案 a_file如下所示

boot
book
booze
machine
boots
bungie
bark
aardvark
broken$tuff
robots
grep -n "boo" a_file

帶上-n引數可以輸出匹配的內容,同時還輸出行號

1:boot
2:book
3:booze
5:boots

帶上-v,如-vn的引數,則會把不符合匹配內容的都返回;
帶上 -c ,則不會列印匹配的內容,只會輸出匹配的內容的行數;
帶上-l,當grep接的是多個檔案,例如 grep -l "boo" * 時,會返回存在匹配字串的當前資料夾下的所有檔名
-i:忽視匹配模式的大小寫;
-x: 完全匹配
-An: 匹配成功並輸出後續的n行,如-A2,會輸出匹配行同時,輸出後面的兩行

uniq

Linux uniq 命令用於檢查及刪除文字檔案中重複出現的行列,一般與 sort 命令結合使用。

uniq 可檢查文字檔案中重複出現的行列。當重複的行並不相鄰時,uniq 命令是不起作用的,所以uniq前面經常可以接sort

 sort  testfile1 | uniq

uniq所謂的重複是連續出現的相同記錄,如果想對全域性去重,用sort -u。或者將內容sort一下,保證相同的記錄時連續出現,再去重即可。
uniq -c :去重並將每條記錄出現的次數計數,常用於wordcount
uniq -f 2,表示只關注第二列的去重,不關心第一列是否重複。 this allows the N fields to be skipped while comparing uniqueness of the lines. This option is helpful when the lines are numbered
當重複的行並不相鄰時,uniq 命令是不起作用的,即若檔案內容為以下時,uniq 命令不起作用:

$ cat testfile1      # 原有內容 
test 30  
Hello 95  
Linux 85 
test 30  
Hello 95  
Linux 85 
test 30  
Hello 95  
Linux 85 

這時我們就可以使用 sort:

$ sort  testfile1 | uniq
Hello 95  
Linux 85 
test 30

統計各行在檔案中出現的次數:

$ sort testfile1 | uniq -c
   3 Hello 95  
   3 Linux 85 
   3 test 30

sort

-b 忽略每行前面開始出的空格字元。
-c 檢查檔案是否已經按照順序排序。
-d 排序時,處理英文字母、數字及空格字元外,忽略其他的字元。
-f 排序時,將小寫字母視為大寫字母。
-i 排序時,除了040至176之間的ASCII字元外,忽略其他的字元。
-m 將幾個排序好的檔案進行合併。
-M 將前面3個字母依照月份的縮寫進行排序。
-n 依照數值的大小排序。
-u 意味著是唯一的(unique),輸出的結果是去完重了的。
-o<輸出檔案> 將排序後的結果存入指定的檔案。
-r 以相反的順序來排序。
-t<分隔字元> 指定排序時所用的欄位分隔字元。
+<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。

   -k, --key=KEYDEF
          sort via a key; KEYDEF gives location and type

sort by key 是最常用的,key的定義是自己取field,

wc

wc命令用於計算字數。利用wc指令我們可以計算檔案的Byte數、字數、或是列數,若不指定檔名稱、或是所給予的檔名為"-",則wc指令會從標準輸入裝置讀取資料。
-c或--bytes或--chars 只顯示Bytes數。
-l或--lines 只顯示行數。
-w或--words 只顯示字數。
--help 線上幫助。
--version 顯示版本資訊。

wc testfile testfile_1 testfile_2   #統計三個檔案的資訊 

paste

cat是按行合併,paste是按列合併
$ paste 1 2 3

-d<間隔字元>或--delimiters=<間隔字元>  用指定的間隔字元取代跳格字元。
-s或--serial  串列進行而非平行處理。
--help  線上幫助。
--version  顯示幫助資訊。
[檔案…] 指定操作的檔案路徑

head

head -10 a.txt > tmp
前10行輸出或重定向

cut

Linux cut命令用於提取顯示每行從開頭算起 num1 到 num2 的文字。
看這個就行,主要還是文字提取的命令 詳情 請看
https://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html

tee

將程式的輸出結果重定向,使得我們可以同時顯示和儲存結果,例如,新增一個新的條目到hosts檔案中:

echo "127.0.0.1 foobar" | sudo tee -a /etc/hosts

結合前一篇博文的重定向,說說這兩個的關係

2>&1 >output.log 

means first start sending all file handle 2 stuff (standard error) to file handle 1 (standard output) then send that to the file output.log. In other words, send standard error and standard output to the log file.

2>&1 | tee output.log 

is the same with the 2>&1 bit, it combines standard output and standard error on to the standard output stream. It then pipes that through the tee program which will send its standard input to its standard output (like cat) and also to the file. So it combines the two streams (error and output), then outputs that to the terminal and the file.

後者輸入進檔案的同時,也會輸出到console。前者則都被重定向到檔案,不會在console中展示。
如圖所示,tee其實是一種T字形的管道,他在輸出給標準stdout的同時,也會重定向給檔案流。

shuf

就是shuffle了。

seq 3 | shuf

將1、2、3按行亂序輸出。
也可以shuf一個檔案,如shuf file

wait

xargs

xargs(英文全拼: eXtended ARGuments)是給命令傳遞引數的一個過濾器,也是組合多個命令的一個工具。
可以看http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html xargs主要是和標準輸入輸出有關係。xargs命令的作用,是將標準輸入轉為命令列引數。

$ echo "hello world" |  echo
這個不會有任何輸出

$ echo "hello world" | xargs echo
hello world

上面的程式碼將管道左側的標準輸入,轉為命令列引數hello world,傳給第二個echo命令。xargs接Linux的命令作為引數,用該命令去處理標準輸出如輸出。真正執行的命令,緊跟在xargs後面,接受xargs傳來的引數。

xargs的作用在於,大多數命令(比如rm、mkdir、ls)與管道一起使用時,都需要xargs將標準輸入轉為命令列引數。xargs後面的命令預設是echo。

$ echo "one two three" | xargs mkdir  等同於 mkdir one two three

大多數時候,xargs命令都是跟管道一起使用的。但是,它也可以單獨使用。

輸入xargs按下回車以後,命令列就會等待使用者輸入,作為標準輸入。你可以輸入任意內容,然後按下Ctrl d,表示輸入結束,這時echo命令就會把前面的輸入打印出來。
預設情況下,xargs將換行符和空格作為分隔符,把標準輸入分解成一個個命令列引數。

$ echo "one two three" | xargs mkdir

上面程式碼中,mkdir會新建三個子目錄,因為xargs將one two three分解成三個命令列引數,執行mkdir one two three。

-d引數可以更改分隔符。

$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c

上面的命令指定製表符\t作為分隔符,所以a\tb\tc就轉換成了三個命令列引數。echo命令的-e引數表示解釋轉義字元,即轉義字元生效。

tr

主要用於壓縮重複字元,刪除檔案中的控制字元以及進行字元轉換操作。

echo "Hello World I Love You" |tr -t [a-z] [A-Z]  #小寫轉大寫
echo "Hello World I Love You" |tr -t [:lower:] [:upper:] #小寫轉大寫

-s 壓縮重複字元 replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character (就是去重的意思)

echo "aaabbbaacccfddd" | tr -s [abcdf] // abacfd

刪除檔案中的空白行

cat 檔名 |tr -s ‘\n'   cat b.txt | tr -s ["\n"]

-d :delete,刪除SET1中指定的所有字元,不轉換

xiaosi@Qunar:~/test$ echo "a12HJ13fdaADff" | tr -d "[a-z][A-Z]"
1213
xiaosi@Qunar:~/test$ echo "a1213fdasf" | tr -d [adfs]
1213

-t:truncate,將SET1中字元用SET2對應位置的字元進行替換,一般預設為-t

 echo "a1213fdasf" | tr -t [afd] [AFO] // A1213FOAsF
 echo "Hello World I Love You" |tr -t [a-z] [A-Z]

上述程式碼將a轉換為A,f轉換為F,d轉換為O。

\NNN 八進位制值的字元 NNN (1 to 3 為八進位制值的字元)
\\ 反斜槓
\a Ctrl-G 鈴聲
\b Ctrl-H 退格符
\f Ctrl-L 走行換頁
\n Ctrl-J 新行
\r Ctrl-M 回車
\t Ctrl-I tab鍵
\v Ctrl-X 水平製表符
CHAR1-CHAR2 從CHAR1 到 CHAR2的所有字元按照ASCII字元的順序
[CHAR*] in SET2, copies of CHAR until length of SET1
[CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0
[:alnum:] 所有的字母和數字
[:alpha:] 所有字母
[:blank:] 水平製表符,空白等
[:cntrl:] 所有控制字元
[:digit:] 所有的數字
[:graph:] 所有可列印字元,不包括空格
[:lower:] 所有的小寫字元
[:print:] 所有可列印字元,包括空格
[:punct:] 所有的標點字元
[:space:] 所有的橫向或縱向的空白
[:upper:] 所有大寫字母

split

#cat hello
Hello, World1
Hello, World2
Hello, World3
Hello, World4
Hello, World5

使用命令:

#split -2 hello split1_

split命令會將檔案以兩行為單位進行切割,每兩行組成一個新檔案,5行就有三個檔案,名稱會分別為:

split1_aa , split1_ab , split_ac

nl

nl命令其它和cat輸出檔案內容 命令很像,只不過它會打上行號。

統計你使用的最高頻命令的top10

history | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -10	

或者 tr '\n' '' < file | awk '{print $2}' | sort | uniq -c | sort -k1,1nr | head -10

find

find -name *.txt  #搜尋當前目錄下所有txt檔案
find -name *.txt  #搜尋當前目錄下所有txt檔案 
find的使用例項:

  $ find . -name 'my*'

搜尋當前目錄(含子目錄,以下同)中,所有檔名以my開頭的檔案。

  $ find . -name 'my*' -ls

搜尋當前目錄中,所有檔名以my開頭的檔案,並顯示它們的詳細資訊。

  $ find . -type f -mmin -10

搜尋當前目錄中,所有過去10分鐘中更新過的普通檔案。如果不加-type f引數,則搜尋普通檔案+特殊檔案+目錄。

  1. locate

locate命令其實是"find -name"的另一種寫法,但是要比後者快得多,原因在於它不搜尋具體目錄,而是搜尋一個數據庫(/var/lib/locatedb),這個資料庫中含有本地所有檔案資訊。Linux系統自動建立這個資料庫,並且每天自動更新一次,所以使用locate命令查不到最新變動過的檔案。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新資料庫。

locate命令的使用例項:

  $ locate /etc/sh

搜尋etc目錄下所有以sh開頭的檔案。

  $ locate ~/m

搜尋使用者主目錄下,所有以m開頭的檔案。

  $ locate -i ~/m

搜尋使用者主目錄下,所有以m開頭的檔案,並且忽略大小寫。-i ignore case

  1. whereis

whereis命令只能用於程式名的搜尋,而且只搜尋二進位制檔案(引數-b)、man說明檔案(引數-m)和原始碼檔案(引數-s)。如果省略引數,則返回所有資訊。

whereis命令的使用例項:

  $ whereis grep
  $ whereis python3

  1. which

which命令的作用是,在PATH變數指定的路徑中,搜尋某個系統命令的位置,並且返回第一個搜尋結果。也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。

which命令的使用例項:

  $ which grep

  1. type

type命令其實不能算查詢命令,它是用來區分某個命令到底是由shell自帶的,還是由shell外部的獨立二進位制檔案提供的。如果一個命令是外部命令,那麼使用-p引數,會顯示該命令的路徑,相當於which命令。

type命令的使用例項:

  $ type cd

系統會提示,cd是shell的自帶命令(build-in)。

  $ type grep

系統會提示,grep是一個外部命令,並顯示該命令的路徑。

  $ type -p grep

加上-p引數後,就相當於which命令。