乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      我敢打賭,看完這些Linux文本查找技巧,提高你80%工作效率!

       西北望msm66g9f 2019-06-23

      作者:守望先生

      公眾號(hào):編程珠璣

      前言

      之前介紹過(guò)很多l(xiāng)inux下查找相關(guān)的命令,而對(duì)文件內(nèi)容搜索的命令似乎還沒(méi)有涉及,因此本文介紹文本搜索命令--grep。

      常見(jiàn)用法

      我們會(huì)經(jīng)常結(jié)合管道符(|)來(lái)使用它,即在前面命令執(zhí)行的結(jié)果中查找包含相關(guān)字符串的內(nèi)容。例如:

      $ ps -ef|grep redis

      ps -ef用于查看系統(tǒng)進(jìn)程情況,但是它列出的結(jié)果很多,如果我們只想看到自己需要的,則通過(guò)管道符,用grep進(jìn)行過(guò)濾搜索,例如搜索redis相關(guān)的進(jìn)程,最后它只會(huì)列出和redis相關(guān)的進(jìn)程了:

      $  ps -ef|grep redis
      root     10748 10733  0 21:14 pts/21   00:00:00 redis-server *:6379
      root     10754 10733  0 21:14 pts/21   00:00:00 grep --color=auto redis

      那么如果要排除某些不相關(guān)信息呢?我們可以使用-v參數(shù)

      $ ps -ef|grep redis |grep -v auto
      root     10748 10733  0 21:14 pts/21   00:00:00 redis-server *:6379

      這樣一來(lái),包含auto相關(guān)的結(jié)果就不會(huì)出現(xiàn)在最終結(jié)果里了。

      如果只想統(tǒng)計(jì)結(jié)果數(shù)量呢?我們可以結(jié)合-c(count)參數(shù):

      $ ps -ef|grep redis -c
      2

      文件內(nèi)容搜索

      好了,說(shuō)完了最常見(jiàn)的用法,我們來(lái)看看如何搜索文件內(nèi)容。實(shí)際上awk和sed在這方面也頗有經(jīng)驗(yàn),不過(guò)本文的主角是grep,所以另外兩個(gè)命令暫時(shí)不涉及。我們來(lái)看幾個(gè)實(shí)例。

      在指定文件中查找指定關(guān)鍵字

      例如,要在linux_command_debug.md文件中,查找test字符串:

      $  grep 'test' aaa/bbb/linux_command_debug.md
      int test(int a,int b)
          test(a,b);

      如果想要顯示指定關(guān)鍵字的行號(hào),可以使用-n參數(shù),例如:

      $  grep -n 'test' aaa/bbb/linux_command_debug.md
      18:int test(int a,int b)
      27:    test(a,b);

      搜索時(shí)指定或排除多個(gè)文件

      前面提到了對(duì)一個(gè)文件內(nèi)容進(jìn)行搜索,如果是多個(gè)呢?或者不想從某些文件里搜索呢?

      如果想對(duì)文件進(jìn)行指定也是可以的,例如搜索所有的md結(jié)尾的文件:

      $  grep -n 'test' *.md

      或者可以使用--exclude參數(shù)來(lái)排除某些文件,例如,查找包含test,但是排除txt文件:

      $ grep -rn 'test' --exclude=*.txt

      搜索時(shí)就會(huì)忽略.txt結(jié)尾的文件了。

      如果要排除的條件比較多,可以將要排除的條件存儲(chǔ)在另外一個(gè)文件里:

      $ grep -rn 'test' --exclude-from=skip.txt

      skip.txt的內(nèi)容可以是模式匹配的文件名或者具體文件名:

      *.txt
      test.md

      這樣,以.txt結(jié)尾,以及test.md文件都不會(huì)搜索了。

      除此之外,還可以排除指定目錄,它需要用到--exclude-dir參數(shù):

      $ grep -rn 'test' --exclude-dir=aaa

      它在搜索時(shí)將會(huì)跳過(guò)aaa目錄下的文件。

      查找包含指定關(guān)鍵字的文件

      如果要在當(dāng)前目錄下所有文件查找包含“int main(void)”字符串的文件:

      $ grep -rn 'int main(void)'
      aaa/bbb/c_main_func.md:49:int main(void)
      aaa/bbb/c_main_func.md:71:int main(void) { /* ... */ }
      aaa/bbb/c_array.md:104:int main(void)
      aaa/bbb/c_array.md:129:int main(void)
      aaa/bbb/pc-lint.md:42:int main(void)
      aaa/bbb/pc-lint.md:128:int main(void)

      這可能是最實(shí)用的使用方法之一了。這里-r參數(shù)表示遞歸查找當(dāng)前目錄的文件,-n會(huì)顯示查找位置的行號(hào),如果只想顯示包含該指定關(guān)鍵字的文件名,可使用-l(--file-with-matches)參數(shù):

      $ grep -rln 'int main(void)'
      aaa/bbb/c_main_func.md
      aaa/bbb/c_array.md
      aaa/bbb/pc-lint.md

      如果你嘗試一下就會(huì)發(fā)現(xiàn),如果不帶-r參數(shù),它會(huì)暫停,等待你從控制臺(tái)輸入,例如:

      $ grep -n 'test'
      test
      1:test

      所以使用時(shí)記得帶上相關(guān)參數(shù)奧!

      查找不包含指定關(guān)鍵字的文件

      前面提到了如何查找包含某個(gè)關(guān)鍵字的文件,如果要找的是不包含該關(guān)鍵字的文件呢?
      實(shí)際上只要使用-L參數(shù)即可:

      $ grep -rLn 'int main(void)'
      (這里會(huì)顯示不包含指定關(guān)鍵字內(nèi)容的文件名)

      搜索時(shí)忽略大小寫

      使用-i(--ignore-case)參數(shù)即可:

      $ grep -rni 'int MAIN(void)'
      aaa/bbb/c_main_func.md:49:int main(void)
      aaa/bbb/c_main_func.md:71:int main(void) { /* ... */ }
      aaa/bbb/c_array.md:104:int main(void)
      aaa/bbb/c_array.md:129:int main(void)
      aaa/bbb/pc-lint.md:42:int main(void)
      aaa/bbb/pc-lint.md:128:int main(void)

      搜索顯示不包含指定關(guān)鍵字的行

      前面的大部分例子都是顯示符合條件的行,如果要顯示不符合條件的行呢?可以用我們前面提到的-v參數(shù):

      $ grep -rnv 'int main(void)'
      (內(nèi)容較多,未顯示)

      從結(jié)果中就會(huì)發(fā)現(xiàn),它會(huì)展示出包含指定關(guān)鍵字的文件,但是展示的是不包含該關(guān)鍵字的行。

      顯示指定關(guān)鍵字前后內(nèi)容

      假如你需要查看包含指定關(guān)鍵字行附近的行,前面的方式是沒(méi)有辦法看到的,不過(guò)我們可以用-A(--after-context=)和-B(--before-context=)參數(shù)來(lái)顯示前后的行:

      $ grep -rn 'int main(void)' -A 1 -B 1
      aaa/bbb/c_array.md-103-}
      aaa/bbb/c_array.md:104:int main(void)
      aaa/bbb/c_array.md-105-{
      (其他內(nèi)容省略)

      通過(guò)最后加上-A和-B參數(shù),顯示了指定關(guān)鍵字前后的行,這在日志搜索分析時(shí)非常有用。

      指定規(guī)則文件進(jìn)行搜索

      如果有多個(gè)搜索關(guān)鍵字怎么處理呢?我們可以把關(guān)鍵字寫在一個(gè)文件,搜索時(shí)指定文件即可,例如規(guī)則文件為key.txt:

      int main(void)
      test

      從指定文件中搜索上面的關(guān)鍵字:

      $ cat filename |grep -f key.txt

      這樣結(jié)果就會(huì)顯示匹配key.txt文件中所有關(guān)鍵字的行,非常適合用于多個(gè)條件的搜索。

      正則表達(dá)式搜索

      看完前面的內(nèi)容,是不是還沒(méi)有感受到grep的強(qiáng)大?grep的另一個(gè)強(qiáng)大之處是,它的搜索支持正則表達(dá)式,例如查找文本行以t開(kāi)頭,以t結(jié)尾的文件:

      $ grep -rn ^t.*t$
      key.txt:2:test
      aaa/bbb/c_operate_redis_start.md:68:typedef struct Stu_Info_Struct
      aaa/bbb/c_operate_redis_start.md:101:typedef struct Stu_Info_Struct

      其中^t,表明以t開(kāi)頭,t$表明以t結(jié)尾,如果需要使用擴(kuò)展的正則表達(dá)式進(jìn)行搜索,可使用egrep命令。關(guān)于正則表達(dá)式的寫法,本文不做詳細(xì)介紹。

      總結(jié)

      在內(nèi)容搜索方面,grep常常能夠助我們一臂之力,因此掌握grep的使用也是linux學(xué)習(xí)不可缺少的一部分,當(dāng)然我們不需要完全記住每個(gè)參數(shù)的作用,但我們至少知道有這樣的參數(shù),并且在需要時(shí)能夠快速查詢到。本文常用參數(shù)如下:

      • -v #顯示不包含匹配關(guān)鍵字的所有行。

      • -l #顯示包含匹配關(guān)鍵字的文件

      • -L #顯示不包含匹配關(guān)鍵字的文件

      • -r #遞歸搜索

      • -i #忽略大小寫

      • -n #顯示關(guān)鍵字所在行號(hào)

      • -A n #顯示關(guān)鍵字后n行

      • -B n #顯示關(guān)鍵字前n行

      • --exclude #搜索時(shí)排除某些文件

      • --exclude-dir #搜索時(shí)排除某些目錄

      • -f #指定規(guī)則文件進(jìn)行搜索

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多