grep命令及正則表達式


grep:global search regular expression(RE) and print out the line

文本搜索工具,根據用戶指定的文本模式對目標文件進行逐行搜索,顯示能夠被模式所匹配到的行。

基本語法

grep [option] 'PATTERN' file, ...

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

此處表達式分為基本正則表達式和擴展正則表達式。

基本正則表達式的元字符

字符匹配:.
. :  任意單個字符

grep --color=auto Boot /etc/rc.d/rc.sysinit
grep --color=auto 'B..t' /etc/rc.d/rc.sysinit
grep --color=auto 'r..t' /etc/passwd

 

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

[0-9], [[:digit:]]  數字
[a-z], [[:lower:]]  小寫字母
[A-Z], [[:upper:]]  大寫字母
[[:alpha:]]  字母
[[:alnum:]]  字母和數字
[[:space:]]  空格
[[:punct:]]  標點符號

alias cgrep='grep --color=auto'
cgrep '[Rr]..[Tt]' /etc/passwd
cgrep '[Rr].*[Tt]' /etc/passwd
cgrep '[Rr][^[:punct:]]*[Tt]' /etc/passwd

 

次數匹配:用來指定匹配其前面的字符次數

* :   任意次
  例子:x*y, xxy, xy, y
.* :  匹配任意長度的任意次
\?:  0次或1次
  x\?y, xy, y, xxy
  貪婪模式:盡可能長的去匹配字符
\{m\}:     匹配其前面字符m次
\{m,n\}:  匹配其前面字符至少m次,最多n次
\{m,\}:    匹配其前面字符至少m次,最多不限
\{0,n\}:   匹配其前面字符最多n次

位置錨定:用於指定字符出現的位置
^: 錨定行首
  ^char
  cgrep '^[Rr][^[:punct:]]*[Tt]' /etc/passwd
$:錨定行尾
  char$
  cgrep 'bash$' /etc/passwd
^$: 空白行

\<char, \bchar :錨定詞首
char\>, char\b :錨定詞尾

分組
\(\)
\(ab\)*xy :把ab當成一個部分

引用
\1: 后向引用,引用前面的第一個左括號以及與之對應的右括號中的模式所匹配到的內容
\2 --前面匹配到的內容,后面還要繼續再出現一次
...
  \(a.b\)xy\1:
    a6bxy 不能匹配
    a6bxya7b 能匹配到

 

下面演示一下分組的具體用法:

cat grep.txt
He like his lover.
She love her liker.
He love his lover.
she like her liker.

 

grep 常用的選項

-v: 反向,顯示不能被模式所匹配到的行
-o: 僅顯示被模式匹配到的字串,而非整行
-i: 不區分字符大小寫,ignore-case
-E: 支持擴展的正則表達式
-A # : 顯示匹配到的行及下#行
-B # : 顯示匹配到的行及上#行
-C # : 顯示匹配到的行及上下各#行

1、顯示/proc/meminfo文件中以大小寫s開頭的行

grep "^[sS]" /proc/meminfo
grep -i "^s" /proc/meminfo

 

2、取出默認shell為非bash用戶

grep '[^bash]$' /etc/passwd | cut -d: -f1
grep -v '^bash$' /etc/passwd | cut -d: -f1

 

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

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

 

4、顯示/etc/rc.d/rc.local文件中,以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行

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

 

 

5、顯示/boot/grub2/grub.cfg中以至少一個空白字符開頭的行

grep "^[[:space:]]\{1,\}" /boot/grub2/grub.cfg                   這個包含空白行
grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub2/grub.cfg 把空白行除外

 

6、找出/etc/passwd文件中一位數或兩位數

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

 

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

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

 

8、查看當前系統上root用戶的所有信息

grep "^root\>" /etc/passwd

 

9、找出當前系統上其用戶名和默認shell相同的用戶

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

 

10、找出netstat -tan命令執行的結果中以"LISTEN"或"ESTABLISHED"結尾的行

netstat -tan | egrep --color=auto "(LISTEN|ESTABLISHED)[[:space:]]*"

 

11、取出當前系統上所有用戶的shell,要求:每種shell只顯示一次,且按升序顯示

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

 

12、寫一個模式,能匹配真正意義上的IP地址:(1.0.0.1--223.255.255.254)

ifconfig | egrep --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>"

或者

ifconfig | egrep --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\>"

 

 

cut 行剪切命令
  -d 指定分隔符
  -f 指定顯示第幾段
    cut -d: -f1 以:為分隔符,顯示第一段
  
sort 排序命令
  -n 以數值大小排序
  -t: 指定分隔符為:
  -k3 指定排序的數值在第3列
       -u 去重

  sort命令默認是升序

 

grep家族

grep, egrep, fgrep

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

對於擴展正則表達式元字符可以查看http://www.cnblogs.com/chengtai/p/6618263.html

 

fgrep: fast,不解析正則表達式,給什么字符就找什么字符。給的內容一律當字符串查找。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM