shell 知識點補充(3)-修改語系/特殊字元/ printf/sed 工具/awk 工具/diff/cmp

來源:互聯網
上載者:User

1、修改語系的方法為:


[root@test root]# LANG=en              (根據情況指定為其它文法,如:C)

[root@test root]# export LANG

linux vi 刪除指定所有字元

按一下esc鍵退回命令狀態

輸入以下命令,如刪除檔案中每一行中第一個|符號

:%s/|            其它字元類同

2、重要特殊字元(characters)


RE 字元                                                                                                                                        意義與範例

                                                                                                                                  
^word
             待搜尋的字串(word)在行首!    範例:grep -n '^#' regular_express.txt 搜尋行首為 # 開始的那一行!
                                                                                                                                    

                                                                                                                                 
word$
             待搜尋的字串(word)在行尾!      範例:grep -n '!$' regular_express.txt 將行尾為 ! 的那一行列印出來!
                                                                                                                     

.  (點號)
              代表『任意一個』字元,一定是一個任一字元!         範例:grep -n 'e.e' regular_express.txt
              搜尋的字串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e 中間『一定』僅有一個字元,而空格符也是字元!
              跳脫字元,將特殊符號的特殊意義去除!

\
             範例:grep -n \' regular_express.txt 搜尋含有單引號 ' 的那一行!
             重複零個或多個的前一個 RE 字元

*
             範例:grep -n 'ess*' regular_express.txt 找出含有 (es) (ess) (esss) 等等的字串,注意,因為 * 可以是 0 個,所以 es 也是符合帶搜尋字串。另外,因為 * 為重複『前一個 RE 字元』的符號, 因此,在 * 之前必須要緊接著一個 RE 字元喔!例如任一字元則為『.*』!
連續 n 到 m 個的『前一個 RE 字元』若為 \{n\} 則是連續 n 個的前一個 RE 字元, 若是 \{n,\} 則是連續 n 個以上的前一個 RE 字元!

\{n,m\}
             範例:grep -n 'go\{2,3\}g' regular_express.txt 在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog)
             字元集合的 RE 特殊字元的符號

[]
             [list] 範例:grep -n 'g[ld]' regular_express.txt 搜尋含有 (gl) 或 (gd) 的那一行~ 需要特別留意的是,在 [] 當中『謹代表一個待搜尋的字元』, 例如: a[afl]y 代表搜尋的字串可以是 aay, afy, aly 亦即 [afl] 代表 a 或 f 或 l 的意思! [ch1-ch2] 範例:grep -n '[0-9]' regular_express.txt 搜尋含有任一數字的那一行!需特別留意,在字元集合 [] 中的減號
- 是有特殊意義的,他代表兩個字元之間的所有連續字元!但這個連續與否與 ASCII 編碼有關, 因此,您的編碼需要設定正確(在 bash 當中,需要確定 LANG 與 LANGUAGE 的變數是否正確!) 例如所有大寫字元則為 [A-Z] [^] 範例:grep -n 'oo[^t]' regular_express.txt 搜尋的字串可以是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 [] 內時, 代表的意義是『反向選擇』的意思~例如,我不要大寫字元,則為 [^A-Z] ~ 但是,需要特別注意的是,如果以
grep -n [^A-Z] regular_express.txt 來搜尋, 卻發現該檔案內的所有行都被列出,為什嗎?因為這個 [^A-Z] 是『非大寫字元』的意思, 因為每一行均有非大寫字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小寫字元, 以及雙引號 (") 等字元,所以當然符合 [^A-Z] 的搜尋!

特別留意的是,『正規標記法的特殊字元』與一般在指令列輸入指令的『萬用字元』並不相同, 例如,在萬用字元當中,* 代表的是 0 ~ 無限多個字元的意思,但是在正規標記法當中, * 則是重複 0 到多個的前一個 RE 字元的意思~使用的意義並不相同,不要搞混了!

延伸性:

+
                重複『一個或一個以上』的前一個 RE 字元;範例:egrep -n 'go+d' regular_express.txt 搜尋 (god) (good) (goood)... 等等的字串。那個 o+ 代表『一個以上的 o 』所以,上面的執行成果會將第 1, 9, 13 行列出來。
『零個或一個』的前一個 RE 字元
?
               『零個或一個』的前一個 RE 字元;範例:egrep -n 'go?d' regular_express.txt 搜尋 (gd) (god) 這兩個字串。那個 o? 代表『空的或 1 個 o 』所以,上面的執行成果會將第 13, 14 行列出來。有沒有發現到,這兩個案例( 'go+d' 與 'go?d' )的結果集合與 'go*d' 相同? 想想看,這是為什麼喔! ^_^

|
                 用或( or )的方式找出數個字串; 範例:egrep -n 'gd|good' regular_express.txt 搜尋 gd 或 good 這兩個字串,注意,是『或』! 所以,第 1,9,14 這三行都可以被列印出來喔!那如果還想要找出 dog 呢?就這樣啊: egrep -n 'gd|good|dog' regular_express.txt

( )
                 找出『群組』字串;   範例:egrep -n 'g(la|oo)d' regular_express.txt 搜尋 (glad) 或 (good) 這兩個字串,因為 g 與 d 是重複的,所以, 我
就可以將 la 與 oo 列於 ( ) 當中,並以 | 來分隔開來,就可以啦! 此外,這個功能還可以用來作為『多個重複群組』的判別喔!舉例來說: echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C' 上面的例子當中,意思是說,我要找開頭是 A 結尾是 C ,中間有一個以上的 "xyz" 字串的意思~

3、格式化列印: printf

[root@linux ~]# printf '列印格式' 實際內容
參數:
關于格式方面的幾個特殊樣式:
\a 警告聲音輸出
\b 退格鍵(backspace)
\f 清除螢幕 (form feed)
\n 輸出新的一行
\r 亦即 Enter 按鍵
\t 水平的 [tab] 按鍵
\v 垂直的 [tabl] 按鍵
\xNN NN 為兩位元的數字,可以轉換數字成為字元。
關於 C 程式語言內,常見的變數格式
%ns 那個 n 是數字, s 代表 string ,亦即多少個字元;
%ni 那個 n 是數字, i 代表 integer ,亦即多少整數字數;
%N.nf 那個 n 與 N 都是數字, f 代表 floating (浮點),如果有小數字數,
假設我共要十個位元,但小數點有兩位,即為 %10.2f 囉!
範例:
範例一:將剛剛上頭的資料變成檔案,僅列出姓名與成績:(用 [tab] 分隔
[root@linux ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' `cat printf.txt`
Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
# 假設我將上面的檔案存成 printf.txt 檔案檔名,則可利用上面的案例,
# 將每個單字中間以 [tab] 按鍵隔開。由上面的輸出來看,雖然第二行以後是 OK 的,
# 但是第一行則因為某些單字長度較長,所以就無法對齊了!而 %s 表示以字串 (string)
# 的方式來展現該內容。而每個內容則以 \t 即 [tab] 來隔開啊!
範例二:將上述資料關於第二行以後,分別以字串、整數、小數點來顯示:
[root@linux ~]# printf '%10s %5i %5i %5i %8.2f \n' `cat printf.txt |\
> grep -v Name`
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
# 這個時候的輸出可就有趣了!我將幾個內容分成不同的資料格式來輸出,
# 最有趣的應該是 %8.2f 這個項目了!我可以針對不同的小數字數來進行格式輸出,
# 例如變成底下的樣子時,您自己試看看,會是輸出什麼結果喔!
# printf '%10s %5i %5i %5i %8.1f \n' `cat printf.txt | grep -v Name`
範例三:列出數值 45 代表的字元為何?
[root@linux ~]# printf '\x45\n'
E

4、sed 工具簡介

sed 可以分析 Standard Input (STDIN) 的資料, 然後將資料經過處理後,再將他輸出到 standrad out (STDOUT) 的一個工具;

[root@linux ~]# sed [-nefr] [動作]
參數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN
的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過
sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在指令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的
sed 動作;
-r :sed 的動作支援的是延伸型正規標記法的文法。(預設是基礎正規標記法文法)
動作說明: [n1[,n2]]function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作
是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』
function 有底下這些咚咚:
a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配
正規標記法!例如 1,20s/old/new/g 就是啦!
範例:
範例一:將 /etc/passwd 的內容列出,並且我需要列印行號,同時,請將第 2~5 行刪除!
[root@linux ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(後面省略).....
# 看到了吧?因為 2-5 行給他刪除了,所以顯示的資料中,就沒有 2-5 行囉~
# 另外,注意一下,原本應該是要下達 sed -e 才對,沒有 -e 也行啦!
# 同時也要注意的是, sed 後面接的動作,請務必以 '' 兩個單引號括住喔!
# 而,如果只要刪除第 2 行,可以使用 nl /etc/passwd | sed '2d' 來達成,
# 至於第 3 到最後一行,則是 nl /etc/passwd | sed '3,$d' 的啦!
範例二:承上題,在第二行後(亦即是加在第三行)加上『drink tea?』字樣!
[root@linux ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 嘿嘿!在 a 後面加上的字串就已將出現在第二行後面囉!那如果是要在第二行前呢?
# nl /etc/passwd | sed '2i drink tea' 就對啦!
範例三:在第二行後面加入兩行字,例如『Drink tea or .....』『drink beer?』
[root@linux ~]# nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 這個範例的重點是,我們可以新增不只一行喔!可以新增好幾行~
# 但是每一行之間都必須要以反斜線 \ 來進行新行的增加喔!所以,上面的例子中,
# 我們可以發現在第一行的最後面就有 \ 存在啦!那是一定要的喔!
範例四:我想將第2-5行的內容取代成為『No 2-5 number』呢?
[root@linux ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
# 沒有了 2-5 行,嘿嘿嘿嘿!我們要的資料就出現啦!
範例五:僅列出第 5-7 行
[root@linux ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
# 為什麼要加 -n 的參數呢?您可以自行下達 sed '5,7p' 就知道了!(5-7行會重複輸出)
# 有沒有加上 -n 的參數時,輸出的資料可是差很多的喔!
範例六:我們可以使用 ifconfig 來列出 IP ,若僅要 eth0 的 IP 時?
[root@linux ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA
inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....
# 其實,我們要的只是那個 inet addr:..那一行而已,所以囉,利用 grep 與 sed 來捉
[root@linux ~]# ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | \
> sed 's/Bcast.*$//g'
# 您可以將每個管線 (|) 的過程都分開來執行,就會曉得原因囉!
# 去頭去尾之後,就會得到我們所需要的 IP 亦即是 192.168.1.12 囉~
範例七:將 /etc/man.config 檔案的內容中,有 MAN 的設定就取出來,但不要說明內容。
[root@linux ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | \
> sed '/^$/d'
# 每一行當中,若有 # 表示該行為批註,但是要注意的是,有時候,
# 批註並不是寫在第一個字元,亦即是寫在某個指令後方,如底下的模樣:
# 『shutdown -h now # 這個是關機的指令』,批註 # 就在指令的後方了。
# 因此,我們才會使用到將 #.*$ 這個正規標記法!

sed 去掉行首的數字:

sed 's/^[0-9]*//g'  filename

5、awk 工具簡介


awk 則比較傾向於一行當中分成數個『欄位』來處理;

[root@linux ~]# awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
awk 可以處理後續接的檔案,也可以讀取來自前個指令的 standard output 。但如前面說的, awk 主要是處理『每一行的欄位內的資料』,而預設的『欄位的分隔字元為 "空格鍵"
或 "[tab]鍵" 』!(如果是按其它字元截取,則需要預設變數,見後文)舉例來說,我們用last 可以將登入者的資料取出來, 結果如下所示:
[root@linux ~]# last
dmtsai pts/0 192.168.1.12 Mon Aug 22 09:40 still logged in
root tty1 Mon Aug 15 11:38 - 11:39 (00:01)
reboot system boot 2.6.11 Sun Aug 14 18:18 (7+15:41)
dmtsai pts/0 192.168.1.12 Fri Aug 12 12:07 - 12:08 (00:01)
若我想要取出帳號與登入者的 IP ,且帳號與 IP 之間以 [tab] 隔開,則會變成這樣:
[root@linux ~]# last | awk '{print $1 "\t" $3}'               大括弧兩邊的是單引號,不要和·優先執行搞混了;printf 也可以用,用了之後不會換行;
dmtsai 192.168.1.12
root Mon
reboot boot
dmtsai 192.168.1.12
因為不論哪一行我都要處理,因此,就不需要有 "條件類型" 的限制!我所想要的是第一欄以及第三欄, 但是,第二行及第三行的內容怪怪的~這是因為資料格式的問題啊!所以囉~使用 awk 的時候,請先確認一下您的資料當中,如果是連續性的資料,請不要有空格或 [tab] 在內,否則,就會像這個例子這樣,會發生誤判喔! 另外,由上面這個例子您也會知道,在每一行的每個欄位都是有變數名稱的,那就是 $1, $2... 等變數名稱,以上面的例子來說, dmtsai 是 $1
,因為他是第一欄嘛!至於 192.168.1.12 是第三欄,所以他就是 $3 啦!後面以此類推~呵呵!還有個變數喔!那就是 $0 ,$0 代表『一整列資料』的意思~ 以上面的例子來說,第一行的 $0 代表的就是『dmtsai pts/0.... 』那一行啊! 由此可知,剛剛上面四行當中,整個 awk 的處理流程是:
1. 讀入第一行,並將第一行的資料填入 $0, $1, $2.... 等變數當中;
2. 依據 "條件類型" 的限制,判斷是否需要進行後面的 "動作";
3. 做完所有的動作與條件類型;
4. 若還有後續的『行』的資料,則重複上面 1~3 的步驟,直到所有的資料都讀完為止。

awk 怎麼知道我到底這個資料有幾行?有幾欄呢?這就需要 awk 的內建變數的幫忙啦~
變數名稱              代表意義
NF                 每一行 ($0) 擁有的欄位總數    就是在句末統計有多少個$

NR                目前 awk 所處理的是『第幾行』資料,就是在句末加個行號
FS                 目前的分隔字元,預設是空格鍵    相當於輸出空格
我們繼續以上面例子來做說明,如果我想要列出每一行的帳號,並且列出目前處理的行數, 並且說明,該行有多少欄位,則可以這樣 (注意, awk 後續的所有動作以 ' 括住, 所以,內容如果想要以 print 列印時,記得,非變數的文字部分,包含上一小節printf 提到的格式中,都需要使用雙引號來定義出來喔!)
[root@linux ~]# last | awk '{print $1 "\t lines: " NR "\t columes: " NF}'
dmtsai lines: 1 columes:
10
root lines: 2 columes: 9
reboot lines: 3 columes: 9
dmtsai lines: 4 columes: 10
這樣可以瞭解 NR 與 NF 的差別

awk 的邏輯運算字元
既然有需要用到 "條件" 的類別,自然就需要一些邏輯運算囉~例如底下這些:
運算單元                 代表意義
>                                  大於
<                                 小於
>=                              大於或等於
<=                                小於或等於
==                                   等於
!=                                     不等於
值得注意的是那個 == 的符號,因為在『邏輯運算』上面, 就是所謂的大於、小於、等於等等的判斷式上面,我們習慣上是以== 來表示,而如果是直接給予一個值,例如變數設定時,就直接使用 = 而已。好了,我們實際來運用一下邏輯判斷吧!舉例來說,在 /etc/passwd 當中是以冒號 ":" 來作為欄位的分隔,那假設我要查閱,第三欄小於 10 以下的資料,並且僅列出帳號與第三欄, 那麼可以這樣做:
[root@linux ~]# cat /etc/passwd | \
> awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'                按指定字元截取
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
......(以下省略)......
有趣吧!不過,怎麼第一行沒有正確的顯示出來呢?這是因為我們讀入第一行的時候, 那些變數 $1, $2... 預設還是以空格鍵為分隔的,所以雖然我們定義了 FS=":" 了, 但是卻僅能在第二行後才開始生效。那麼怎麼辦呢?我們可以預先設定 awk 的變數啊! 利用 BEGIN 這個關鍵詞喔!這樣做:
[root@linux ~]# cat /etc/passwd | \
> awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
bin 1
daemon 2
......(以下省略)......
很有趣吧!而除了 BEGIN 之外,我們還有 END 呢!另外,如果要用 awk 來進行『計算功能』呢?以底下的例子來看, 假設我有一個薪資資料表,內容是這樣的:
Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 20000 23000
Bird2 43000 42000 41000
如何幫我計算每個人的總額呢?而且我還想要格式化輸出喔! 你可以將上面的資料儲存成一個名稱為pay.txt 的檔案,則:
[root@linux ~]# cat pay.txt | \
> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
Name 1st 2nd 3th Total
VBird 23000 24000 25000 72000.00
DMTsai 21000 20000 23000 64000.00
Bird2 43000 42000 41000 126000.00
上面的例子有幾個重要事項應該要先說明的:
• 所有的動作,亦即在 {} 內的動作,如果有需要多個指令輔助時,可利用分號『;』間隔, 或者直接以 [Enter] 按鍵來隔開每個指令,例如上面的 NR>=2 後面接的動作, 利用 total = ... 那個指令來指定加總,而後續則以 printf 來格式化輸出!
• 邏輯運算當中,如果是『等於』的情況,則務必使用兩個等號『==』!
• 格式化輸出時,在 printf 的格式設定當中,務必加上 \n ,才能進行分行!
• 與 bash shell 的變數不同,在 awk 當中,變數可以直接使用,不需加上 $ 符號。
利用 awk 這個玩意兒,就可以幫我們處理很多日常工作了呢!真是好用的很~ 此外, awk 的輸出格式
當中,常常會以printf 來輔助,所以, 最好您對 printf 也稍微熟悉一下比較好啦!另外, awk 的動作內{} 也是支援 if (條件) 的喔! 舉例來說,上面的指令可以修訂成為這樣:
[root@linux ~]# cat pay.txt | \
> awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

實練:

我們知道 /etc/passwd 裡面以 : 來分隔,第一欄為帳號名稱。請寫一隻程式,可以將 /etc/passwd 的第一欄取出,而且每一欄都以一行字串『The 1 account is "root" 』來顯示,那個 1 表示行數。

方法1:

#!/bin/bash

accounts=`cat /etc/passwd | cut -d':' -f1`

for account in $accounts

do

declare -i i=$i+1

echo "The $i account is \"$account\" "

done

方法2:

Loong:/home/yee/shell# cat passwd|awk 'BEGIN {FS=":"} {print "the " NR " account is " $1}'               
居然用awk一句話就實現了,呵呵

the 1 account is root
the 2 account is daemon
the 3 account is bin
the 4 account is sys
the 5 account is sync
the 6 account is games
the 7 account is man

.............

5、檔案比對

diff
diff 就是用在比對兩個檔案之間的差異的,一般是用在 ASCII 純文字檔案的比對上。我們先預先處理一下一個檔案好了。假設我要將 /etc/passwd 的內容,將第四行刪除, 第六行則取代成為『no six line』,新的檔案放置到 /tmp/test 裡面, 那麼應該怎麼做?
[root@linux ~]# mkdir -p /tmp/test
[root@linux ~]# cat /etc/passwd | \
> sed -e '4d' -e '6c no six line' > /tmp/test/passwd
# 注意一下, sed 後面如果要接超過兩個以上的動作時,每個動作前面得加 -e 才行!
接下來討論一下關於 diff 的用法吧!
[root@linux ~]# diff [-bBi] from-file to-file
參數:
from-file :一個檔名,作為原始比對檔案的檔名;
to-file :一個檔名,作為目的比對檔案的檔名;
注意,from-file 或 to-file 可以 - 取代,那個 - 代表『Standard input』之意。
-b :忽略一行當中,僅有多個空白的差異(例如 "about me" 與 "about me" 視為相同
-B :忽略空白行的差異。
-i :忽略大小寫不同。
範例:
範例一:比對 /tmp/test/passwd 與 /etc/passwd 的差異:
[root@linux ~]# diff /etc/passwd /tmp/test/passwd
4d3 <==這裡是說,左邊檔案(/etc/passwd)第四行被刪除 (d)
< adm:x:3:4:adm:/var/adm:/sbin/nologin
6c5 <==這裡是說,左邊檔案的第六行被取代成右邊檔案(/tmp/test/passwd)的第五行
< sync:x:5:0:sync:/sbin:/bin/sync
---
> no six line
# 很聰明吧!用 diff 就把我們剛剛的處理給比對完畢了!
用 diff 比對檔案真的是很簡單喔!另外, diff 也可以比對整個目錄下的差異

[root@linux ~]# diff /etc /tmp/test

還可以比對不同目錄下的相同檔案名稱的內容

cmp
相對於 diff 的廣泛用途, cmp 似乎就用的沒有這麼多了~ cmp 主要也是在比對兩個檔案,他主要利用『位』單位去比對,因此, 當然也可以比對 binary file 囉~(還是要再提醒喔, diff 主要是以『行』為單位比對, cmp 則是以『位』為單位去比對,這並不相同!)
[root@linux ~]# cmp [-s] file1 file2
參數:
-s :將所有的不同點的位處都列出來。因為 cmp 預設僅會輸出第一個發現的不同點。
範例:
範例一:用 cmp 比較一下 /etc/passwd 與 /tmp/test/passwd
[root@linux ~]# cmp /etc/passwd /tmp/test/passwd
/etc/passwd /tmp/test/passwd differ: byte 106, line 4
看到了嗎?第一個發現的不同點在第四行,而且位元是在第 106 個位處!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.