<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 68, comments - 19, trackbacks - 0, articles - 1

    正則表達式與三劍客的使用技巧

    Posted on 2018-09-18 08:50 viery 閱讀(148) 評論(0)  編輯  收藏

    1.正則表達式的基礎


    ^               ^錨定行的開始如:/^sed/匹配所有以sed開頭的行

    $               $錨定行的結束 如:/sed$/匹配所有以sed結尾的行

    .                .匹配一個非換行符的字符 如:/s.d/匹配s后接一個任意字符,然后是d

    ?               代表前趨字符的一次出現

    *               *匹配零或多個字符 如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行

    []              匹配指定范圍內的任意單個字符,如/[Ss]ed/匹配sed和Sed

    [^]             匹配指定范圍外的任意單個字符

                     如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行

    /<               錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行

    />               錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行

    /( /)            引用標識,可以多次引用,并在后面以/1 /2來引用

    x/{m,n/}     代表x的至少m次,至多n次出現

    |                 用于使用多個正則條件,匹配之一即可

    +                與. *類似,表示1個或多個重復字符

    ()               用于將多個內容組成單元組

    \(..\)        保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers

    &               保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**

    x\{m\}        重復字符x,m次,如:/0\{5\}/匹配包含5個o的行

    x\{m,\}       重復字符x,至少m次,如:/o\{5,\}/匹配至少有5個o的行

    x\{m,n\}     重復字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10個o的行

    2.grep

    作用:文本搜索工具,根據用戶指定的"模式(過濾條件)"對目標文本逐行進行匹配檢查;打印匹配的行
    模式:有正則表達式的元字符及文本字符所編寫的過濾條件

    正則表達式引擎
    grep [OPTIONS] [PATTERN] [FILE...] 
    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]


    常用選項:

    --color=auto           對匹配到的文本著色后高亮顯示

    -E                         使用正則擴展

    -e pattern               使用pattern中的正則

    -f  file                   使用文件中的正則

    -i                          忽略大小寫(性能較差,最好先用tr統一轉換成大寫或小寫)

    -o                         僅顯示匹配到字符串本身;

    -v                         反向顯示不匹配的行

    -V                        顯示版本號


    輸出控制選項:

    -n                         輸出行號

    -q                         不顯示未匹配的內容

    -r                         遞歸方式掃描文件

    -l                         只輸出匹配的文件名

    -L                        只輸出不匹配的文件名

    -c                         只顯示匹配的個數

    -A                       匹配的到后面幾行也顯示出來
    -B                       匹配的到前面幾行也顯示出來
    -C                        上下文,匹配的到前后面幾行也顯示出來


    匹配次數:用在要指定其出現的次數的字符的后面,用戶限制其前面字符出現的次數

    :                       匹配器前面的字符任意次:0,1,多次

                              例如:grep "xy",abxy aby xxxy yab

    .*                        匹配任意長度的任意字符,貪婪模式,能匹配多長就匹配多長
    \?                       匹配其前面的字符0次或者1次;即其前面的字符可有可無的
    +                       匹配其前面的字符一次或多次;即其前面的字符出現至少1次
    {m}                    匹配其前面的字符m次
    {m,n}                 匹配其前面的字符至少m次,至多n次
    {0,n}                  至多n次

    {m,}                   至少m次


    位置錨定:

    ^                        行首錨定;用于模式的最左側
    $                        行尾錨定;用于模式的最右側
    ^PATTERN$       用PATTERN來匹配整行
    ^$                      空白行
    ^[[:space:]]*$      空行或包含空白字符的行


    單詞:              非特殊字符組成的連續字符(字符串)都為單詞
    \< 或 \b              詞首錨定,用于單詞模式的左側,例如:grep "\<word"
    > 或 \b               詞尾錨定,用于單詞模式的右側,例如:grep "word>"
    \<PATTERN>     匹配完整單詞

    分組及引用:
    ()                       將一個或多個字符捆綁在一起,當作一個整體進行處理,例如:(xy)*ab
    Note                   分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄到內部的變量中,這些變量為:
                       \1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
                       \2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
                       \3:后向引用,引用前面的分組括號中的模式所匹配到的字符


    常用示例:

    1、顯示/etc/passwd文件中不以/bin/bash結尾的行
         grep -v "/bin/bash$" /etc/passwd


    2、找出/etc/passwd文件中的兩位數或三位數
         grep "\<[[:digit:]]{2,3}>" /etc/passwd


    3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且后面非空白字符的行
         grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg


    4、找出"netstat -tan"命令的結果中以"LISTEN"后跟0、1或多個空白字符結尾的行
         netstat -tan|grep "LISTEN[[:space:]]*$"


    5、grep "(l..e).*\1" lovers.txt

         He loves his lover.
         He likes his lover.
         She likes her liker.
         She loves her liker.

    6、grep -i 'root' /etc/passwd                              不區分大小寫顯示文件中有root的行

    7、grep -v '^root'  /etc/passwd                          顯示文件中開關不是root和行

    8、grep -n 'root'  /etc/passwd                            顯示文件中含有root的行,且打印此行在文件中的行號

    9、grep -lr '$root'  /etc                                     遞歸查找/etc下包含行結尾為root的文件名

    10、grep -Lr 'root'  /etc                                    遞歸查找/etc下文件中不包含root的文件名

    11、grep -c 'root'  /etc/passwd                           統計文件中root出現的行數

    12、grep "hello | world"  1.cpp                         匹配包含hello的行和world的行


             egrep命令:支持擴展正則表達式實現類似于grep文本過濾功能:grep -E
    正則表達式引擎egrep [OPTINS] PATTERN [FILE]
                      選項:與grep選項相似
                    -G:支持基本正則表達式

    擴展正則表達式的元字符:
    字符匹配:
    .              匹配任意單個字符
    []             匹配指定范圍內的任意單個字符
    [^]           匹配指定范圍外的任意單個字符


    次數匹配:
               匹配器前面的字符任意次:0,1,多次

    .:           匹配任意長度的任意字符,貪婪模式,能匹配多長就匹配多長
    ?              匹配其前面的字符0次或者1次;即其前面的字符可有可無的
    +             匹配其前面的字符一次或多次;即其前面的字符出現至少1次
    {m}         匹配其前面的字符m次
    {m,n}      匹配其前面的字符至少m次,至多n次
    {0,n}       至多n次
    {m,}        至少m次

    位置錨定:
    ^             行首錨定;用于模式的最左側
    $             行尾錨定;用于模式的最右側
    \<或\b      詞首錨定,用于單詞模式的錨定
    >或\b       詞尾錨定,用于單詞模式的錨定


    分組及引用:
    ()                    分組;括號內模式匹配到的字符會被記錄到正則表達式引擎的內部變量中


    后向引用:\1,\2....或:
    a|b                  a或b
    C|cat               C或cat
    (c|C)at            cat或Cat


    常用示例:


    1、找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行;至少有三種實現方式
         grep "^[sS]" /proc/meminfo 
         grep -i "^sS" /proc/meminfo 
         grep -E "^(s|S)" /proc/meminfo 
         grep -E "^s|^S" /proc/meminfo

    2、顯示當前系統上root、centos或者user1用戶的相關信息
        grep -E "^(root|centos|user1>)" /etc/passwd


    3、找出/etc/rc.d/init.d/functions文件中某單詞后跟一個小括號的行
        grep -Eo '_[[:alnum:]]+()' /etc/rc.d/init.d/functions 


    4、使用echo命令輸出一絕對路徑,使用egrep取出基名
         echo "/root/ssf/erou/dfjl" | egrep -o "\<[[:alpha:]]>$" echo "/root/ssf/erou/dfjl" | grep -Eo "[^/]+/?$"


    5、找出ifconfig命令結果中的1-255之間的數值
         ifconfig | grep -oE "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"


    6、添加用戶bash, testbash, basher以及nologin(其shell為/sbin/nologin)

         而后找出/etc/passwd文件中用戶名同shell名的行
        grep -E "^([^:]+>).
    \1$" /etc/passwd


    3.sed

    sed命令行格式為:sed [-nefri]  ‘command’  輸入文本/文件        

    常用選項:

    -f               指定過濾腳本文件名

    -e               后跟匹配表達式

    -n               不顯示默認輸出

    -r                sed 的動作支援的是延伸型正則表達式的語法
    -i                直接修改讀取的文件內容,而不是由屏幕輸出
          
                 

    常用命令:

    a ∶ 新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)
    c ∶ 取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行
    d ∶ 刪除,因為是刪除,所以 d 后面通常不接任何內容
     i ∶ 插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行)
     p∶ 列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起用
     s∶ 取代,可以直接進行替換的工作。通常這個 s 的動作可以搭配正則表達式。例如 1,20s/old/new/g

    sed腳本上的命令:

    sed '/root/a/text'   /etc/passwd                              在文件的root那一行后增加新行text

    sed '/root/c/text'    /etc/passwd                             在文件的root那一行替換為text

    sed '/root/i/text'     /etc/passwd                            在匹配行前插入text

    sed '/root/d'           /etc/passwd                            刪除文件中含有root的那一行

    h/H                                                                  復制或附加模式緩沖區到一個buffer

    g/G                                                                  從buffer中取出并復制或附加到當前模式緩沖區

    sed -e '/root/{h;d;}' -e '$g' /etc/passwd                 將root行放在最后一行

    p                                                                     打印行

    sed -n '/root/{n;p;}' /etc/passwd                          打印root行的下一行

    sed '1,3y/abcdef/ABCDEF/'   /etc/passwd            映射1-3行的小寫為大寫

    s/xxx/yyy/g                                                      文本替換


    sed定址:

    sed -n '1,3p' /etc/passwd                                    打印文件1-3行

    sed -n  '/root/,/sshd/p'  /etc/passwd                      打印文件root行與sshd行之間的行

    sed -n '5,/^northeast/p'  file


    實例分享:

    wKioL1kP57zDvyNyAABVD95qqn0851.png-wh_50

    wKiom1kP6G2jcbg9AABVOIyE5Xg901.png-wh_50

    wKiom1kP6CSDP1ZpAABmX-u77CE466.png-wh_50

    wKioL1kP6LCi0ggQAABNOdJz-_k135.png-wh_50

    wKioL1kP6N3BUfmgAABjaNEJhto597.png-wh_50

    wKioL1kP6RPxDQ83AAAuexeyzdg425.png-wh_50


    1、復制/etc/inittab文件至/tmp/目錄,替換/tmp/inittab文件中的"id:3:initdefault"一行數字為5

    # cp /etc/inittab /tmp/# sed's/id:3:initdefault/id:5:initdefault/' /tmp/inittab

    2、復制/etc/rc.d/init.d/functions文件至/tmp目錄,刪除/tmp/functions文件的空白行

    # cp /etc/rc.d/init.d/functions/tmp/# sed '/^[[:space:]]*$/d'/tmp/functions

    3、復制/boot/grub/grub.conf文件至/tmp/目錄,刪除/tmp/grub.conf文件中行首的空白字符

    # cp /boot/grub/grub.conf /tmp/# sed 's@^[[:space:]]\+@@'/tmp/grub.conf

    4echo一個路徑給sed,通過sed取出其路徑名

    例如echo"etc/sysconfig/network-scripts/" | sed,返回路徑名/etc/sysconfig/

    # echo"/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'


    4.awk

    awk命令主要用于文本內容的分析處理

    如果對處理的數據需要生成報告之類的信息,或者處理的數據是按列進行處理的,最好使用awk

    awk讀入有’\n’換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域

    $0則表示所有域,$1表示第一個域,$n表示第n個域


    awk是一個報告生成工具,旨在把文件中讀取到的每一行的每個字段分別進行格式化

    而后進行顯示,awk支持使用變量、條件判斷、循環、數組


    比如說,以”:”分隔filename文本的每一行并且打印第一列

    awk -F ':' '{print $1}' filename

    通用格式:gawk 'pattern {action}'  file

                      cmd | gawk 'pattern {action}'

    工作原理:awk 掃描一行,放入變量$0中,然后行被分隔成各個域

    以指定的分隔符進行分離,默認為空格,可以通過參數FS指定。各個域都存于變量$i中,至多100個域

       sed和awk定制化顯示舉例

    這里,我們可以制作一個文本my.txt,內容為:

    This is my cat, my cat's name is betty
    This is my dog, my dog's name is frank
    This is my fish, my fish's name is george
    This is my goat, my goat's name is adam

    需要顯示的結果為:

    cat:betty
    dog:frank
    fish:george
    goat:adam    

    如果采用sed,可以輸入

    sed 's/This is my \(.*\),.*is \(.*\)/\1:\2/g' my.txt

    wKioL1kP677wYGU4AAAWCgc4hUM043.png-wh_50

    如果采用awk,則有兩種方法

    awk -F '[ ,]' '{print $4,$10}' OFS=":" my.txt 
    awk -F '[ ,]' '{printf("%s:%s\n",$4,$10)}' my.txt

    wKiom1kP7Aizyx_FAAAtCga4DzM272.png-wh_50


    1.顯示GID小于500的組
       awk -F : '$3<500{print $1}' /etc/group


    2.顯示默認的shell為nologin的用戶
       awk -F : '$7~/nologin$/{print $1}' /etc/passwd


    3.顯示eth0網卡文件的配置信息,注意,只顯示等號后面的值
       awk -F = '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0


    4.顯示/etc/sysctl。conf文件中定義的內核參數:只顯示名稱
       awk -F =' !/^#|^$/{print $1}'/etc/sysctl.conf


    5.顯示eth0網卡的ip地址,通過ifconfig命令結果進行過濾
       ifconfig eth0 |awk '/inet addr/{print $2}' |awk -F : '{print $2}'



    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲人JIZZ日本人| 成人黄动漫画免费网站视频 | 亚洲国产人成网站在线电影动漫 | 国产成人高清精品免费软件| 免费国产黄线在线观看| 在线观看免费人成视频| 成人在线免费观看| 日韩免费高清一级毛片在线| 日本高清免费网站| 免费国产在线观看不卡| 亚洲精品A在线观看| 亚洲精品无码Av人在线观看国产| 亚洲精品无码AV人在线播放| 亚洲视频在线播放| 亚洲天堂一区在线| 亚洲国产精品美女久久久久| 在线91精品亚洲网站精品成人| 欧亚一级毛片免费看| 国产精品高清免费网站| 嫩草成人永久免费观看| aⅴ在线免费观看| 国内自产拍自a免费毛片| 免费中文字幕在线观看| 亚洲一级黄色视频| 亚洲AV本道一区二区三区四区| 亚洲毛片基地日韩毛片基地| 亚洲狠狠成人综合网| 免费国产黄网站在线观看动图| 中文字幕在线观看免费| 最近中文字幕高清免费中文字幕mv | 亚洲精品第一综合99久久| 久久久久亚洲精品无码网址色欲| 色吊丝性永久免费看码| 久久久精品免费国产四虎| 114一级毛片免费| 国产成人免费手机在线观看视频 | 亚洲av最新在线网址| 亚洲一区二区久久| 免费无码AV一区二区| 久久aa毛片免费播放嗯啊| 成年女人免费视频播放77777|