Linux雜記4

junwind發表於2021-03-02
grep , egrep , fgrep 
    根據pattern,搜尋文字,將符合pattern的文字行顯示出來
    pattern:由文字字元,正規表示式的元字元,組合而成的匹配條件

    grep [option] pattern [file...]

    /etc/passwd中包含了字串root的行?   grep 'root' /etc/passwd

    -i 忽略大小寫
    --color   預設已設定別名中 
    -v  沒有被模式匹配到的行    grep -v 'root' /etc/passwd
    -o  只顯示被模式匹配到的字串本身,每個一行


元字元
    .   匹配任意單個字元
        /etc/passwd中r開頭,t結尾,中間跟了任意兩個字元?   grep 'r..t' /etc/passwd 

    *    匹配其前面的字元任意次
        問題:a, b, ab , aab , acb , adb , amnb,amnbmnbmnb字串中,a*b 能匹配到哪些?
            b, ab, aab 

        a.*b 能匹配到  ab,aab,acb,adb,amnb,amnbmnbmnb

    .*   任意長度的任意字元

    注意 :預設情況下,正則工作在貪婪模式下,儘可能長的匹配
    [root@localhost tmp]# grep 'a*b' grep.test.1 
            b
            ab
            aab
            acb
            adb
            amnb
            amnbmnbmnb

    ? 匹配其前面的字元1次,或0次,使用時,一般要加反斜線轉義  
        [root@localhost tmp]# grep 'a\?b' grep.test.1 
            b
            ab
            aab
            acb
            adb
            amnb
            amnbmnbmnb
            注意:grep是在每行中部分匹配,而不是直接匹配一行的全部,所以只要一行中有部分匹配的也算

    \{m,n\}   匹配其前面的字元,至少m次,至多n次
        \{1,\}    最少一次
        \{0,3\}    最多3次

        grep 'a\{1,3\}b' ./grep.test.1 
        grep 'a.\{1,3\}b' grep.test.1 
        a.\{1,3\}b    ab中間跟1個或2個或3個任意字元

問題:查詢/etc/passwd中,rt中間跟任意兩個字元,並且出現在行首的???
    這裡要用到位置錨定
    ^  錨定行首   此字元後面的任意內容必須出現在行首
        grep '^r..t' /etc/passwd

    $   錨定行尾   此字元前面的任意內容必須出現在行尾
        grep 'w$' /etc/inittab   以w結束的行

    grep 'b..h$' /etc/passwd

    ^$  空白行
        grep '^$' /etc/inittab | wc -l


[ ] : 匹配指定範圍內的任意單個字元
[^] :匹配指定範圍外的任意單個字元

字符集合:真正使用,還得使用一個方括號括起來
    [:digit:]
    [:lower:]
    [:upper:]
    [:punct:]
    [:space:]
    [:alpha:]
    [:alnum:]

問題:匹配/etc/inittab中,以一個數字結尾的行?
    grep '[[0-9]]$' /etc/inittab
    grep '[[:digit:]]$' /etc/inittab

問題:以一個空白字元,後面跟數字結尾的行?
    [root@localhost tmp]# grep '[[:space:]][[:digit:]]$' /etc/inittab 
    l0:0:wait:/etc/rc.d/rc 0
    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    注意:前面有多個空格也是可以匹配到的,因為只要有一個空格+數字結尾就行


錨定詞首詞尾:
    \< 或 \b: 其後面得任意字元必須作為單詞首部出現
    \> 或 \b: 其前面得任意字元必須作為單詞得尾部出現
    注意:特殊字元,標點符號不算
    \<root\>  僅這個單詞

    [root@localhost tmp]# grep "root\>" test2    以root作為詞尾出現得
    this is root.
    The user is mroot.
    chroot is a command.

    grep "\<root" test2 

    精確匹配一個單詞    
    [root@localhost tmp]# grep "\<root\>" test2 
    this is root.


分組: \( \)
    ab* : a後面跟任意個b
    \(ab\)* : 把ab當作一個整體,ab可以出現0次,1次,任意次

    [root@localhost tmp]# grep "\(ab\)*" grep.test.1 
        a
        b
        ab
        aab
        acb
        adb
        amnb
        amnbmnbmnb
        因為沒有ab也可以

    分組的主要作用:被前面小括號括起來的內容,後面可以使用一個字元再次引用它

he love his lover.
she like her lover.
she like her liker.
she love her liker.
she like him.
查詢l開頭,中間跟任意兩個字元,e結尾,並且還得找到這個行中,和前面l..e找到同樣字串的,並且多了一個r結尾的字串?
注意:要求是一行中,前面找到和後面找的得一致,只是多了一個r
    grep 'l..e' test3.file
    grep 'l..e.*l..e' test3.file

    \1  引用第一個左括號以及與之對應的右括號所包括的所有內容
    \2
    \3

    grep "\(l..e\).*\1" test3.file

問題:查詢/etc/inittab中,行中出現了任意一個數字,行尾又以這個相同數字結尾的?
    grep '\([0-9]\).*\1$' /etc/inittab

1、顯示/proc/meminfo檔案中以不區分大小的s開頭的行;
    grep -i '^s' /proc/meminfo
    grep '^[sS]' /proc/meminfo

2、顯示/etc/passwd中以nologin結尾的行; 
    grep 'nologin$' /etc/passwd

    取出預設shell為/sbin/nologin的使用者列表
        grep "nologin$' /etc/passwd | cut -d: -f1

    取出預設shell為bash,且其使用者ID號最小的使用者的使用者名稱
        grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1

3、顯示/etc/inittab中以#開頭,且後面跟一個或多個空白字元,而後又跟了任意非空白字元的行;
    grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

4、顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行;
    grep ':[0-9]:' /etc/inittab

5、顯示/boot/grub/grub.conf檔案中以一個或多個空白字元開頭的行;
    grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf

6、顯示/etc/inittab檔案中以一個數字開頭並以一個與開頭數字相同的數字結尾的行;
    grep '^\([0-9]\).*\1$' /etc/inittab

7、找出某檔案中的,1位數,或2位數;
    grep '[0-9]\{1,2\}' /proc/cpuinfo
    grep --color '\<[0-9]\{1,2\}\>' /proc/cpuinfo

8、找出ifconfig命令結果中的1-255之間的整數;


9、查詢當前系統上名字為student(必須出現在行首)的使用者的帳號的相關資訊, 檔案為/etc/passwd
    grep '^student\>' /etc/passwd | cut -d: -f3
    id -u student

    student1
    student2


10:分析/etc/inittab檔案中如下文字中前兩行的特徵(每一行中出現在數字必須相同),請寫出可以精確找到類似兩行的模式:
    l1:1:wait:/etc/rc.d/rc 1
    l3:3:wait:/etc/rc.d/rc 3

    grep '^l\([0-9]\):\1.*\1$' /etc/inittab
本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風