grep命令及正則表達式

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

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

基本語法正則表達式

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

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

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

基本正則表達式的元字符express

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

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

 

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

* :   任意次
  例子: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
^$: 空白行code

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

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

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

 

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

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 # : 顯示匹配到的行及上下各#行

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

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

 

二、取出默認shell爲非bash用戶

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

 

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

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

 

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

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

 

 

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

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

 

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

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

 

七、找出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])\>"

 

八、查看當前系統上root用戶的全部信息

grep "^root\>" /etc/passwd

 

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

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

 

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

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

 

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

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

 

十二、寫一個模式,能匹配真正意義上的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,不解析正則表達式,給什麼字符就找什麼字符。給的內容一概當字符串查找。

相關文章
相關標籤/搜索