1. 程式人生 > >三劍客之——grep

三劍客之——grep

升序 自動 oba per /usr 單個 行動 document cat

簡介:

  grep(global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。

命令格式:  

  grep [OPTIONS] ‘word‘ filename

常用選項 :

-A:<顯示列數> 除了顯示符合範本樣式的那一行外,並顯示該行之後的內容。例如:-A2指輸出符合要求的行和之後的兩行
-B:<顯示列數> 除了顯示符合範本樣式的那一行外,並顯示該行之前的內容。例如:-A2指輸出符合要求的行和之前的兩行
-c:表示打印符合要求的行數
--color: 指定顏色.--color=auto 自動高亮顯示匹配到的字符
-C:<顯示列數n>除了顯示符合範文樣式的那一行外,並顯示該行前後n行內容。例如:-C2指輸出符合要求的行和上下各兩行
-d:<進行動作>當指定的查找的為目錄而非文件時用此選項
-e:<範文樣式>指定字符串作為查找文件內容的範本樣式
-E:支持擴展
-i:表示忽略大小寫
-n:表示查找到關鍵字的行並打印行號
-o:只查找文件中匹配到的部分
-v:反轉查找


實例學習:

1.過濾出/etc/passwd文件中abm用戶上下兩行

# grep -C2 --color=auto abm /etc/passwd               //註意,這裏我abm下面兩行只打印了一行是因為之下只剩一行
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin
abm:x:1000:1000:abm:/home/abm:/bin/bash
virftp:x:1001:1001::/home/virftp:/sbin/nologin

2.較復雜的選項-d實例,假設要在‘/usr/src/linux/Doc’目錄下搜索帶字符串‘magic’的文件

$ grep magic /usr/src/Linux/Doc/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件’sysrp.txt’包含該字符串,討論的是 SysRQ 的功能。
默認情況下,’grep’只搜索當前目錄。如果 此目錄下有許多子目錄,’grep’會以如下形式列出:
grep: sound: Is a directory
這可能會使’grep’ 的輸出難於閱讀。這裏有兩種解決的辦法:
grep -r
grep -d skip 都可忽略子目錄: 如果有很多 輸出時,您可以通過管道將其轉到’less’上閱讀: $ grep magic /usr/src/Linux/Documentation/* | less 這樣,您就可以更方便地閱讀。

3.選項-e制動多個匹配樣式:

#echo this is a text line | grep -e "is" -e "line" -o
is
line
                   //也可以使用-f選項來匹配多個樣式,在樣式文件中逐行寫出需要匹配的字符。 
cat patfile
aaa 
bbb 
#echo aaa bbb ccc ddd eee | grep -f patfile -o        

4.-E擴展的grep表達式

[root@localhost ~]# grep abm|root passwd           //無輸出
[root@localhost ~]# grep -E abm|root passwd     //可以輸出
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
abm:x:1000:1000:abm:/home/abm:/bin/bash

5.用-i忽略大小寫,找出文件中關鍵字所在行,並打印

[root@localhost ~]# grep -i -n abc test.txt 
1:Abcdefg

6.-o查找文件中的ip地址並打印出來

[root@localhost ~]# ifconfig | grep -o [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9] 
192.168.1.7
255.255.255.0
192.168.1.2
127.0.0.1
255.0.0.0

7.查找系統掛載設置

[root@localhost ~]# grep -v -E "^#|^$" /etc/fstab 
UUID=4924e7a8-3a04-4efe-a0c1-2cfaee781f16 /                       xfs     defaults        1 1
UUID=fecbd2dc-60b6-4aad-b5c8-da5e56edfa86 /boot                   xfs     defaults        1 2
UUID=66d0952d-4f7d-4504-8574-912be3586d49 swap                    swap    defaults        0

取出默認shell為非bash的用戶

grep -v "bash$" /etc/passwd |cut -d: -f1

8.配合正則進行匹配

  正則表達式:是一類字符所書寫出的模式(pattern)
    元字符:類似通配符,不表示字符本身的意義,用於額外功能性的描述

  基本正則表達式和擴展正則表達式
  基本正則表達式的元字符:
      .        任意單個字符
      []        指定範圍內的任意單個字符
      [0-9],[[:digit:]]   表示0-9任意數字
      [a-z],[[:lower:]]      表示小寫子母
      [A-Z],[[:upper:]]      表示大寫字母
     [[:alpha:]]        表示所有的字母
      [[:alnum:]]        表示字母+數字:
      [[:space:]]        表示空格
      [[:putct:]]        表示標點符號
      [^]         指定範圍外的任意單個字符


    次數匹配:用來指定匹配其前面的字符的次數
      *:任意次
      例子:x*y    xxy xy y 都能匹配
      .*        匹配任意長度的任意字符
      \?        前面字符出現0次或者1次的
      \{m\}       匹配m次
      \{m,n\}      至少m次,至多n次
      \{m,\}       至少m次
      \{0,n}       至多n次


    做變量換算需要使用""
      貪婪模式:盡可能的長的去匹配字符:

    位置錨定:用於指定字符出現的位置
      ^:錨定行首
        ^Char
      $:錨定行尾
        grepchar$
      ^$:空白行


    單詞的位置錨定
      \<char :錨定詞首,\b
      char\> : 錨定詞尾,char\b

  
    分組:
      \(\)
      \(ab\)*xy


    引用:
      \1:後向引用,引用前面的第一個左括號以及與之對應的右括號中的模式匹配到的內容,意思是說前面出現一次,在\1這也要出現一次

練習:

1)取出默認shell為bash的且其ID號最大的用戶

grep  "bash$" /etc/passwd | sort -n -t: -k3 | cut -d: -f1 |tail -1

2)顯示/etc/rc.d/rc.sysinit文件中,以#開頭,後面跟至少一個空白字符,而後又有至少一個非空白字符的行

grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit 

3)顯示/boot/grub/grub.conf中以至少一個空白字符的行

grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf 

4)查出/etc/passwd中一位數或兩位數

grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd

5)找出ifconfig命令結果中的1到255之間的整數

ifconfig |grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

6)添加用戶bash和testbash,而後找出當前系統上於其他用戶名和默認shell相同的用戶

grep "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd

7) 找出netstat -tan命令執行的結果中以“LISTEN”或“ESTABLISHEN”結尾的行

metstat -tan |grep -E “(LISETN|ESTABLISHED)[[:space:]]*"

8) 取出當前系統上所有用戶的shell,要求:每種shell中顯示一次,且升序排序顯示

cut -d: -f7 /etc/passwd|sort -u

egrep

egrep:使用擴展正則表達式來構建模式,相當於 grep -E

  在表示正則表達式時可以省略轉義符號

三劍客之——grep