GREP命令學習筆記

GREP命令,全稱:Global search REgular expression and Print out the line.

是一個非常強大的文本搜索命令,與SED(stream editor,文本編輯工具)和AWK(文本分析、報告生成器)并稱文本處理三劍客。

一.GREP命令基本使用格式

grep [OPTIONS] PATTERN [FILE…]

 選項: 

   –color=auto: 對匹配到的文本著色顯示;

  -v: 顯示不能夠被pattern匹配到的行,反轉;

  -i: 忽略字符大小寫;

  -o: 僅顯示匹配到的字符串;

  -q: 靜默模式,不輸出任何信息;

  -A #:after, 后#行

  -B #: before, 前#行

  -C #:context, 前后各#行

  -E:使用ERE;

1. –color=auto參數是對匹配到的文本著色顯示,Centos7中,grep的命令別名默認帶了這個參數。

[root@192 ~]# alias grep
alias grep='grep --color=auto'

2.使用–v 參數顯示不能夠被匹配到的行

[root@192 ~]# grep -v /sbin/nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

3.使用–i參數忽略大小寫查找

[root@192 ~]# grep -i root /etc/fstab 
/dev/mapper/centos-root /   xfs    defaults   0 0

4. 使用–o參數僅顯示匹配到的字符串

[root@192 ~]# grep -o root /etc/fstab
root

5. 使用-A,-B,-C顯示之前、之后、(之前之后)的幾行

-A,顯示匹配行之后的幾行

[root@192 ~]# grep -A2 mail /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

-B:顯示匹配行之前的幾行

[root@192 ~]# grep -B2 mail /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

-C:顯示之前之后的幾行

[root@192 ~]# grep -C2 mail /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

6.使用-n參數在輸出時,顯示行號

[root@192 ~]# grep -nA2  mail /etc/passwd
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin

7.用-c參數統計顯示匹配的行數

[root@192 ~]# grep -c root /etc/passwd
2

8.使用-r進行遞歸搜索,可以在當前目錄及其子目錄中進行搜索。

[root@192 ~]# grep -r /bashrc /etc/
/etc/bashrc:# /etc/bashrc
/etc/profile:# Functions and aliases go in /etc/bashrc
/etc/profile.d/256term.sh:# This must be set before reading global initialization such as /etc/bashrc.
/etc/skel/.bashrc:if [ -f /etc/bashrc ]; then
/etc/skel/.bashrc:      . /etc/bashrc

二.GREP的進階用法

GREP命令可以根據用戶指定的“模式”對目標文本逐行進行匹配檢查,并且打印輸出匹配到行(模式,是指由正則表達式字符及文本字符所編寫的過濾條件)。

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

正則表達式分為基本正則表達式(BRE)和 擴展正則表達式(ERE)

2.1基本正則表達式用法及相關參數:

基本正則表達式元字符(BRE):

參數

字符匹配:

.:  匹配任意單個字符;

[]: 匹配指定范圍內的任意單個字符

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

         [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

匹配次數

用在要指定次數的字符后面,用于指定前面的字符要出現的次數;

*:匹配前面的字符任意次(有可能是0次);

                    例如: grep "x*y" 

                        abxy

                        xay

                        xxxxxxy

 貪婪模式:轉義字符必須加單引號,否則不生效

 .*:任意長度的任意字符;# grep .*y 1.log

\?:匹配其前面的字符0或1次;即前面的可有可無;#   grep 'x\?y' 1.log

\+:匹配其前面的字符至少1次;# grep 'x\+y' 1.log

\{m\}:匹配前面的字符m次;# grep 'x\{2\}y' 1.log

\{m,n\}:匹配前面的字符至少m次,至多n次;# grep   'x\{2,4\}y' 1.log

\{0,n\}:匹配前面的字符至多n次;# grep 'x\{0,2\}y' 1.log

\{m,\}:匹配前面的字符至少m次;# grep 'x\{1,\}y' 1.log

 位置錨定

 ^:行首錨定;用于模式的最左側;# cat   /etc/passwd |grep ^root

 $:行尾錨定;用于模式的最右側;# cat /etc/passwd |grep /bin/bash$

                ^PATTERN$: 用于模式匹配整行;# grep ^xxy$ 1.log

                    ^$: 空行;grep ^$ 1.log

                    ^[[:space:]]*$:     # grep ^[[:space:]]*$ 1.log

 \< 或 \b:詞首錨定;用于單詞模式的左側;cat /etc/passwd   |grep '\<r'

\> 或 \b:詞尾錨定;用于單詞模式的右側;cat /etc/passwd   |grep '\>r'

                \<PATTERN\>:匹配整個單詞;cat /etc/passwd |grep '\<root\>'

 分組:

 \(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;# grep '\(xy\)' 1.log

                    \(xy\)*ab   : # grep '\(xx\)*y' 1.log

 Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, …

       \1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;

                        \(ab\+\(xy\)*\):

                            \1: ab\+\(xy\)*

                            \2: xy

后向引用:

 引用前面的分組括號中的模式所匹配字符,(而非模式本身)

 基本練習:

1.搜索和尋找文件

查找一個文件或者某些包含特定關鍵字的文件。

比如,在Centos7中,默認沒有安裝ifconfig命令,那么在掛載好CDROM后,需要找出ifconfig命令的包裝包(ifconfig 包含在net-tools安裝包中),再利用rpm –ivh進行安裝:

[root@192 Packages]# ll |grep –i net-tools
-r--r--r--. 2 root root    311020 7月   4 2014 net-tools-2.0-0.17.20131004git.el7.x86_64.rpm

2.搜索并過濾文件

在示例文件1.log中,有大量的空行,把文件內所有的空行刪除并另存為2.log文件。

[root@192 scripts]# grep -v ^[[:space:]]*$ 1.log  >2.log

3顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)

# grep -i ^s /proc/meminfo
# grep ^[Ss]  /proc/meminfo

4顯示/etc/passwd文件中不以/bin/bash結尾的行;

#grep -v /bin/bash$ /etc/passwd

5顯示/etc/passwd文件中ID號最大的用戶的用戶名;

# sort -t: -k3 -n /etc/passwd |tail -1|cut -f1 -d:

6如果用戶root存在,顯示其默認的shell程序;

# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

7找出/etc/passwd中的兩位或三位數;

 # grep "\<[0-9]\{2,3\}\>" /etc/passwd

8顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且后面存非空白字符的行;

# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

9找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行;

# netstat -tan | grep "LISTEN[[:space:]]*$"

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

# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

11獲取當前IP地址,只輸出IP地址信息(這道題我做了很多次,一次比一比精簡,雖然可能在CentOS6上不通用,但是多思考一下總是對的):

ifconfig |grep ^[[:space:]]*inet |tr -s ' ' |cut -d' ' -f3 |grep ^[1-2]|grep -v 127
ifconfig |grep -A1 eno |grep '^[[:space:]]\+inet' |tr -s ' '|cut -d' ' -f3
ifconfig |grep inet |tr -s ' ' |cut -d' ' -f3 |grep ^[1-2]|grep -v 127
ifconfig |grep -A 1 eno |grep inet |tr -s ' '|cut -f3 -d' '
ifconfig |grep inet.*255$|tr -s ' '|cut -f3 -d' '

    實例練習:

        1、寫一個腳本,實現如下功能

            如果user1用戶存在,就顯示其存在,否則添加之,并顯示添加的用戶的id號等信息;

 #!/bin/bash
 id user1 &> /dev/null && echo "user1 exists." || useradd user1
 id user1

 

        2、寫一個腳本,完成如下功能

            如果root用戶登錄了當前系統,就顯示root用戶在線;否則說明其未登錄;

# w |grep ^FZ &> /dev/null && echo "Yes" || echo "NO"

2.2 egrep及擴展的正則表達式

      egrep = grep -E

      egrep [OPTIONS] PATTERN [FILE…]

擴展正則表達式的元字符:

舉例

字符匹配:

 

.

[]

[^]

次數匹配:

*

?:0或1次;

+:1次或多次;

{m}:匹配m次;

{m,n}:至少m,至多n次;

錨定:

^

$

\<,\b

\>,\b

分組:

()

后向引用:

\1,\2,…

或者:

a|b

C|cat:C或cat

 基本練習:

            1、顯示當前系統root、centos或user1用戶的默認shell和UID;

       # grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7

           2、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞后面跟一個小括號的行;

       # grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions

           3、使用echo輸出一絕對路徑,使用egrep取出其基名;

       # echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1

2.3 fgrep不支持正則表達式搜索

fgrep只搜索字符串而不是搜索匹配表達式的模式。

 例如,當在用grep –r 搜索/etc及其子目錄中所有包括.bash的文件內容時,其中的.則不會被當成正則表達式中所表示的“任意單個字符”

[root@192 ~]# fgrep -r .bashrc /etc/
/etc/profile.d/256term.sh:# Set this variable in your local shell config (such as ~/.bashrc)
/etc/bash_completion.d/git:#    2) Add the following line to your .bashrc/.zshrc:
/etc/skel/.bash_profile:if [ -f ~/.bashrc ]; then
/etc/skel/.bash_profile:    . ~/.bashrc
/etc/skel/.bashrc:# .bashrc

 

 

原創文章,作者:FZ,如若轉載,請注明出處:http://www.www58058.com/18545

(0)
FZFZ
上一篇 2016-06-22 15:39
下一篇 2016-06-22 15:40

相關推薦

  • 文件管理基礎知識及命令詳解

    文件系統     文件和目錄被組織成一個單根倒置樹結構     文件系統從根目錄下開始,用“ /”表示     根文件系統(rootfs): root filesystem    …

    Linux干貨 2016-08-05
  • awk用法指北

    awk用法指北 awk是對Linux系統中文本三劍客之一。其功能強大,支持條件判斷、數組、循環,并且內置大量函數,近乎于一門獨立的編程語言。 awk基本語法awk [option] ‘program’ FILE 最常用選項 -F “” 指定字段分隔符 //分隔符為PATTERN-v VAR=value 指定變量…

    Linux干貨 2017-05-21
  • 深入Php底層,用c為php編寫拓展

    1.前言              隨著lamp/lnmp架構的流行,Php語言越來越得到廣泛的使用。php語言在表現層有著非常優異的表現,部署方便,開發迅速。但Php語言也有著天生短板以及局限性—-對多線程以及多進程的支持不甚如意,以及…

    Linux干貨 2016-10-29
  • Linux-文件系統初識

    Linux文件系統

    2018-03-14
  • 虛擬機的安裝

    虛擬機的安裝步驟: 1、打開VMware點擊創建新的虛擬機 2、選擇典型安裝方式點擊下一步 3、選擇稍后安裝操作系統點擊下一步 4、客戶機操作系統選擇Linux,版本選擇Centos 64位 5、設定虛擬機的名稱及存放路徑 6、設定磁盤的容量,選中將虛擬磁盤存儲為單個文件 7、對虛擬設備進行設置 8、CD/DVD此項選中使用ISO映像文件并選擇映像所在路徑 …

    2018-03-27
  • SED基本用法和在文本中的使用

    sed命令行格式為: sed [-nefri] ‘command’ 輸入文本/文件 常用選項: -n∶取消默認的輸出,使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到屏幕上。但如果加上 -n 參數后,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來 -e∶進行多項編輯,…

    Linux干貨 2017-05-05

評論列表(1條)

  • stanley
    stanley 2016-06-22 15:40

    贊,已置頂

欧美性久久久久