wc wc命令用於報告文本文件的一些統計計數,例如行數、單詞數、位元組數等。 語法如下。 --files0-from=F:這個選項幾乎沒見過有人使用,我也看不懂,因此就忽略掉了。 預設情況下顯示3個計數,從左往右分別是行數、單詞數和位元組數。 如果被統計的文件數大於1,那麼還會顯示一行總計。 可以通過選 ...
wc
wc命令用於報告文本文件的一些統計計數,例如行數、單詞數、位元組數等。
語法如下。
wc [OPTION]... [FILE]... wc [OPTION]... --files0-from=F
--files0-from=F:這個選項幾乎沒見過有人使用,我也看不懂,因此就忽略掉了。
預設情況下顯示3個計數,從左往右分別是行數、單詞數和位元組數。
[root@C7 ~]# wc /etc/passwd 51 94 2599 /etc/passwd
如果被統計的文件數大於1,那麼還會顯示一行總計。
[root@C7 ~]# wc /etc/passwd /etc/init.d/functions 51 94 2599 /etc/passwd 707 2364 18104 /etc/init.d/functions 758 2458 20703 total
可以通過選項控制,單獨顯示這3個計數。
-l, --lines:顯示行數。
[root@C7 ~]# wc -l /etc/passwd 51 /etc/passwd
-w, --words:顯示單詞數。
[root@C7 ~]# wc -w /etc/passwd 94 /etc/passwd
-c, --bytes:顯示位元組數。
[root@C7 ~]# wc -c /etc/passwd 2599 /etc/passwd
還可以顯示一些另外的計數。
-m, --chars:顯示字元數。
[root@C7 ~]# wc -m /etc/passwd 2599 /etc/passwd
-L, --max-line-length:顯示文件中最長的行的長度。
[root@C7 ~]# wc -L /etc/passwd 99 /etc/passwd
cut
從一個文本文件中,截取我們所需要的部分進行顯示,一般是用於有固定的分隔符的文本文件,例如/etc/passwd這種以“:”作為分隔符的文件。
cut的預設分隔符是TAB。
語法如下。
cut OPTION... [FILE]...
我們創建一個測試文件cut.txt,第一行以TAB分隔,第二行以一個空格分隔,第三行分別以一個空格、兩個空格和三個空格分隔。
[root@C7 ~]# cat -A cut.txt a^Ilong^Idi^Idi$ a long di di$ a long di di$
在“cat -A”的輸出中,“^I”表示TAB,“$”表示換行符。
-f, --fields=LIST:指定要截取每一行中第幾個欄位的數據。
這裡的LIST,可以是單獨的某個欄位,也可以是連續的欄位範圍,也可以是離散的欄位,如下所示。
# cut -f 2 FILE # cut -f 2,3,4 FILE # cut -f 2-5 FILE # cut -f 1,2-3,5 FILE # cut -f 2- FILE:從第2個欄位到行尾。 # cut -f -2 FILE:從行首到第2個欄位。
LIST也可用於後面的-b和-c選項。
然後我們嘗試對cut.txt取第二個欄位。
[root@C7 ~]# cut -f 2 cut.txt long a long di di a long di di
我們發現,第一行以TAB為分隔符的行取出的欄位是正確的,另外2個欄位是整行都取出來了。
這是因為預設情況下不包含分隔符的行會被整行列印,如果想避免這種情況可以使用-s選項。
-s, --only-delimited:只列印那些包含分隔符的行。
[root@C7 ~]# cut -sf 2 cut.txt long
這裡有一點需要註意,使用短選項的時候,-f後面必須跟著數字,如果跟其他選項就會報錯。
[root@C7 ~]# cut -fs 2 cut.txt cut: invalid byte, character or field list
-d, --delimiter=DELIM:指定分隔符,而不使用預設的TAB,這個選項很有用,許多文件的預設分隔符都不是TAB。
[root@C7 ~]# head -n 3 /etc/passwd | cut -d : -f 7 /bin/bash /sbin/nologin /sbin/nologin
-b, --bytes=LIST:只取多少個位元組數的數據。
-c, --characters=LIST:只取多少個字元數的數據。
當取的數據是數字和字母的時候,這兩個選項的結果一般是相同的。
[root@C7 ~]# echo "alongdidi" | cut -b 1-4 alon [root@C7 ~]# echo "alongdidi" | cut -c 1-4 alon
--output-delimiter=STRING:設置輸出時候的分隔符,預設是採用和輸入文件相同的分隔符。
[root@C7 ~]# grep -E "^(root|zwl)" /etc/passwd | cut -d : -f 1,7 root:/bin/bash zwl:/bin/bash [root@C7 ~]# grep -E "^(root|zwl)" /etc/passwd | cut -d : -f 1,7 --output-delimiter "'s shell =" root's shell =/bin/bash zwl's shell =/bin/bash
sort
sort用於將文件排序後顯示。
語法如下。
sort [OPTION]... [FILE]... sort [OPTION]... --files0-from=F
sort的排序可以針對多個文件,一起排序後顯示。
[root@C7 ~]# cat sort1.txt aaa ccc bbb [root@C7 ~]# cat sort2.txt eee fff ddd [root@C7 ~]# sort sort1.txt aaa bbb ccc [root@C7 ~]# sort sort1.txt sort2.txt aaa bbb ccc ddd eee fff
sort的預設排序方式,是先比較第一個字元,如果一樣,則再比較第二個字元。以此類推。
數字的排序方式是0~9,字母的排序方式是a~z。
如果字母相同只是大小寫不同的話,那麼小寫排在大寫的前面,例如a排在A的前面。
[root@C7 ~]# cat sort.txt aaa DDD fff AAA bbb BBB eee CCC 999 876 333 [root@C7 ~]# sort sort.txt 333 876 999 aaa AAA bbb BBB CCC DDD eee fff
-r, --reverse:sort預設是有小到大排序,該選項則用於反向排序。
[root@C7 ~]# sort sort.txt 111 222 555 888 [root@C7 ~]# sort -r sort.txt 888 555 222 111
-n, --numeric-sort:基於數值排序。由於sort預設的排序機制導致sort沒辦法將數字按照數值大小準確排序,需要加上該選項方可實現。
[root@C7 ~]# sort sort.txt 1790 180 19 [root@C7 ~]# sort -n sort.txt 19 180 1790
-t, --field-separator=SEP:指定欄位分隔符。
-k, --key=KEYDEF:指定排序依據的欄位。
二者結合可以使得sort在排序某個文件的時候根據每行固定的欄位來排序。例如根據UID排序/etc/passwd。
[root@C7 ~]# head -n 5 /etc/passwd | sort -t : -k 3 -n root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-f, --ignore-case:忽略大小寫排序,原理是sort內部會將小寫字母轉換成大寫字母來排序。
-u, --unique:使得重覆的行只出現一次,結合-f選項的話,只會保留一種大寫/小寫的情況。
[root@C7 ~]# sort sort.txt aaa aaa AAA bbb bbb BBB ddd jjj ooo [root@C7 ~]# sort -uf sort.txt aaa BBB ddd jjj ooo
uniq
uniq用於報告或者忽略掉重覆的行。但是只會將相鄰的重覆行移除掉,而不是將整個文本中重覆的行移除掉。
[root@C7 ~]# cut -d : -f 7 /etc/passwd /bin/bash /sbin/nologin -- 多個重覆 -- /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt /sbin/nologin -- 多個重覆 -- /sbin/nologin /bin/bash -- 多個重覆 -- /bin/bash /sbin/nologin [root@C7 ~]# cut -d : -f 7 /etc/passwd | uniq /bin/bash /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt /sbin/nologin /bin/bash /sbin/nologin
這可能不是我們所要的結果,一般我們會先使用sort排序一下,再使用uniq移除相鄰的重覆行。這樣子就可以實現刪除文本中重覆的行的功能。
[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq /bin/bash /bin/sync /sbin/halt /sbin/nologin /sbin/shutdown
-c, --count:uniq區別於“sort -u”的主要一點在於它還可以統計重覆的行所出現的次數。
[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq -c 9 /bin/bash 1 /bin/sync 1 /sbin/halt 39 /sbin/nologin 1 /sbin/shutdown
-d, --repeated:只顯示有重覆的行。
[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq -cd 9 /bin/bash 39 /sbin/nologin
-u, --unique:也可以只列印不重覆的行。
[root@C7 ~]# cut -d : -f 7 /etc/passwd | sort | uniq -u /bin/sync /sbin/halt /sbin/shutdown
diff和patch
diff用於對比兩個文本文件的區別,對比的結果本質上是一個補丁文件,可以讓patch用來對文件打補丁。
首先我們先看兩個文本文件的內容。
[root@C7 ~]# cat -n old_file.txt 1 today 2 is 3 thursday 4 !!! [root@C7 ~]# cat -n new_file.txt 1 today 2 is 3 not 4 thursday 5 !?!?
接下來看diff的預設比對結果。
[root@C7 ~]# diff old_file.txt new_file.txt 2a3 > not 4c5 < !!! --- > !?!?
這個結果其實就是描述了被對比的兩個文件之間的區別,只不過這個描述我們人類比較難以理解,將這個描述重定向至文本文件,那麼該文件就成為一個補丁文件了。
[root@C7 ~]# diff old_file.txt new_file.txt > patch.txt
當我們擁有old_file.txt和補丁文件patch.txt的時候,我們就可以通過patch命令打補丁將old_file.txt變成(“升級”)new_file.txt。
[root@C7 ~]# patch -i patch.txt old_file.txt patching file old_file.txt [root@C7 ~]# cat old_file.txt today is not thursday !?!?
如果想使得old_file.txt變回打補丁前的樣子,可以在使用patch命令的時候,加上-R選項,打反向補丁。
[root@C7 ~]# patch -Ri patch.txt old_file.txt patching file old_file.txt [root@C7 ~]# cat old_file.txt today is thursday !!!