<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

    4、echo一個路徑給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}'



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


    網站導航:
     
    主站蜘蛛池模板: 国产精品亚洲四区在线观看| 99在线精品免费视频九九视| 亚洲一本一道一区二区三区| 亚洲AV无码国产精品色午友在线 | 国产亚洲精品国看不卡| 人禽杂交18禁网站免费| 亚洲免费在线播放| 国产特黄特色的大片观看免费视频| 亚洲欧美成人综合久久久| 亚洲大香人伊一本线| 亚洲国产成人私人影院| 丝袜熟女国偷自产中文字幕亚洲| 又爽又高潮的BB视频免费看| 在线不卡免费视频| 免费可以在线看A∨网站| 在线观看永久免费| 99热免费在线观看| 人人玩人人添人人澡免费| 中文字幕视频在线免费观看| 一区二区三区在线免费| 日韩大片免费观看视频播放| 久久精品国产亚洲AV电影网| 亚洲男同gay片| 亚洲经典千人经典日产| 亚洲精品无码久久久久牙蜜区| xxx毛茸茸的亚洲| 亚洲国产成人精品青青草原| 亚洲二区在线视频| 亚洲免费视频观看| 日韩亚洲不卡在线视频中文字幕在线观看| 亚洲成人免费在线观看| 亚洲国产成人va在线观看网址| 亚洲精品午夜在线观看| 亚洲天堂一区二区三区四区| 亚洲另类春色校园小说| 亚洲熟妇AV日韩熟妇在线| 亚洲av无码专区在线电影天堂| 亚洲精品无码久久久久APP| 国产亚洲精品精品精品| 草久免费在线观看网站| 久久国产精品免费|