1. 程式人生 > >Linux下grep入門

Linux下grep入門

linux 運維

Linux下入門grep用法

1.grep簡述及特點

  • 簡介:全局搜索正則表達式出來的行並打印 (Global search REgular expression and Print out the line),一種按照特定模式(pattern)的文本過濾工具

  • 模式:pattern,通過有正則表達式(refexp)特殊字符以及文本字符組成的條件來過濾

  • 正則表達式:refexp,有一些bash支持的特殊文本字符來表示特殊含義,如果特殊字符當原本字符匹配需要轉義

2.正則表達式分類

  • 基本正則表達式: BRE

  • 擴展正則表達式: ERE

3.grep 命令基礎語法

grep [option] [refexp] file

–color 用特定的顏色高亮顯示模式中匹配的字符串,一般為紅色
-v顯示不被模式PATTERN匹配的行
-o表示只顯示被模式匹配的字符,而不是整個行
-q靜默模式不輸出信息
-A# after 顯示到匹配到的後 # 行
-B# before 顯示到匹配的前 # 行
-C# context 顯示匹配的前後各幾行
-E使用擴展正則表達式
基本和擴展的功能類似,只是轉義方式不同

4.基本正則表達式

1.字符匹配

字符字符說明
.任意單個字符
?匹配其前單個字符0或1次
*匹配其前單個字符任意次
.*匹配任意長度的任意字符
[]表示匹配[]裏的字符集,[ab]及包含a或b的字符
[^]表示匹配除了[]裏的其它任意字符,[^ab]及不包含a或b的字符

2.[]裏所支持的特殊通配符:

字符說明
[0-9]表示單個0到9的數字
[:digit:]表示所有數值,同上
[a-z] [:lower:]表示單個小寫字母
[A-Z] [:upper:]表示單個大寫字母
[:alpha:] [a-zA-Z]表示單個字母
[:alnum:]表示字母或數字
[:space:]匹配空格
[:punct:]表示所有標點符合
註意:在使用中,[::]這種格式[::]裏帶特殊單詞的需要再加[]來表示,比如匹配空格則為‘[[:space:]]‘

3.次數匹配

字符說明
\?0次或1次
\+匹配其前字符一次以上
\{m\}匹配其前字符m次
\{m,\}匹配其前字符至少m次
\{m,n\}匹配其前字符至少m次,至多n次

4.字符錨定

字符說明
^行首錨定
$行尾錨定
^$表示空行匹配
\< 或 \b行首錨定
\> 或 \b行尾錨定
\\>錨定匹配PATTERN的作為單詞 \ \broot\b\>
\(\) :對()裏匹配PATTERN的做分組\1為後項引用前面第一個分組

擴展正則

1.用法

  • grep -E ‘PATTERN‘ [file]

  • egrep ‘PATTERN‘ [file]

  • 字符匹配和基本相同

  • 錨定和基本用法一樣

  • 分組直接使用(),不要用\轉義

  • 後項引用 \1 \2 \3

2.次數匹配

字符說明
*匹配前面字符任意次
?0或1次。>=0
+1次以上。>=1
{m}匹配多少次
{m,}至少m次
{m,n}至少m次,至多n次
{0,n}至多n次

示例

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

grep -i ‘^s‘ /proc/meminfo
grep  ‘^[Ss]‘ /proc/meminfo
grep  -E  ‘^(s|S)‘ /proc/meminfo

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

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

3、顯示用戶rpc默認的shell程序

 grep  ‘^\<rpc\>‘  /etc/passwd | cut -d: -f7

4、找出/etc/passwd中的兩位或三位數

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

5、顯示/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面存非空白字符的行

grep  ‘^[[:space:]]\+.*[^[:space:]]‘  /etc/grub2.cfg

6、找出"netstat -tan"命令的結果中以‘LISTEN‘後跟任意個空白字符結尾的行

netstat  -tan  ‘.*LISTEN[[:space:]]*$‘

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

grep  ‘^\<\(.*\)\>.*/\1$‘  /etc/passwd
grep  ‘^\<\(.*\)\>.*\<\1\>$‘ /etc/passwd

8、顯示當前系統root、mage或wang用戶的UID和默認shell

grep -E ‘^(root|mage|wang)\>‘ /etc/passwd |cut -d: -f7

9、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)後面跟一個小括號的行

grep -E -o ‘^\<[[:alnum:]_]+\>\(\)‘ /etc/rc.d/init.d/functins

10、使用egrep取出/etc/rc.d/init.d/functions中其基名

echo "/etc/rc.d/init.d/functions" grep -E -o ‘[^/]+/?$‘

11、使用egrep取出上面路徑的目錄名

echo "/etc/rc.d/init.d/functions" | grep -E ‘/.*/‘

12、統計以root身份登錄的每個遠程主機IP地址的登錄次數

last | grep -o ‘root\>.*\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]‘ | tr -s ‘ ‘| cut -d‘ ‘ -f3 | uniq -c

13、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255

grep  -E  ‘\<([0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>‘

14、顯示ifconfig命令結果中所有IPv4地址

ifconfig | grep -o ‘\(\([0-9]\|1[0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\([0-9]\|1[0-9]\|1[0-9]{2}\|2[0-4][0-9]\|25[0-5]\)‘


本文出自 “我思故我在” 博客,請務必保留此出處http://sinian.blog.51cto.com/11619325/1954908

Linux下grep入門