Linux系統(tǒng)介紹(五)常用命令

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.logrm 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命令

uniqunique的簡(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表示壓縮后的文件名垃喊,通常tgztar.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)然沿盅,最為常用的兩種格式為gzipbzip2把篓,用法示例如下:

 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ì)于gzipbzip2分別示例如下:

    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 其中Aafter的意思蒂秘,表示同時(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ě)PATTERNPATTERN1\|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á)式:

當(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)你要的字符集撰筷。通常情況下陈惰,SET1SET2的長(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è)中找到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末末盔,一起剝皮案震驚了整個(gè)濱河市筑舅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陨舱,老刑警劉巖翠拣,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異游盲,居然都是意外死亡心剥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)背桐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)优烧,“玉大人,你說(shuō)我怎么就攤上這事链峭∑杪Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)熙卡。 經(jīng)常有香客問(wèn)我杖刷,道長(zhǎng),這世上最難降的妖魔是什么驳癌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任滑燃,我火速辦了婚禮,結(jié)果婚禮上颓鲜,老公的妹妹穿的比我還像新娘表窘。我一直安慰自己,他們只是感情好甜滨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布乐严。 她就那樣靜靜地躺著,像睡著了一般衣摩。 火紅的嫁衣襯著肌膚如雪昂验。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天艾扮,我揣著相機(jī)與錄音既琴,去河邊找鬼。 笑死泡嘴,一個(gè)胖子當(dāng)著我的面吹牛呛梆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磕诊,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纹腌!你這毒婦竟也來(lái)了霎终?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤升薯,失蹤者是張志新(化名)和其女友劉穎莱褒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體涎劈,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡广凸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛛枚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谅海。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蹦浦,靈堂內(nèi)的尸體忽然破棺而出扭吁,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布侥袜,位于F島的核電站蝌诡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枫吧。R本人自食惡果不足惜浦旱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望九杂。 院中可真熱鬧颁湖,春花似錦、人聲如沸尼酿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裳擎。三九已至涎永,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹿响,已是汗流浹背羡微。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惶我,地道東北人妈倔。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绸贡,于是被迫代替她去往敵國(guó)和親盯蝴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容