cat命令
很多時(shí)候我們通過(guò)cat
命令來(lái)查看文件內(nèi)容,它會(huì)將文件的所有內(nèi)容顯示出來(lái)。當(dāng)然,cat
也可以通過(guò)管道接收數(shù)據(jù)褐耳,它主要完成的是將從管道接收的輸入導(dǎo)到輸出。
more跟less命令
有時(shí)候用cat
命令來(lái)顯示一個(gè)較大的文件并不方便渴庆,整個(gè)文件內(nèi)容一次性顯示出來(lái)簡(jiǎn)直就是刷屏了铃芦。如果需要一頁(yè)頁(yè)的顯示內(nèi)容,可以使用more
或者less
命令襟雷,這兩個(gè)命令會(huì)以分頁(yè)的形式顯示文件內(nèi)容杨帽,至于使用哪個(gè)命令完全看個(gè)人習(xí)慣了。此外嗤军,這兩個(gè)命令不僅可以分頁(yè)顯示,而且在分頁(yè)模式下晃危,你可以用快捷鍵方便的瀏覽及搜索:
* 按`d`下翻頁(yè)
* 按空格下翻頁(yè)
* 按回車(chē)下移一行
* 按`/`進(jìn)入搜索模式叙赚,輸入要搜索的關(guān)鍵字,按回車(chē)搜索僚饭。
* 按`n`搜索下一個(gè)
* 按`q`退出查看
tee命令
tee
命令一般從管道接收數(shù)據(jù)震叮,這點(diǎn)與cat
類(lèi)似,將stdin導(dǎo)到stdout鳍鸵。不同的是苇瓣,tee
同時(shí)還可以指定一個(gè)文件作為輸出。這點(diǎn)非常有用偿乖,有時(shí)候我們想一般看到命令的輸出击罪,同時(shí)又希望將輸出保存到文件中哲嘲,這時(shí)候用tee
最為合適。
# date | tee time.log
Mon Nov 20 14:05:02 EST 2017
# cat time.log
Mon Nov 20 14:05:02 EST 2017
date命令
date
命令用來(lái)顯示時(shí)間跟時(shí)區(qū)媳禁,比較常見(jiàn)的用法有:
-
默認(rèn)顯示
# date Sun Nov 19 20:08:21 EST 2017 # date -u Mon Nov 20 01:08:28 UTC 2017
其中眠副,
-u
參數(shù)表示顯示UTC標(biāo)準(zhǔn)時(shí)間,即時(shí)區(qū)為0的時(shí)間竣稽。 -
指定顯示格式
除了默認(rèn)輸出囱怕,我們也可以指定顯示的格式:
# date +'%A %d-%m-%Y UTC %:z' Sunday 19-11-2017 UTC -05:00
date
支持非常多元化的格式,具體可以參考這里毫别。 -
顯示當(dāng)前時(shí)間的秒數(shù)
通常娃弓,在計(jì)算當(dāng)前時(shí)間的秒數(shù)的時(shí)候,我們通常會(huì)以Unix Epoch Time為基準(zhǔn)岛宦,用
date
命令可以非常方便的顯示當(dāng)前時(shí)間的秒數(shù):# date +%s 1511141040 # date +%s --date='2017/11/19 09:56:00' 1511103360
其中台丛,也可以通過(guò)參數(shù)
--date
指定時(shí)間來(lái)計(jì)算。反過(guò)來(lái)恋博,如果我們知道了時(shí)間的秒數(shù)齐佳,需要顯示其相對(duì)于Unix Epoch Time的時(shí)間,可以這么做:# date; date +%s Mon Nov 20 10:33:07 EST 2017 1511191987 # date --date=@1511191987 Mon Nov 20 10:33:07 EST 2017
-
時(shí)間偏移計(jì)算
有時(shí)候需要知道多少天前是什么時(shí)間债沮,這時(shí)候需要用到時(shí)間偏移計(jì)算了:
# date --date='100 seconds ago' Sun Nov 19 20:35:44 EST 2017 # date --date='100 hours ago' Wed Nov 15 16:37:28 EST 2017 # date --date='100 days ago' Fri Aug 11 21:37:34 EDT 2017
date
命令可以識(shí)別多種時(shí)間偏移寫(xiě)法炼吴,除了示例中的,還有minutes months years
等疫衩,當(dāng)然硅蹦,也可以這樣寫(xiě):# date --date='+ 1000 seconds' Sun Nov 19 20:56:28 EST 2017 # date --date='- 1000 seconds' Sun Nov 19 20:23:41 EST 2017 # date --date='2017-11-19 00:00:00 + 1000 seconds' Sat Nov 18 09:00:01 EST 2017
直接用
+
或者-
表示以后或者以前的時(shí)間,也可以指定某個(gè)時(shí)間點(diǎn)然后偏移闷煤。 -
設(shè)置時(shí)間
當(dāng)然童芹,你也可以通過(guò)
date
命令來(lái)設(shè)置時(shí)間:# date Sun Nov 19 20:44:11 EST 2017 # date --set='Sun Nov 19 20:44:30 EST 2017' Sun Nov 19 20:44:30 EST 2017 # date Sun Nov 19 20:44:31 EST 2017
其中
--set
也可以簡(jiǎn)寫(xiě)為-s
,時(shí)間格式非常靈活:# date -s '2017/11/20 10:19:50' Mon Nov 20 10:19:50 EST 2017
cal命令
我們用date
可以顯示時(shí)間鲤拿,同時(shí)咱們還可以通過(guò)cal
命令來(lái)顯示日歷:
# cal
November 2017
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
當(dāng)然假褪,你也可以指定要顯示的日期,比如1949年10月的日歷:
# cal 10 1949
October 1949
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
time命令
有時(shí)候我們需要知道一個(gè)命令運(yùn)行了多少時(shí)間近顷,這時(shí)候我們可以用time
命令來(lái)計(jì)時(shí):
# time sleep 1
real 0m1.018s
user 0m0.001s
sys 0m0.002s
其中sleep 1
用來(lái)睡眠1秒生音,real
表示實(shí)際用了多少時(shí)間,user
表示在用戶(hù)態(tài)花了多少時(shí)間窒升,sys
則表示在內(nèi)核花了多少時(shí)間缀遍。詳細(xì)可以參考這篇問(wèn)答。
wc命令
wc
命令是Word Count
的簡(jiǎn)稱(chēng)饱须,顧名思義就是用來(lái)統(tǒng)計(jì)單詞的域醇。
# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | wc -w
14
參數(shù)-w
表示統(tǒng)計(jì)單詞數(shù),這里的單詞實(shí)際上指的是被空格分開(kāi)的字符串。下面列舉出wc
命令的有關(guān)參數(shù):
參數(shù) | 說(shuō)明 |
---|---|
-w | 統(tǒng)計(jì)多少單詞 |
-l | 統(tǒng)計(jì)多少行 |
-c | 統(tǒng)計(jì)有多少個(gè)字節(jié) |
-m | 統(tǒng)計(jì)有多少個(gè)字符 |
-L | 統(tǒng)計(jì)長(zhǎng)度最長(zhǎng)的行的長(zhǎng)度 |
注意譬挚,這里的字節(jié)跟字符的差別锅铅,在英文中基本上是一樣的,但是在多字節(jié)語(yǔ)言中殴瘦,其意義就不一樣了:
# echo '你好' | wc -c
7
# echo '你好' | wc -m
3
find命令
find
命令用來(lái)查找文件或目錄狠角,這又是一個(gè)非常強(qiáng)大的且常用的命令,這里只介紹幾種常見(jiàn)的用法:
-
根據(jù)文件名查找
這是基本且常見(jiàn)的用法:
# find . -name "test*" ./test.log ./test2
示例中表示在當(dāng)前目錄(用
.
表示)下包括其子目錄蚪腋,查找文件名以test
開(kāi)頭的文件丰歌。默認(rèn)情況下,find
命令是大小寫(xiě)敏感的屉凯,如果需要忽略大小寫(xiě)立帖,則可以改用參數(shù)-iname
。 -
根據(jù)類(lèi)型查找
可以根據(jù)類(lèi)型查找文件:
# find . -type f ./Test1 ./test.log ./test2
當(dāng)然悠砚,也可以同時(shí)根據(jù)類(lèi)型跟文件名一起查找:
# find . -type f -name "test*" ./test.log ./test2
f
表示文件晓勇,如果是查找目錄的話(huà)則用d
。 -
根據(jù)時(shí)間查找
find
命令還可以根據(jù)時(shí)間來(lái)查找文件目錄灌旧,其中一個(gè)用法如下:find . -newer base_file
表示在當(dāng)前目錄下查找比
base_file
文件更新的文件或者目錄绑咱。此外,find
還可以根據(jù)文件的atime, ctime, mtime來(lái)查找文件枢泰,如下描融,根據(jù)修改時(shí)間來(lái)查找:# date Fri Nov 17 20:34:52 EST 2017 # ll total 20 drwxr-xr-x. 2 root root 45 Nov 17 02:46 ./ dr-xr-x---. 48 root root 8192 Nov 17 02:46 ../ -rw-r--r--. 1 root root 0 Nov 16 00:17 Test1 -rw-r--r--. 1 root root 34 Nov 17 02:46 test2 -rw-r--r--. 1 root root 102 Nov 17 00:30 test.log # find . -mtime -1 . ./test.log ./test2
其中
-mtime
表示根據(jù)修改時(shí)間查找,-1
表示最近一天衡蚂。find
支持的時(shí)間查找總結(jié)如下:
參數(shù) | 說(shuō)明 |
---|---|
-mtime | 根據(jù)修改時(shí)間窿克,也就是ls -l 顯示的時(shí)間 |
-atime | 根據(jù)訪問(wèn)時(shí)間,也就是ls -lu 顯示的時(shí)間 |
-ctime | 根據(jù)狀態(tài)改變的時(shí)間毛甲,也就是ls -lc 顯示的時(shí)間 |
時(shí)間值的表示說(shuō)明:基準(zhǔn)+0
表示一天前年叮,-1.5
表示最近1.5天,+1.5
表示2.5天前
-
邏輯查找
find
支持與或非邏輯的查找玻募,比如查找所有C++的源文件只损,實(shí)際上需要找出后綴為.cpp
跟.h
的文件,需要用到find
的邏輯或的查找:find . -name "*.cpp" -o -name "*.h"
其中
-o
是-or
的縮寫(xiě)七咧,用來(lái)表示邏輯或的關(guān)系改执,而-name "*.cpp"
與-name "*.h"
為表達(dá)式,構(gòu)成了EXP1 or EXP2
的關(guān)系坑雅,只要文件或者目錄滿(mǎn)足其中一個(gè)表達(dá)式就會(huì)輸出。find
支持的邏輯關(guān)系如下:
邏輯 | 參數(shù) | 說(shuō)明 |
---|---|---|
與 | -a |
-and 的縮寫(xiě)衬横,邏輯與的關(guān)系裹粤,如find . -type f -a -name "*.log"
|
或 | -o |
-or 的縮寫(xiě),邏輯或的關(guān)系, 如find . -name "*.cpp" -o -name "*.h"
|
非 | ! |
-not 的縮寫(xiě),邏輯非的關(guān)系, 如find . ! -name "*.cpp"
|
此外遥诉,find
命令還有一個(gè)非常重要且常見(jiàn)的用法拇泣,就是在找到文件后執(zhí)行某個(gè)命令,改用法如下:
find . -name "*.log" -exec rm {} \;
表示刪除當(dāng)前目錄包括子目錄中以.log
為后綴的所有文件矮锈。其中霉翔,-exec
表示在找到后需要執(zhí)行命令,而命令為rm {} \;
苞笨,實(shí)際上此命令就是一般的shell
命令债朵,其中{}
用來(lái)指代找到的文件或目錄,這里;
必須轉(zhuǎn)義瀑凝,因?yàn)樾枰獋鬟f給find
本身序芦,如果不轉(zhuǎn)義,則會(huì)直接被shell
解析使用了粤咪。每找到一個(gè)文件或目錄谚中,都會(huì)執(zhí)行指定的命令,其中{}
部分以文件路徑替代寥枝。如果需要只執(zhí)行一次命令宪塔,而把所有找到的文件作為參數(shù)傳遞給該命令,則需要用+
替代\;
囊拜,如:
find . -name "*.log" -exec rm {} +
假定找到的文件有test.log
某筐,test1.log
,用\;
的方式相當(dāng)于執(zhí)行兩次:rm test.log
跟rm test1.log
艾疟;如果使用+
則只有一次命令rm test.log test1.log
来吩。
sort命令
顧名思義,這個(gè)命令就是用來(lái)排序的蔽莱。
# head -n 5 /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
默認(rèn)情況下弟疆,sort
命令以字典順序?qū)γ啃羞M(jìn)行排序,如果不帶參數(shù)盗冷,會(huì)將整行作為一個(gè)字符串進(jìn)行比較怠苔。當(dāng)然,你也可以指定以第幾列進(jìn)行排序:
# head -n 5 /etc/passwd | tr : " " | sort -k 3
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
這里先將:
換成空格(關(guān)于tr
命令仪糖,請(qǐng)參照本文關(guān)于tr
命令的章節(jié))柑司,然后以-k
為參數(shù),指定以第三列進(jìn)行排序锅劝。下面列舉其常用的一些參數(shù):
參數(shù) | 說(shuō)明 |
---|---|
-k | 以第幾列排序攒驰,列以空格為分隔 |
-r | 默認(rèn)sort 以升序輸出,-r 參數(shù)則可以以降序輸出 |
-n | 在指定第幾列的時(shí)候故爵,可以強(qiáng)制sort 把列的值以數(shù)字值進(jìn)行排序玻粪,如下面的例子 |
-t | 默認(rèn)情況下認(rèn)為列是以空格為分隔,-t 參數(shù)則可以指定分隔符,這樣劲室,上面的例子其實(shí)可以直接寫(xiě)成sort -t : -k 3
|
-f | 忽略大小寫(xiě) |
-u | 如果排序后出現(xiàn)重復(fù)的行伦仍,加上這個(gè)參數(shù)將只顯示一行 |
# cat test2
10
3
5
3
# cat test2 | sort
10
3
3
5
# cat test2 | sort -n
3
3
5
10
# cat test2 | sort -n -u
3
5
10
uniq命令
uniq
是unique
的簡(jiǎn)寫(xiě),用來(lái)消除sort
排序后重復(fù)的行很洋,即相當(dāng)于sort
命令中的-u
參數(shù)充蓝。但是,uniq
不僅可以消除重復(fù)行喉磁,它還可以顯示分別重復(fù)了多少行:
# cat test2 | sort -n | uniq -c
2 3
1 5
1 10
還有些常用的參數(shù)如下:
參數(shù) | 說(shuō)明 |
---|---|
-i | 忽略大小寫(xiě) |
-d | 只打印有重復(fù)的行谓苟,每組一個(gè),如果要打印組內(nèi)所有的线定,則用-D
|
-u | 只打印沒(méi)有重復(fù)的行 |
-f | 比較的時(shí)候娜谊,忽略前面的N列 |
-s | 比較的時(shí)候,忽略前面的N個(gè)字符 |
od命令
od
可以用來(lái)顯示二進(jìn)制文件:
# cat test2
abcdefg
1234567
# od -t x1 test2
0000000 61 62 63 64 65 66 67 0a 31 32 33 34 35 36 37 0a
0000020
當(dāng)然斤讥,也可以直接顯示字符:
# od -c test2
0000000 a b c d e f g \n 1 2 3 4 5 6 7 \n
0000020
當(dāng)然纱皆,如果僅僅只是顯示二進(jìn)制內(nèi)容,還可以使用hexdump
命令了芭商。
壓縮類(lèi)命令
tar命令
在Linux中派草,用的最多的壓縮命令就是tar
命令了,在介紹其用法之前铛楣,需要清楚幾個(gè)概念:
-
存檔文件(Archive File)
存檔文件用來(lái)打包多個(gè)文件成一個(gè)文件近迁,以方便在網(wǎng)絡(luò)上傳輸。請(qǐng)注意簸州,打包成的文件并沒(méi)有被壓縮鉴竭。在Linux或Unix系統(tǒng)中,TAR文件是最為常用的存檔文件(通常以
.tar
為文件后綴)岸浑。TAR文件的更多解釋可以參考這里搏存。用tar
命令可以生產(chǎn)TAR文件,示例如下:tar cvf tmp.tar tmp/
具體參數(shù)在下面會(huì)具體解釋?zhuān)粠魏螇嚎s格式的話(huà)矢洲,
tar
命令會(huì)生成一個(gè)TAR文件璧眠。相應(yīng)的,如果需要解開(kāi)TAR文件读虏,可以這么做:tar xvf tmp.tar
-
壓縮文件(Compressed File)
TAR文件是沒(méi)有被壓縮的责静,大小基本保持不變。如果需要對(duì)文件進(jìn)行壓縮,則需要在
tar
命令中加入壓縮格式對(duì)應(yīng)的參數(shù),具體在下面會(huì)說(shuō)明匹舞。
下面來(lái)詳細(xì)介紹tar
命令的用法,tar
的用法如下:
# tar --help
Usage: tar [OPTION...] [FILE]...
tar
命令支持非常多的參數(shù)睦焕,這里列舉比較常用的幾種使用方式:
-
壓縮文件或目錄
# tar czvf tmp.tgz tmp/ tmp/ tmp/Test1 tmp/test.log tmp/test2
其中藐握,
czvf
表示參數(shù)選項(xiàng);tmp.tgz
表示壓縮后的文件名垃喊,通常tgz
是tar.gz
的簡(jiǎn)寫(xiě);tmp/
表示被壓縮的目錄袜炕。參數(shù)的解釋如下:參數(shù) 說(shuō)明 c Create
的簡(jiǎn)寫(xiě)本谜,表示生產(chǎn)壓縮文件z 表示采用 gzip
的壓縮格式,文件后綴通常為.tar.gz
或者.tgz
v 表示顯示壓縮的過(guò)程偎窘,會(huì)列出所有被壓縮的文件 f 指定壓縮文件
需要注意的是乌助,tar
支持不同的壓縮格式,除了gzip
之外陌知,還有:
參數(shù) | 說(shuō)明 |
---|---|
j | 采用bzip2 的壓縮格式他托,文件后綴通常為.bz2
|
--lzip |
采用lzip 的壓縮格式,文件后綴通常為.lz
|
--xz |
采用xz 的壓縮格式仆葡,文件后綴通常為.xz
|
--lzma |
采用lzma 的壓縮格式赏参,文件后綴通常為.lzma
|
更多格式可以參考這里。當(dāng)然沿盅,最為常用的兩種格式為gzip
跟bzip2
把篓,用法示例如下:
tar czvf tmp.tgz tmp/
tar cjvf tmp.bz2 tmp/
其中v
參數(shù)可選,如果不需要顯示壓縮過(guò)程的話(huà)腰涧。需要注意的是韧掩,tar
壓縮目錄的時(shí)候會(huì)保持目錄的結(jié)構(gòu)。
-
解壓文件
對(duì)應(yīng)于不同的壓縮格式窖铡,解壓參數(shù)稍微不一樣疗锐,對(duì)于
gzip
跟bzip2
分別示例如下:tar xzvf tmp.tgz tar xjvf tmp.tgz
與壓縮不同,
c
換成x
表示解壓费彼,其它參數(shù)含義與壓縮一樣滑臊。默認(rèn)情況下,解壓的文件會(huì)放在當(dāng)前目錄敌买,如果需要解壓到某個(gè)目錄下简珠,則可以用-C
參數(shù):tar xzvf -C /tmp/ tmp.tgz tar xjvf -C /tmp/ tmp.tgz
-
列出壓縮包里面的文件
有時(shí)候我們需要先看看壓縮包里面有哪些文件,但又并不想解壓文件虹钮,可以采用
-t
參數(shù):# tar czf tmp.tgz tmp/ # tar tvf tmp.tgz drwxr-xr-x root/root 0 2017-11-17 02:46 tmp/ -rw-r--r-- root/root 0 2017-11-16 00:17 tmp/Test1 -rw-r--r-- root/root 102 2017-11-17 00:30 tmp/test.log -rw-r--r-- root/root 34 2017-11-17 02:46 tmp/test2
其中聋庵,
tvf
會(huì)列出壓縮包中的文件,不論采用何種壓縮格式芙粱,甚至是沒(méi)有被壓縮的TAR文件祭玉。 -
從壓縮包中提取特定的文件
在列出壓縮包里面的內(nèi)容后,如果只想提取里面的某些文件春畔,可以這么做:
# tar xzvf tmp.tgz tmp/test.log tmp/test2 tmp/test.log tmp/test2
其中脱货,根據(jù)不同的壓縮格式請(qǐng)?zhí)鎿Q成不同的參數(shù)岛都。請(qǐng)務(wù)必注意,指定的文件必須是完整的路徑振峻,而不能只是文件名臼疫。
另外,如果想提取一組匹配某種條件的文件扣孟,可以使用
--wildcards
參數(shù):# tar xzvf tmp.tgz --wildcards "*.log" tmp/test.log
split命令
split
命令用來(lái)將一個(gè)文件分成多個(gè)文件烫堤,比如將一個(gè)特別大的文件分成平均大小為100M的多個(gè)文件等。
# split -b 40M go1.6.linux-amd64.tar.gz go1.6.linux-amd64.tar.gz.part
# ll go1.6.linux-amd64.tar.gz.part*
-rw-r--r--. 1 root root 41943040 Nov 20 15:03 go1.6.linux-amd64.tar.gz.partaa
-rw-r--r--. 1 root root 41943040 Nov 20 15:03 go1.6.linux-amd64.tar.gz.partab
-rw-r--r--. 1 root root 913400 Nov 20 15:03 go1.6.linux-amd64.tar.gz.partac
其中凤价,go1.6.linux-amd64.tar.gz
是要被拆分的文件鸽斟,go1.6.linux-amd64.tar.gz.part
是拆分后文件的前綴,可以看到文件被拆分為三部分了利诺。
split
非常常見(jiàn)的用法是來(lái)將某個(gè)被壓縮的文件拆分成小的部分富蓄,正如上例所示。那么慢逾,如何將拆分的文件重新合并呢立倍?我們可以用cat
將它們合并:
cat go1.6.linux-amd64.tar.gz.part* > go1.6.linux-amd64.tar.gz
grep命令
過(guò)濾數(shù)據(jù)來(lái)說(shuō),用的最多的估計(jì)就是grep
命令了氛改,grep
命令可以從文件或者管道中搜索數(shù)據(jù)并打印出來(lái)帐萎,當(dāng)然,其也可以直接在目錄中搜索所有的文件胜卤,并把其中符合條件的行打印出來(lái)疆导。
# cat test.log | grep hello
hello
# grep hello test.log
hello
# grep hello . -r
./test.log:hello
上面就是三種方式搜索包括hello
關(guān)鍵字的行。
grep
是Linux中使用最為頻繁的命令之一葛躏,其本身也有非常強(qiáng)大的功能澈段,這一節(jié)咱們將詳細(xì)講述其比較常見(jiàn)的用法。
基本查找
查看grep
的幫助可以看到:
# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
其中OPTION
指的是命令參數(shù)舰攒,PATTERN
指的是匹配的字符串败富,比如關(guān)鍵字搜索。FILE
指的是文件摩窃,當(dāng)然兽叮,沒(méi)有文件的時(shí)候也可以通過(guò)管道接收數(shù)據(jù)并搜索過(guò)濾。grep
提供了非常多的命令參數(shù)用來(lái)控制查找的方式跟效果猾愿,下面列舉其常用的一些參數(shù):
參數(shù) | 說(shuō)明 |
---|---|
-i | 默認(rèn)情況下鹦聪,grep 命令的搜索是大小寫(xiě)敏感的,如果需要忽略大小寫(xiě)可以用這個(gè)參數(shù) |
-v | 該參數(shù)表示不包含的意思 |
-A2 | 其中A 是after 的意思蒂秘,表示同時(shí)顯示搜索出來(lái)行后面兩行泽本。有時(shí)候我們需要知道匹配行后面是什么,可以用這個(gè)參數(shù) |
-B2 | 與A 相反姻僧,其是before 的意思规丽,表示同時(shí)顯示匹配行前兩行 |
-C2 | 有時(shí)候我們想既顯示前面兩行也顯示后面兩行蒲牧,這時(shí)候就用這個(gè)參數(shù) |
-r | 搜索目錄的時(shí)候需要帶上這個(gè)參數(shù) |
-n | 有些時(shí)候,我們需要知道匹配到的行是第幾行赌莺,可以加上這個(gè)參數(shù)把行號(hào)打印出來(lái) |
對(duì)于PATTERN
冰抢,grep
命令也支持不同的用法:
- 關(guān)鍵字匹配
這個(gè)是最常用的基本用法,匹配是否包括該關(guān)鍵字的行艘狭。
- 正則匹配
除了基本的關(guān)鍵字匹配晒屎,grep
還支持極為強(qiáng)大的正則表達(dá)式的匹配。我們將在下一小節(jié)專(zhuān)門(mén)講述正則表達(dá)式匹配缓升。
- 或匹配
有時(shí)候我們需要匹配某個(gè)PATTERN1或者PATTERN2的行,這時(shí)候可以這么寫(xiě)PATTERN
:PATTERN1\|PATTERN2
蕴轨。通過(guò)\|
將多個(gè)PATTERN
連在一起表示或的意思港谊,只要匹配其中任一個(gè)的行都會(huì)被打印出來(lái)。
# grep '12306\|test' . -r
./test2:http://abcdefg.test.com
./test2:12306.com
正則表達(dá)式匹配
grep
命令支持非常強(qiáng)大的正則匹配橙弱,支持三種不同的正則表達(dá)式:
- ERE(POSIX-Extended Regular Expressions)
- BRE(POSIX_Basic_Regular_Expressions)
- Perl Regular expression
當(dāng)然歧寺,比較常用的是ERE
正則表達(dá)式了。在grep
命令中棘脐,采用-E
參數(shù)即可以使用該表達(dá)式斜筐,正則表達(dá)式非常靈活,用法非常多蛀缝,這里列舉幾個(gè)示例:
-
匹配以關(guān)鍵字開(kāi)頭的行
grep -E "^keyword" . -r
-
匹配以關(guān)鍵字結(jié)尾的行
grep -E "keyword$" . -r
-
匹配包含如
2017/10/11
日期的行grep -E "[0-9]{4}/[0-9]{2}/[0-9]{2}" . -r
注意的是顷链,對(duì)于數(shù)字的表示,其不支持如
\d
這樣的表達(dá)方式屈梁,而需要[0-9]
這樣表達(dá)嗤练。
當(dāng)然,如果需要熟練掌握grep
的正則表達(dá)式匹配在讶,你必須對(duì)正則表達(dá)式非常熟悉煞抬,這個(gè)就不在本篇的范疇了。
awk命令
要說(shuō)Linux中最為強(qiáng)大的基本命令有哪些构哺,那awk
無(wú)疑會(huì)榜上有名革答,其強(qiáng)大的流式處理能力,很多人甚至寫(xiě)書(shū)來(lái)專(zhuān)門(mén)講這個(gè)命令曙强。這里咱們暫時(shí)介紹基本的功能残拐,以后有機(jī)會(huì)將專(zhuān)門(mén)開(kāi)辟一文來(lái)展開(kāi)。
一個(gè)常見(jiàn)的用法就是把文件中的某幾列打印出來(lái):
# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | awk '{print $1, $2, $3}'
Nov 17 00:27:20
如上例旗扑,空格將一行分成了不同的列蹦骑,咱們希望只把時(shí)間顯示出來(lái),而時(shí)間包括了第1臀防,2眠菇,3列边败,因此,通過(guò)awk '{print $1, $2, $3}'
就實(shí)現(xiàn)了此功能捎废,其中$1
就是引用第一列笑窜。
cut命令
有時(shí)候,一行內(nèi)的數(shù)據(jù)并不是通過(guò)空格分隔開(kāi)的登疗,而是通過(guò)其它分隔符排截,那如何顯示想要的列呢?通過(guò)cut
命令辐益,咱們同樣可以輕松實(shí)現(xiàn):
# head -n 5 /etc/passwd
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
# head -n 5 /etc/passwd | cut -d: -f1
root
bin
daemon
adm
lp
/etc/passwd
中的每一行基本上都是通過(guò):
進(jìn)行分隔断傲,其中第一列表示用戶(hù)名,如果咱們只想把用戶(hù)名輸出的話(huà)智政,可以通過(guò)cut -d: -f1
來(lái)實(shí)現(xiàn)认罩,其中-d:
表示以:
號(hào)為分隔符,-f1
表示顯示第一列续捂】汛梗可見(jiàn),對(duì)于cut
命令來(lái)說(shuō)牙瓢,咱們可以指定分隔符劫拗,那么前面通過(guò)awk
實(shí)現(xiàn)的例子也可以通過(guò)cut
來(lái)做:
# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | cut -d" " -f1-3
Nov 17 00:27:20
其中-d" "
表示以空格為分隔符(注意,這里的空格必須以引號(hào)括起來(lái)矾克,不然會(huì)被shell展開(kāi)去除多余空格)页慷,-f1-3
表示輸出第1到3列,這里簡(jiǎn)用了-
來(lái)表示范圍聂渊,當(dāng)然也可以寫(xiě)成-f1,2,3
了差购。
此外,cut
命令還可以指定輸出哪些位的字符:
# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | cut -c1-16
Nov 17 00:27:20
其中汉嗽,-c1-16
表示輸出第1到16個(gè)字符欲逃,當(dāng)然,你同樣可以以,
來(lái)分別列舉要輸出哪幾個(gè)饼暑。
tr命令
tr
其實(shí)是translate
的縮寫(xiě)稳析,這個(gè)命令用來(lái)將某些字符翻譯成另外的字符。
# tr --help
Usage: tr [OPTION]... SET1 [SET2]
這個(gè)命令就是把字符集SET1
中的字符對(duì)應(yīng)的轉(zhuǎn)成字符集SET2
中的字符弓叛。如將小寫(xiě)轉(zhuǎn)成大寫(xiě):
# cat test.log
Nov 17 00:27:20 traffic-base1 named[1212]: managed-keys-zone: Unable to fetch DNSKEY set .: timed out
# cat test.log | tr a-z A-Z
NOV 17 00:27:20 TRAFFIC-BASE1 NAMED[1212]: MANAGED-KEYS-ZONE: UNABLE TO FETCH DNSKEY SET .: TIMED OUT
這里用-
來(lái)方便的表示一定范圍的字符集彰居,當(dāng)然,你完全可以一個(gè)個(gè)列出來(lái)你要的字符集撰筷。通常情況下陈惰,SET1
跟SET2
的長(zhǎng)度保持一致,因?yàn)檫@個(gè)轉(zhuǎn)換實(shí)際上是一對(duì)一的轉(zhuǎn)換毕籽,當(dāng)然抬闯,SET2
的長(zhǎng)度是可以大于SET1
的井辆,多余的字符不會(huì)被使用。但是溶握,當(dāng)SET2
長(zhǎng)度小于SET1
時(shí)杯缺,tr
命令會(huì)將SET2
中最后一個(gè)字符填充不足的位數(shù):
# echo 'abcdefg' | tr ab wyz
wycdefg
# echo 'abcdefg' | tr abcdefg wyz
wyzzzzz
對(duì)于tr
還有一個(gè)常見(jiàn)的用途,就是用來(lái)去除字符串中的換行符:
# head -n 5 /etc/passwd
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
# head -n 5 /etc/passwd | tr '\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
其中睡榆,\n
表示換行符萍肆,示例中將換行符全部換成了空格。
最后胀屿,tr
還有一個(gè)常見(jiàn)的用法塘揣,可以加上-d
參數(shù)來(lái)刪除字符集中的字符。
# echo abcdeWXYZ | tr -d a-z
WXYZ
示例中刪除了所有小寫(xiě)字母宿崭。
sed命令
流式處理中勿负,sed
也是一個(gè)極為常用的命令,它可以用來(lái)替換字串劳曹,比之前的tr
那是要強(qiáng)大無(wú)數(shù)倍了。
查看sed
的幫助:
# sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
它既可以直接在文件中替換字符串琅摩,也可以加收管道的數(shù)據(jù)铁孵。如基本用法:
# echo abcdefgabcd | sed 's/abc/ABC/'
ABCdefgabcd
其中's/abc/ABC/'
指定了替換的規(guī)則,默認(rèn)情況下只替換一次房资,如果需要全部替換蜕劝,則需要在規(guī)則后面加入g
:
# echo abcdefgabcd | sed 's/abc/ABC/g'
ABCdefgABCd
規(guī)則中默認(rèn)使用了/
為分隔。當(dāng)然轰异,你也可以使用其他分隔符岖沛,這在要替換的字串中帶有/
的時(shí)候特別有用:
# echo "http://abc.test.com" | sed 's/http:\/\//https:\/\//'
https://abc.test.com
# echo "http://abc.test.com" | sed 's|http://|https://|'
https://abc.test.com
如果不指定新的分隔符|
,那么就得使用轉(zhuǎn)義符\
將//
進(jìn)行轉(zhuǎn)義了搭独,這樣可讀性就差了很多婴削,采用|
就自然多了。sed
支持的分隔符還包括了:
牙肝,_
唉俗。
此外,sed
不僅可以用來(lái)替換字串配椭,還可以用來(lái)刪除匹配的行:
# cat test2
http://abcdefg.test.com
12306.com
# cat test2 | sed '/12306/d'
http://abcdefg.test.com
高級(jí)用法
-
后向引用(Back Referencing)
sed
規(guī)則匹配到的字符串還可以在規(guī)則定義中被引用虫溜,如下例:# echo "hello world" | sed 's/hello/&&/' hellohello world
其中,
&
可以用來(lái)引用被匹配到的字串股缸,在本例中衡楞,匹配到的字串是hello
,這樣通過(guò)&
就可以引用被匹配到的字串了敦姻。此外瘾境,我們還可以通過(guò)()
來(lái)指定匹配的字串歧杏,并用\1
(數(shù)字表示第一個(gè)()
)來(lái)引用(實(shí)際上是正則表達(dá)式中的Grouping):# echo Sunday | sed 's/\(Sun\)/\1ny/' Sunnyday # echo Sunday | sed 's/\(Sun\)/\1ny \1/' Sunny Sunday
-
正則匹配
由上述可以看出,
sed
的規(guī)則使用了正則表達(dá)式規(guī)則寄雀,但是其書(shū)寫(xiě)跟一般的正則書(shū)寫(xiě)不一樣得滤,你必須將有關(guān)的字符轉(zhuǎn)義,否則sed
仍然會(huì)將其當(dāng)做普通字符進(jìn)行匹配:# echo "this is aaaa cat" | sed 's/a{4}/a/' this is aaaa cat # echo "this is aaaa cat" | sed 's/a\{4\}/a/' this is a cat
可以看出盒犹,在沒(méi)有轉(zhuǎn)義
{
及}
之前懂更,sed
并沒(méi)有匹配到目標(biāo)字串aaaa
,而將其轉(zhuǎn)義之后急膀,則以正則表達(dá)式a{4}
匹配到了aaaa
并進(jìn)行了替換沮协。 -
遞歸替換
有時(shí)候我們需要在項(xiàng)目目錄下替換某個(gè)字串,比如把手誤寫(xiě)錯(cuò)的
#include<stdllib.h>
全部替換成#include<stdlib.h>
卓嫂,希望被替換的文件包括*.cpp
慷暂,*.h
的文件。其中的一種做法如下:$ head -n 1 test.cpp #include <stdllib.h> $ sed -i 's/#include <stdllib.h>/#include <stdlib.h>/' `find . -name "*.cpp" -o -name "*.h"` $ head -n 1 test.cpp #include <stdlib.h>
這里用到了shell嵌入的用法(可以參看這一篇博文)晨雳,通過(guò)
find
命令找出所有的源文件行瑞,然后用sed -i
進(jìn)行替換,其中-i
表示從文件里面替換餐禁。這一用法會(huì)將find
找到的所有文件作為參數(shù)都追加到sed
命令后血久,在項(xiàng)目非常大的情況下可能會(huì)導(dǎo)致命令執(zhí)行失敗(因?yàn)閿?shù)量龐大的文件導(dǎo)致追加的參數(shù)太大了)帮非,通常我們推薦采用find
的這種用法:find . -name "*.cpp" -o -name "*.h" -exec sed -i 's/#include <stdllib.h>/#include <stdlib.h>/' {} \;
具體可以參照本文中關(guān)于
find
命令的介紹氧吐。
本博文還可以在博主個(gè)人主頁(yè)中找到。