grep 整理

grep家族 .jpeg

grep:

Linux上文本處理三劍客
grep:文本過濾(模式:pattern)工具; 
grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件;
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示字符字面意義,而表示控制或通配的功能;
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep

grep家族主要有grep(基本正則)、egrep(擴展正則)、fgrep(不支持正則)

grep [OPTIONS] PATTERN [FILE…]

選項:
--color=auto: 對匹配到的文本著色顯示;centos 7默認帶-v: 顯示不能夠被pattern匹配到的行;-i: 忽略字符大小寫;-o: 僅顯示匹配到的字符串;-q: 靜默模式,不輸出任何信息;-A #:after, 后#行-B #: before, 前#行-C #:context, 前后各#行-R/-r: 此參數的效果和指定“-d recurse”參數相同-n :在顯示符合范本樣式的那一列之前,標示出該列的編號-E:使用ERE;

選項例子: 在多個文件中查找:

grep "match_pattern" file_1 file_2 file_3 ...
標記匹配顏色 --color=auto 選項
grep "match_pattern" file_name --color=auto忽略字符大小寫
grep  -i "^s" /proc/meminfo
僅顯示匹配到的字符串
grep -o  "^[sS]"  /proc/meminfo
靜默模式
grep -q "test" filename#不會輸出任何信息,如果命令運行成功返回0,失敗則返回非0值。一般用于條件測試。顯示匹配某個結果之后的3行,使用 -A 選項:
seq 10 | grep "5" -A  35678 顯示匹配某個結果之前的3行,使用 -B 選項
seq 10 | grep "5" -B 32345顯示匹配某個結果的前三行和后三行,使用 -C 選項
seq 10 | grep "5" -C 32345678使用擴展正則
grep -E "[1-9]+" 或 egrep "[1-9]+"在多級目錄中對文本進行遞歸搜索
grep "text" . -r -n # .表示當前目錄。
在grep搜索結果中包括或者排除指定文件#只在目錄中所有的.php和.html文件中遞歸搜索字符"main()"grep "main()" . -r --include *.{php,html}#在搜索結果中排除所有README文件 grep "main()" . -r --exclude "README"#在搜索結果中排除filelist文件列表里的文件 grep "main()" . -r --exclude-from filelist

基本正則表達式

字符匹配:
.:匹配任意單個字符[]:匹配指定范圍內的任意單個字符[^]:匹配指定范圍外的任意單個字符[-]:匹配[]中指定范圍內的任意一個字符,要寫成遞增
POSIX字符類:[:digit:]:匹配任意一個數字字符[:lower:]:匹配小寫字母[:upper:]:匹配大寫字母[:alpha:]:匹配任意一個字母字符(包括大小寫字母)[:alnum:]:匹配任意一個字母或數字字符[:space:]:匹配一個包括換行符、回車等在內的所有空白符[:punct:]:匹配標點符號\:轉義符,將特殊字符進行轉義,忽略其特殊意義
匹配次數:
*:匹配前面的字符任意次
.*:任意長度的任意字符\?:匹配其前面的字符0或1次;即前面的可有可無\+:匹配其前面的字符至少1次;\{m\}:匹配前面的字符m次;\{m,n\}:匹配前面的字符至少m次,至多n次;\{0,n\}:匹配前面的字符至多n次;\{m,\}:匹配前面的字符至少m次;
位置錨定:
^:行首錨定;用于模式的最左側;$:行尾錨定;用于模式的最右側;
^PATTERN$: 用于模式匹配整行;
^$: 空行;
^[[:space:]]*$:空白行
單詞錨定:\< 或 \b:詞首錨定;用于單詞模式的左側;\> 或 \b:詞尾錨定;用于單詞模式的右側;\<PATTERN\>:匹配整個單詞;
分組:
分組:\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;\(xy\)*ab
Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, ...
\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
\2:從左側起,第:二個左括號以及與之匹配右括號之間的模式所匹配到的字符;\(ab\+\(xy\)*\):
\1: ab\+\(xy\)*
\2: xy
后向引用:引用前面的分組括號中的模式所匹配字符,(而非模式本身)

例題:

1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
grep "^[sS]"  /proc/meminfo
grep  -i "^s" /proc/meminfo2、顯示/etc/passwd文件中不以/bin/bash結尾的行;
grep -v "/bin/bash$" /etc/passwd3、顯示/etc/passwd文件中ID號最大的用戶的用戶名;
sort -t: -k 3 /etc/passwd | cut -d: -f 1 | tail -n 1 4、如果用戶root存在,顯示其默認的shell程序;
id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f75、找出/etc/passwd中的兩位或三位數;
grep "\<[0-9]\{2,3\}\>" /etc/passwd6、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且后面存非空白字符的行;
grep "^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit7、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行;
netstat -tan | grep "LISTEN[[:space:]]*$"8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行;
grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd9、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;
grep -v "/sbin/nologin$" /etc/passwd10、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;
grep  "/bin/bash$" /etc/passwd11、找出/etc/passwd文件中的一位數或兩位數
grep --color=auto "\b[0-9]\{1,2\}\b" /etc/passwd12、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;
grep   "^[:space:]\+[^[:space:]]" /boot/grub/grub.conf13、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;grep   "^#.*[:space:]\+[^[:space:]]" /boot/grub/grub.conf14、使用echo命令輸出一個絕對路徑,使用grep取出其基名;
echo "/etc/passwd/" | grep  -o "[[:alpha:]]\+" | tail -n 1擴展:取出其路徑名
echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'

擴展正則表達式:

字符匹配
.:匹配任意單個字符
[]:匹配指定范圍內的任意單個字符
[^]:匹配指定范圍外的任意單個字符
[-]:匹配[]中指定范圍內的任意一個字符,要寫成遞增
POSIX字符類:
[:digit:]:匹配任意一個數字字符
[:lower:]:匹配小寫字母
[:upper:]:匹配大寫字母
[:alpha:]:匹配任意一個字母字符(包括大小寫字母)
[:alnum:]:匹配任意一個字母或數字字符
[:space:]:匹配一個包括換行符、回車等在內的所有空白符
[:punct:]:匹配標點符號
\:轉義符,將特殊字符進行轉義,忽略其特殊意義
匹配次數:*:匹配前面的字符任意次.*:任意長度的任意字符
?:匹配其前面的字符0或1次;即前面的可有可無
+:匹配其前面的字符至少1次;
{m}:匹配前面的字符m次;
{m,n}:匹配前面的字符至少m次,至多n次;
{0,n}:匹配前面的字符至多n次;
{m,}:匹配前面的字符至少m次;
位置錨定:
^:行首錨定;用于模式的最左側;
$:行尾錨定;用于模式的最右側;
^PATTERN$: 用于模式匹配整行;
^$: 空行;
^[[:space:]]*$:空白行
單詞錨定:
\< 或 \b:詞首錨定;用于單詞模式的左側;
\> 或 \b:詞尾錨定;用于單詞模式的右側;
\<PATTERN\>:匹配整個單詞;
分組:
分組:
():將一個或多個字符捆綁在一起,當作一個整體進行處理;
(xy)*abNote: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, ...
\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
\2:從左側起,第:二個左括號以及與之匹配右括號之間的模式所匹配到的字符;
后向引用:引用前面的分組括號中的模式所匹配字符,(而非模式本身)
或者:
a|b
C|cat: C或cat

例題:

1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用三種方式)
egrep "^[sS]"  /proc/meminfo
egrep  -i "^s" /proc/meminfo
egrep  "^(s|S)" /proc/meminfo2、顯示/etc/passwd文件中不以/bin/bash結尾的行;
egrep -v "/bin/bash$" /etc/passwd3、顯示/etc/passwd文件中ID號最大的用戶的用戶名;
sort -t: -k 3 /etc/passwd | cut -d: -f 1 | tail -n 1 4、如果用戶root存在,顯示其默認的shell程序;
id root &> /dev/null && egrep "^root\>" /etc/passwd | cut -d: -f75、找出/etc/passwd中的兩位或三位數;
egrep "\<[0-9]{2,3}\>" /etc/passwd6、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且后面存非空白字符的行;
egrep "^[[:space:]]+[^[:space:]]" /etc/rc.d/rc.sysinit7、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行;
netstat -tan | egrep "LISTEN[[:space:]]*$"8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行;
egrep "^([[:alnum:]]+\>).*\1$" /etc/passwd9、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;
egrep  -v "/bin/nologin"  /etc/passwd 
8、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;9、找出/etc/passwd文件中的一位數或兩位數;
egrep "\b[0-9]{1,2}\b" /etc/passwd10、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;
egrep "[:space:]+[^[:space:]]" /boot/grub/grub.conf11、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;egrep "^#+[:space:]+[^[:space:]]" /boot/grub/grub.conf12、打出netstat -tan命令執行結果中以‘LISTEN’,后或跟空白字符結尾的行;
egrep "^#.*[:space:]+[^[:space:]]" /boot/grub/grub.conf13、使用echo命令輸出一個絕對路徑,使用grep取出其基名;
echo "/etc/passwd/" | egrep  -o "[[:alpha:]]+" | tail -n 1擴展:取出其路徑名
echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'14、顯示當前系統root、centos或user1用戶的默認shell和UID;
egrep '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,715、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞后面跟一個小括號的行;
egrep  -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions16、找出ifconfig命令結果中的1-255之間數字;
ifconfig |egrep  "\b[1-9][0-9]?\b|\b1[0-9]{2}\b|\b2[0-4][0-9]\b|\b25[0-5]\b"17、挑戰題:寫一個模式,能匹配合理的IP地址;
ifconfig |egrep "(\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>"18、挑戰題:寫一個模式,能匹配出所有的郵件地址
egrep "[[:alnum:]]+_?[[:alnum:]]+@[[:alnum:]]+\.[[:alpha:]]+\.?[[:alpha:]]+?" abc

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

(1)
N21_ DominicN21_ Dominic
上一篇 2016-10-09
下一篇 2016-10-09

相關推薦

  • N28-第一周

    *計算機的組成以其功能: 當今計算機系統由硬件系統和軟件系統兩大部分組成。硬件系統是指計算機的物理設備,包括CPU,存儲器,輸入/輸出模塊等。軟件系統則是各種程序和數據的集合。 硬件結構的基本構成: 處理器: 用于控制計算機的操作,執行數據處理功能,是計算機硬件的核心。由控制器,運算器和一組寄存器組成。 控制器:負責根據讀入的指令決定計算機的操作 運算器:負…

    2017-12-06
  • 3.用戶和組管理

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@localhost ~]# who root     tty1         2016-12-…

    Linux干貨 2017-07-16
  • 6個變態的C語言Hello World程序

    下面的六個程序片段主要完成這些事情: 輸出Hello, World 混亂C語言的源代碼 下面的所有程序都可以在GCC下編譯通過,只有最后一個需要動用C++的編譯器g++才能編程通過。 hello1.c   #define _________ }     #define …

    Linux干貨 2015-04-01
  • 軟件包管理

    軟件包的分類,主要有以下兩大類    源碼包    二進制包(rpm包,系統默認包) rpm包由Redhat公司提出,被眾多linux發行版所采用。 優點:建立統一的數據庫文件,詳細記錄軟件包的安裝、卸載等變化信息,能夠自動的分析軟件包依賴關系。 查詢已安裝的rpm軟件信息: 格式:     rpm…

    Linux干貨 2016-08-25
  • RAID及LVM的實現

    RAID及LVM的實現 第一部分 : RAID介紹及創建 1、mdadm工具 2、創建RAID 5及刪除RAID 第二部分 : LVM的實現 1、基本命令 2、LVM創建及擴容和縮減 3、LVM快照 RAID介紹及創建 1、mdadm工具 mdadm [mode] <raid device> [options] <任意塊設備> [mo…

    Linux干貨 2017-08-22
  • 文本處理三劍客之grep

    grep命令基本用法 1、grep正則表達式(對文本行進行搜索過濾) 格式:grep [option] PATTERN [FILE…] option: -i:忽略大小寫 -v:取反,顯示未被匹配到的pattern -n:顯示匹配的行號 -c:統計匹配的行數 -o: 只顯示匹配到的pattern -q: 靜默,不予顯示 -A#:after,匹配到的行再向后…

    Linux干貨 2017-07-19
欧美性久久久久