1、grep:git
做用:正則表達式
一、文本搜索工具;
shell
二、基於Pattern(過濾條件)對目標文本逐行進行匹配centos
三、打印出符合條件的行bash
模式: ide
一、由文本字符及正則表達式元字符所編寫的過濾條件工具
二、模式經過正則表達式引擎匹配搜索spa
三、正則表達式引擎:利用正則表達式分析給定文本的程序;orm
格式:字符串
grep [OPTIONS] PATTERN [FILE...]
-i : 忽略字符大小寫;
-o : 僅顯示匹配到的文本自身
-v : 反向匹配
-E : 支持擴展正則表達式
-q : 靜默模式,不輸出任何信息
-A# : 展現匹配到的文本的當前行和後#行
-B# : 展現匹配到的文本的當前行和前#行
-C# : 展現匹配到的文本的當前行和先後各#行
--color=auto : 對匹配到的文本高亮顯示
基本正則表達式元字符:
字符匹配:
"." : 匹配任意單個字符;
[ ] : 匹配範圍內的任意單個字符;
[^ ] : 匹配範圍外的任意單個字符;
[:digit:]全部數字 [:alnum:]全部數字和字母
[:lower:]只顯示小寫字母 [:space:]空白字符
[:upper:]只顯示大寫字母 [:punct:]標點符號
[:alpha:]全部字母
匹配次數:
用在要指定其出現的次數的字符後面,用限制其前面的字符要出現的次數;默認工做於貪婪模式
* : 匹配前面的字符任意次(0,1或屢次);
.* : 匹配任意長度的任意字符
\+ : 匹配前面的字符至少1次;
\? : 匹配前面的字符0次或一次,即前面的字符無關緊要
\{m\} : 其前面的字符出現m次,m爲非負整數
\{m,n\} : 其前面的字符至少出現m次至多出現n次
\{0,n\} : 之多出現n次
\{m,\} : 至少m次
位置錨定:
限制模式所匹配到的文本只能出現於目標文本的哪一個位置
^ : 行首錨定:用於模式的最左側:^PATTERN
$ : 行尾錨定:用於模式的最右側:PATTERN$
^PATTERN$ : 匹配完整一行;
^$ : 匹配空行;等同於^[[:space:]]*$;
\<或\b : 詞首錨定,用於單詞最左側,格式爲\<PATTERN,\bPATTERN
\>或\b : 詞尾錨定,用於單詞最右側,格式爲PATTERN>\,PATTERN\b
\<PATTERN\> : 單詞錨定
分組與引用:
\(PATTERN\): 將此PATTERN匹配到的字符看成一個不可侵犯的總體進行處理;
\n : 模式中第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符串;
練習:找出用戶名和shell同名的用戶
egrep "^([a-z0-9]+)\>.*\1$" /etc/passwd
egrep:
egrep [OPTIONS] PATTERN [FILE...]
擴展正則表達式元字符:
字符匹配:
"." : 任意單個字符
[ ] : 範圍內的任意單個字符
[^ ] : 範圍外的任意單個字符
匹配次數:
* : 任意次
?: 0次或1次
+ : 1次或屢次
{m} :匹配m次
{m,n} : 至少m次至多n次
{m,} :至少m次至多不限
位置錨定:
^ : 行首錨定
$ : 行尾錨定
\<,\b : 詞首錨定
\>,\b : 詞尾錨定
分組及引用:
(PATTERN): 將此PATTERN匹配到的字符看成一個不可侵犯的總體進行處理;
\1,\2... : 模式中第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符串;
或者: "|"
a|b : a或者b
C|cat : 表示C或者cat
(C|c)at : 表示Cat或cat
fgrep:不支持使用正則表達式
當無需用到元字符編寫模式時,使用fgrep處理數據量龐大的文本文件時,速度能夠體現出來
練習:
一、顯示/etc/passwd文件中不以bash結尾的行;
grep -v bash$ /etc/passwd egrep -v bash$ /etc/passwd
二、找出/etc/passwd文件中的三位或四位數;
grep "[[:digit:]]\{3,4\}" /etc/passwd egrep "[[:digit:]]{3,4}" /etc/passwd
三、找出/etc/grub2.cfg文件中,以致少一個空白字符開頭,後面又跟了非空白字符的行;
grep "^[[:space:]]\+"[^[:space:]] /etc/grub2.cfg egrep "^[[:space:]]+"[^[:space:]] /etc/grub2.cfg
四、找出"netstat -tan」命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;
netstat -tan | grep "LISTEN[[:space:]^]*" netstat -tan | egrep "LISTEN[[:space:]^]*
五、找出"fdisk -l「命令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;
fdisk -l | grep "/dev/[s,h]d[[:lower:]]" fdisk -l | egrep "/dev/[s,h]d[[:lower:]]"
六、找出」ldd /usr/bin/cat「命令的結果中文件路徑;
ldd /usr/bin/cat | grep -o "/[^[:space:]]\+" ldd /usr/bin/cat | egrep -o "/[^[:space:]]+"
七、找出/proc/meminfo文件中,全部以大寫或小寫s開頭的行;至少用三種方式實現;
grep "^s|S" /etc/meminfo grep "^[sS]" /etc/meminfo grep -i "^s" /etc/meminfo
八、顯示當前系統上root、centos或slackware用戶的相關信息;
egrep "^(root|centos|slackware)\>" /etc/passwd
九、echo輸出一個絕對路徑,使用egrep取出其基名;
echo /etc/passwd | egrep -o "[^/]+/?$"
十、找出ifconfig命令結果中的1-255之間的整數;
ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
十一、添加用戶bash、testbash、basher及nologin,要求前三個用戶的默認shell爲/bin/bash,nologin的默認shell爲/sbin/nologin,然後找出其用戶名與shell名相同的用戶;
egrep "^([0-9a-z]+)\>.*\1$" /etc/passwd