grep正則表達式及sort、diff等相關命令

Linux文本處理三劍客:

grep:文本過濾工具(模式:patter)

sed:stream editor 流編輯器,文本編輯工具

awk:linux上的實現gawk,文本報告生成器(格式化文本)

* 正則表達式:Regular Expression,REGEXP,由一類特殊字符及文本字符所編寫的模式,其中有些字符其不表達字面意義,而是用于表示控制或者通配的功能;

* 分類: 基本正則表達式:BRE;擴展正則表達式:ERE

* 元字符:\(hello[[:space:]]\+\)\+ 匹配模式

grep :Global search REgular expression and Print out the line.

作用:文本搜索工具,根據用戶指定的"模式(過濾條件)" 對目標文件逐行進行匹配檢查,打印匹配到的行

模式:由正則表達式的元字符及文本字符所編寫的過濾條件
  • 正則表達式引擎:

    grep:支持正則表達式,-E:支持擴展表達式
    egrep:擴展正則表達式,-G支持正則表達式

  • grep [OPTIONS] PATTERN [FILE…]

  • grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

  •    -i:ignorecase 忽略字符大小寫
       -o:僅顯示匹配的字符的字符
       -v:反向顯示不匹配的信息
       -E:支持使用擴展的正則表達式元字符
       -q: --quite 安靜不輸出信息,通過echo $?獲取是否匹配,即執行是否成功
       -A #:輸出匹配的后#行數,與-B相反
       -C #:前后指定#行數, -A,-B,-C,上下文之意
  • 基本正則表達式元字符:

    字符匹配
        .:匹配任意單個字符 eg:grep “r..t" /etc/passwd
        []:匹配指定范圍內的任意單個字符
        [^]:匹配指定范圍外的任意單個字符
        [:lower:],[:upper:],[:digit:],[:alpha:],[:alnum:]
    
    匹配次數:用于要指定其出現次數的字符后面,用于限制其前面字符出現的次數
        *: 匹配其前面的字符任意次:0,1,多次;
         eg:grep "x*y"  abxy,aby,yab,xxxy
        .*:匹配任意長度的任意字符
           eg: grep "r.*" /etc/passwd ,貪吃蛇模式
        \?:匹配其前面的字符出現0,1;即前面的字符可有可無
        \+:匹配其前面的字符至少1次,或多次
        \{m\}:匹配前面的字符m次
        \{m,n\}:匹配前面的字符至少m,至多出現n次
        \{0,n\}:匹配前面的字符至多n
        \{m,\}:匹配前面的字符至少m
    
    位置錨定
        ^: 行首錨定;用于模式的最左側
        $: 行尾錨定;用于模式的最右側
          eg:^PATTERN$ 匹配正行
               ^$:空白行;
             ^[[:space:]]*$: 空白或包含空白的字符的行
             單詞錨定:非特殊字符組成的 連續字符都稱為單詞
             \<或者 \b;詞首 \>,\b:詞尾 \<PATTERN\> 精確錨定單詞

  • 位置錨定
        ^: 行首錨定;用于模式的最左側
        $: 行尾錨定;用于模式的最右側
          eg:^PATTERN$ 匹配正行
               ^$:空白行;
             ^[[:space:]]*$: 空白或包含空白的字符的行
             單詞錨定:非特殊字符組成的 連續字符都稱為單詞
             \<或者 \b;詞首 \>,\b:詞尾 \<PATTERN\> 精確錨定單詞
  • 練習:

  • 1,顯示/etc/passwd文件中不以/bin/bash結束的行

  • ~]#grep -v "/bin/bash" /etc/passwd
  • 2,找出/etc/passwd文件中兩位數或者三位數

  • ~]#grep "\\<[0-9]\\{2,3\\}\\>" /etc/passwd ~]#grep "LISTEN*$"   ;以LISTEN結束的行,后面可有可無的字符 ~]#grep -E "\\<[0-9]{2,3}\\>" /etc/passwd ;或者 egrep "\\<[0-9]{2,3}\\>" 這是擴展正則表達式
  • 3,找出”netstat -tan“ 命令結果中以‘LISTEN'后跟0,1,多個空白字符的行

  • ~]#grep "^[[:space:]]\\+"  ;以空格字符為行首,至少出現一次 ~]#grep "LISTEN*$"   ;以LISTEN結束的行,后面可有可無的字符

egrep:擴展正則表達式(grep -E)

    egrep     [OPTIONS] PATTERN [FILE....]
    -i,-o,-v,-q,-A,-B,-C
    -G:支持基本正則表達式
    擴展正則表達式的元字符
    字符匹配:
        .:匹配任意單個字符 eg:grep “r..t" /etc/passwd
        []:匹配指定范圍內的任意單個字符
        [^]:匹配指定范圍外的任意單個字符
    次數匹配
        *:任意次,0,1,...
        ?:0,或者1次
        +:至少1次
        {m}:m次
        {m,n}:至少m次,至多n次
        {0,n}:至少0次,至多n次
        {m,}:,至少m次

    位置錨定
        ^:行首錨定
        $:行尾錨定
        \<,\b, 詞首錨定
        \>,\b ,詞尾錨定
    分組及引用
        ():分組,括號中匹配到的內容被表達式引擎記錄于內部的變量中:后向引用,\1,\2,\3,...
        a|b:a或B
         (c|C)at:cat或Cat

練習:

1,找出/proc/meminfo文件中,所有在大寫或者小寫s開頭的行,至少兩種方式:

~]#grep -E "^(s|S)"  /proc/meminfo ~]#grep "^[sS]" /proc/meminfo ~]#grep -i "^s" /proc/meminfo ; -i不區分大小寫 ~]#grep "^\\(s\\|S\\)" /proc/meminfo ; 基本正則表達式必須加轉移字符

2,顯示當前系統上root、centos或testbash用戶的相關信息

~]#grep -E "^(root|centos|testbash)\\>" /etc/passwd ; 直接錨定詞尾 ~]#grep "^(root\\|centos\\|testbash)\\>" /etc/passwd ; 直接錨定詞尾

3,找出/etc/rc.d/init.d/functions文件中某單詞后面 跟一個小括號的行

~]#grep -E "[_[:alnum:]]+\\(\\)" /etc/rc.d/init.d/functions ; 找出所有的函數了,[_[:alnum:]]+\\(\\) 這就是函數名的匹配模式元字符

4,使用echo命令輸出一絕對路徑,使用egrep取出基名

~]# echo /etc/rc.d/init.d/  | egrep -o "[^/]+/?$" ; 相當于basename

5,找出ifconfig命令結果之中1-255之間的數值

~]#egrep --color=auto "\\<[1-2][0-9][0-5]\\>"

6,找出ifconfig命令結果中的ip地址

~]#egrep "[1-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}" ;ip地址,第一個字節應該不能為0吧

7,添加用戶bash,testbash,basher以及nologin(shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行

~]#egrep "^([[:alpha:]]+\\>).*\\1$" /etc/passwd ; 這個只是利用字母表的表,下個這個更為準確 ~]#egrep "^([^:]+\\>).*\\1$"  /etc/passwd  ; 利用這個文件分隔符的特性,就行分割單詞

fgrep:不支持正則表達式元字符:主要遇到大文件時,這個命令性能會更好

wc 命令

-l :行數
-w:單詞數
-c:字節數

cut命令

-d:指定符號為分割符-d: 以冒號分隔符,只能單個分隔符
-f:需要顯示的域 (-f#;-f#-#;-f#,#)
~]# cut -d':' -f1,6-7 /etc/passwd

sort命令 ;默認是第一個字符進行排序

-t CHAR: 指定分隔符
-k #:用于排序比較的字段
-n:基于數值大小排序
-r: 逆序排序
-f:忽略字符大小寫
-u: 重復的行只保留一份
~]#    sort -t':' -k 3 -n /etc/passwd

uniq命令,報告或去掉重復的行

-u:只顯示沒有重復的行
-c:顯示每行重復的數
-d:僅顯示重復過的行
~]# cut -d':' -f 7 /etc/passwd | sort -u | wc -l  ; 統計有多少shell ~]# cut -d':' -f 7 /etc/passwd | sort | uniq -c  ; 統計各行重復的次數

注意:uniq是結合sort使用的,直接使用uniq,如果兩個相同行不在一起,則是不能排除的,所以只有排序過后才能用uniq去掉重復行(也相當于-u參數)

diff命令:逐行比較文件的

-u 使用unfiled 機制,即系那是要修改行的上下文,

patch 打補丁

可以結合diff命令使用,新舊文件的不同之處統計統計出來

~]# diff passwd passwd.new  >passwd.patch  ; 對比兩個文件的不同之處放入補丁包文件 ~]# patch -i passwd.patch passwd  ; 向舊文件打入補丁包文件內容 ~]# patch -R -i passwd.patch passwd ; 撤回已打入的補丁內容

1,取出eth0中的ip地址

ifconfig eth0 | grep -Ei "inet addr" | cut -d':' -f 2 | cut -d' ' -f1

還有join,tr,col,paste expand等相關命令

testInet

原創文章,作者:不忘初衷,如若轉載,請注明出處:http://www.www58058.com/65245

(0)
不忘初衷不忘初衷
上一篇 2016-12-29
下一篇 2016-12-29

相關推薦

  • Linux學習總結02—Linux的操作系統發展史(原創)

       我們都知道,在美國賓夕法尼亞大學,有那么一種計算機,叫ENIAC,這種機器耗電量是非常大,而且主機也是龐大,它誕生于1946年的2月14日的情人節,確實有紀念意義,就算是約炮也是拿著智能手機先搖一搖,好看就勾搭,不好看的就拉黑,這臺計算機可并不是造福人類的,只是計算數據,我想,當時的情況是這樣,在這臺計算機沒有出世之前,那幫工程師們…

    Linux干貨 2016-10-29
  • 推薦-LVS專題: LVS的工作模型和調度算法介紹

    LVS專題: LVS的工作模型和調度算法介紹 LVS專題: LVS的工作模型和調度算法介紹 前言 什么是負載均衡? 什么是LVS? LVS的架構: LVS的實現模型: NAT實現原理: DR實現原理: TUN實現原理: FULLNAT實現原理: LVS的調度算法 靜態調度算法(4種) 動態調度算法(6種): 總結 前言 本文大概介紹一下LVS的工作方式和實現…

    Linux干貨 2016-04-05
  • 馬哥教育網絡班22期+第9周課程練習

    week9: 1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin); 分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # SHELL1="/sbin/nologin" declare -i sum1=sum2=0 for&nb…

    Linux干貨 2016-10-17
  • 學習標準I/O和管道的心得體會

    重定向、標準輸出、標準輸入、標準錯誤、管道的命令整理

    2017-11-20
  • grep,find等相關命令

    Q1:顯示當前系統上root、fedora或user1用戶的默認shell; ~]# grep -E "^root|^fedora|^user1" /etc/passwd | awk -F: '{print $1,$NF}' ro…

    Linux干貨 2016-11-27
欧美性久久久久