grep及正則表達(dá)式

grep

  • Linux上文本出來三劍客
    • grep:文本過濾(模式:pattern)工具;
    • grep ,egrep ,fgrep
    • sed:stream,editor,文本編輯工具;
    • awk:Linux上的實(shí)現(xiàn)gawk ,文本報(bào)告生成器;
  • grep:Global search REgular expression and Print out the line
    - 作用:文本搜索工具,根據(jù)用戶指定的“模式”對(duì)目標(biāo)文本逐行進(jìn)行匹配檢查;打印匹配搭配的行;
    - 模式:由正則表達(dá)式字符及文本字符所編寫的過濾條件;
    - 正則表達(dá)式REGEXP):由一類特殊字符及文本字符所編寫的模式,其中有些字符不表達(dá)字符字面意義,而表示控制或通配的功能;
  • 正則表達(dá)式分兩類
    • 基本正則表達(dá)式;BRE
    • 擴(kuò)展正則表達(dá)式:ERE
    • 這兩類有些元字符式相同的有些是不相同的
    • grep一般的時(shí)候只支持基本正則表達(dá)式的、
    • 所以我們要用egrep或grep -E 他們才能支持?jǐn)U展的正則表達(dá)式
    • 而fgrep 不支持正則表達(dá)式
  • 正則表達(dá)式引擎:
    • 如grep ,sed,awk,他們都支持正則表達(dá)式

    • 但是他們所匹配時(shí)候的算法也就式引擎各不相同

    • 或者是有細(xì)微差別

    • grep使用格式

      • grep [OPTIONS] PATTERN [FILE...]
    • 選項(xiàng):

      • -- color=auto:對(duì)匹配到的文本著色顯示;
      • -v 顯示不能夠被pattern匹配到的行;
      • -i 忽略字符大小寫
      • -o 僅顯示匹配到的字符串
      • -q 靜默模式,不輸出任何信息:(可以用echo $? 來查看)
      • -A #:after,后#行
      • -B #:before,前#行
      • -C #:context ,前后各#行
      • -E:使用(ERE)擴(kuò)展正則表達(dá)式

基本正則表達(dá)式

  • 字符匹配

  • .:任意單個(gè)字符

  • [ ] :范圍內(nèi)的任意單個(gè)字符

  • [^ ]: 范圍外的單個(gè)字符

  • 次數(shù)匹配

  • *:任意長度的任意字符

  • \? :匹配其前面的字符0或1次:即前面的可有可無

  • \+ : 匹配其前面的字符至少1次

  • \{m\}: 匹配前面的字符m次

  • \{m.n\} :匹配前面的字符至少m次,至多n次

  • \{0,n\} : 匹配前面的字符至多n次:可以沒有

  • \{m,\}: 匹配前面的字符至少m次

  • 位置錨定

    • $ :錨定行尾:模式的最右側(cè)

    • ^:錨定行首:用于模式的最左側(cè)

    • ^PATTERN$: 用于模式匹配整行:

    • ^$空行:

    • \<,\b :詞首錨定:用于單詞模式的左側(cè):

    • \>,\b :詞尾錨定:用于單詞的右側(cè)
      -\<PATTERN\>: 匹配正則單詞

      • 分組
    • \(\) :\(\) 將一個(gè)或多個(gè)字符捆綁在一起,當(dāng)作一個(gè)整體進(jìn)行處理,如:(root)+

    • 后向引用 \1,\2,\3......

    • 后向引用:引用前面的分組括號(hào)中的模式所匹配字符,(而非模式本身)

    • NOte:分組括號(hào)中的模式匹配到的內(nèi)容會(huì)被正則表達(dá)式引擎記錄于內(nèi)部的變量中,這些變量的命令方式為:\1,\2,\3.......

    • \1:從左側(cè)起,第一個(gè)左括號(hào)以及與之匹配右括號(hào)之間的模式所匹配到的字符

    • 如:(ab+(xy)*);

    • \1:ab+(xy)*

    • \2:xy

egrep及擴(kuò)展的正則表達(dá)式

grep = grep -E

  • grep [OPTIONS] PATTERN [FILE...]\
  • 擴(kuò)展正則表達(dá)式的元字符:
    • 字符匹配
  • .:匹配單個(gè)字符
  • [ ]:范圍之外
  • [^]:范圍之內(nèi)
  • 次數(shù)匹配
  • *:
  • ?:0或多次:
  • {m}:匹配m次
  • {m/n}:至少m,至多n次
  • 錨定
  • ^ :錨定行首
  • $:錨定行尾
  • <,\b:詞首錨定
  • >,\b:詞尾錨定
  • 分組:
    ( )
    后向引用:\1,\2,.......
    或者:
    a|b
    c|cat: C或cat

練習(xí):
1,顯示當(dāng)前系統(tǒng)root,centos或user1用戶的默認(rèn)shell和UID:
答案:grep -E "^(root|centos|user1)>" /etc/passwd|cut-d: -f1,3,7
2,找出/etc/rc.d/init.d/functions文件(centos6)中某單詞后面跟一個(gè)小括號(hào)的行
答案“grep -E -o "[_[:alpha:]]+() /etc/rc.d/init.d/functiosns"
3,使用echo 輸出一絕對(duì)路徑,使用egrep取出其基名:
答案:echo "/mnt/sdc" | grep -E -o "[^/]+/?$|cut-d”/" -f1
4,找出ifconfig命令結(jié)果中1-255之間的數(shù)值:

5,找出ifconfig命令結(jié)果中的ip地址

bash的基礎(chǔ)特性

  • 變量類型:

  • 數(shù)據(jù)存儲(chǔ)格式,存儲(chǔ)空間大小,參與運(yùn)算種類:

  • 字符型、

  • 數(shù)值型

  • 他們分為整型和浮點(diǎn)型

  • 強(qiáng)類型:定義變量時(shí)必須指定類型,參與運(yùn)算必須符合類型要求,調(diào)用未聲明的變量會(huì)產(chǎn)生錯(cuò)誤

  • 弱類型 :無須指定類型,默認(rèn)均為字符型:參與運(yùn)算會(huì)自動(dòng)進(jìn)行隱式類型轉(zhuǎn)換,變量無效事先定義可直接調(diào)用

  • bash就式弱類型的編程語言

  • bash中的變量種類:

  • 根據(jù)變量的生效范圍等標(biāo)準(zhǔn):

  • 本地變量:生效范圍為當(dāng)前shell進(jìn)程,對(duì)當(dāng)前shell之外的其他shell進(jìn)程,包括當(dāng)前shell的子shell進(jìn)程均無效

  • 環(huán)境變量:生效范圍為當(dāng)前shell進(jìn)程及子shell

  • 局部變量:生效范圍為當(dāng)前shell進(jìn)程中某代碼片段(通常指函數(shù))

  • 位置變量:$1,$2,........來表示,用于讓腳本在腳本代碼中調(diào)用通過命令行傳遞給他的參數(shù)

  • 特殊變量$?,$0``$*,$#,#@

  • pstree進(jìn)程樹

本地變量:

   - 變量賦值:name=`value`
   - 可以使用引用:
   - value:
       (1)可以式直接字符串:name="username"
       (2)變量引用:name="$username"
       (3)命令引用:name=COMMAND`,name=$(COMMAND)
   - 變量引用:${name},或-$name
   - "  ":弱引用,其中的變量引用會(huì)被替換為變量值
   - ·· :強(qiáng)引用,其中的變量引用不會(huì)被替換為變量值,而保持原字符串:
  • 顯示已定義的所有變量set命令
  • 銷毀變量 unset name 命令

環(huán)境變量

  • 變量聲明,賦值:
    • export name=VALUE
    • declare -x name=VALUE
    • 變量引用:$name,${name}
    • 顯示所有環(huán)境變量:
    • export
    • env
    • printenv
    • 銷毀:
    • unset name

bash由許多內(nèi)建的環(huán)境變量:PATH,SHELL,UID,HISTSIZE,HOME,PWD,OLD,PS1,HISTFILE

變量命名法則:

1,不能使用程序中的關(guān)鍵字或保留字:if ,for 等等
2,只能使用數(shù)字,字面及下劃線,且不能以數(shù)字開頭;
3,盡量做到見名知義,

  • 只讀變量:
  • readonly name
  • declare -r name

位置變量

  • 位置變量主要在腳本代碼中調(diào)用通過命令行傳遞給腳本的參數(shù)
  • $1,$2......對(duì)應(yīng)調(diào)用第1.第2等參數(shù):$0命令本身:shift[n]
  • $*:傳遞給腳本的所有參數(shù)當(dāng)做一個(gè)字符串
  • $@:傳遞給腳本的所有參數(shù)每一個(gè)參數(shù)當(dāng)做一個(gè)獨(dú)立的字符串
  • $#:傳遞給腳本的參數(shù)的個(gè)數(shù):
元字符 定義
^ 行首
$ 行尾
. 任意單一字符
[ ] [ ]范圍內(nèi)的任意單一字符
[^ ] 除[ ^] 內(nèi)的任意單一字符
* *前面字符重復(fù)不確定次數(shù)
+ +前面字符重復(fù)一次以上不確定次數(shù)
? ?前面字符重復(fù)0或1次
\ 轉(zhuǎn)義符
.* 任意長度字符
{ n} 前面字符重復(fù)n次
{n,} 前面字符重復(fù)n次以上
元字符 定義
[:alnum:] 字母和數(shù)字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母
[:upper:] 大寫字母
[:blank:] 水平空白字符(空格和制表符)
[:space:] 所有水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...)
[:digit:] 十進(jìn)制數(shù)字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標(biāo)點(diǎn)符號(hào)
[:xdigit:] 十六進(jìn)制數(shù)字
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 概念 正則表達(dá)式,又稱正規(guī)表示式、正規(guī)表示法、正規(guī)表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法(英語:Regular Expre...
    dxldeng閱讀 2,551評(píng)論 0 2
  • Linux文件處理三劍客 grep : 文本過濾工具支持基礎(chǔ)正則表達(dá)式-E 支持?jǐn)U展正則表達(dá)式-F 支持快遞過濾(...
    魏鎮(zhèn)坪閱讀 703評(píng)論 0 1
  • 初衷:看了很多視頻、文章,最后卻通通忘記了,別人的知識(shí)依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,071評(píng)論 0 20
  • 我一直相信,現(xiàn)在的你做了些什么,總會(huì)在未來的某個(gè)時(shí)候得到應(yīng)證。記得一個(gè)學(xué)姐對(duì)我講了這樣一句話:現(xiàn)在你付出了多少...
    小滿吶閱讀 206評(píng)論 0 0
  • 從注會(huì)考試結(jié)束每天都在看書,或一個(gè)小時(shí),或兩個(gè)小時(shí)。今年報(bào)了會(huì)計(jì)財(cái)管兩本,因?yàn)檗r(nóng)行考試只去考了財(cái)管。財(cái)管今年考的真...
    Lolaliu閱讀 218評(píng)論 0 0