Linux文本處理「三劍客」之grep

    在linux中,由於一切皆文件,而大部分程序的配置文件是文本形式的。因此對文本的處理就顯得至關的重要了。對文本的處理包括對文本內容的搜索,文本內容的處理。下面就介紹文本的搜索相關知識。linux


文本內容搜索git

    文本搜索的含義是:根據用戶指定的文本搜索模式(搜索條件)對目標文件進行逐行的掃掃描,將匹配到的行打印在屏幕上。文本搜索的主要做用是用於統計相關信息。正則表達式


1、正則表達式 shell

一、正則表達式的概念bash

    是一類字符的書寫模式,這些個字符不表明本字符的意義,而是具備特殊意義。通常是對控制或通配的功能。ide


二、正則表達式的識別
ui

    靠正則表達式引擎來負責翻譯或者解釋其中元字符的含義,正則表達式引擎是一段程序。一般每種語言(包括shell)的正則表達式引擎都不同,從而致使了每種語言的正則表達式的元字符所表明的意義都不盡相同。spa


三、正則表達式的元字符翻譯

    正則表達式元字符:就是表明特殊意義的特殊字符。orm

1)字符集種類及表示方法

種類 意義
0-9 或 [:digit:] 0-9數字
a-z 或 [:lower:] 小寫字母
A-Z 或 [:upper:] 大寫字母
[:space:] 空格或TAB空白字符
[:punct:] 特殊字符
[:alpha:] 大小寫字母
[:alnum:] 字母和數字的組合

2)基本正則表達式的元字符:

元字符種類 具體含義 示例
字符匹配 . 表示匹配任意單個字符 l..k  匹配像:love,like
[] 匹配指定範圍內任意單個字符

[0-9] 0-9任意一個數字

[[:upper:]] 匹配大寫字母中的任意一個

[^] 匹配指定範圍外的任意單個字符

[^a-z] 匹配除a-z之外的任意字符

[^[:alnum:]] 匹配除數字和字母之外的任意字符

次數匹配 * 匹配前面字符任意次,包括0次 ca*  匹配像:c,ca,caa,caaa等
\? 匹配前面字符至多一次,就是說前面的字符無關緊要 ha\?  匹配的只有:he,h
\{m\} 精確匹配前面的字符m次 hm\{2}\  匹配的只有:hmm
\{m,\} 匹配前面的字符至少m次 hm\{2,}\  匹配像:hmm,hmmm等
\{m,n\} 匹配前面字符至少m次,至多n次 hm\{2,4\} 匹配:hmm,hmmm,hmmmm
\{0,m\} 匹配前面的字符至多n次 hm\{0,3\} 匹配:hm,hmm,hmmm
位置錨定 ^ 錨定行首,寫在最左側 ^abc  
$ 錨定行尾,寫在最右側 abc$
\<  \b 錨定單詞詞首,出現與單詞最左側  \<abc \babc
\>   \b 錨定單詞詞尾,出現單詞的最右側 abc\> abc\b
分組 \(\) 分組中的模式匹配到的內容,可由正則表達式引擎保存在內存中,以後可被引用 \(abc\)
\# 引用定#個括號所配到的內容,而非模式自己。#肯定方法自左向右左括號的個數 \1,\2

    注意:在這裏單詞的意思是,不包含特殊字符的連續字符組成的字符串就叫作單詞。

3)擴展正則表達式的元字符:


元字符種類 具體含義 示例
字符匹配 . [] [^] 同基本正則表達式徹底同樣
次數匹配

* ? {m}{m,}

{m,n} {0,m}

同基本正則表達式同樣,但注意一點是:?和{}在使用的時候不用轉義了
+ 匹配前面的字符至少1次 hm+ 匹配:hm,hmm,hmmm等
位置錨定 ^ $ \<  \b  \> 同基本正則表達式徹底同樣
分組
() 同基本正則表達式同樣,但注意一點是()在使用的時候不用轉義了
或者 |

表示選擇關係

c|Cat 匹配的是:c 或者 Cat

|整個左邊是一部分,|整個右邊是一部分


2、文本內容搜索命令

    經常使用的文本搜索命令有grep,egrep,fgrep

一、grep:Golbal search REgular and Print out the line.

    文本搜索的含義是:根據用戶指定的文本搜索模式(搜索條件)對目標文件進行逐行的掃掃描,將匹配到的行打印在屏幕上。

    Usage: grep [option]... 'PATTERN' FILE...

    對於PATTERN的條件的設定或者說書寫,能夠藉助於正則表達式。

經常使用參數 參數意義 示例
-i
匹配時PATTERN中的條件,忽略器大小寫 grep -i 'Root' /etc/passwd
-v
反向匹配,顯示沒有匹配到的行 grep -v 'linux' /etc/passwd
-o 只顯示匹配到的內容 grep -o 'gentoo' /etc/passwd
--color=auto 支持擴展表達式 grep --color=auto 'root' /etc/passwd
-A 顯示匹配行的後面指定數目行 grep -A 2 'linux' /etc/passwd
-B 顯示匹配行的前面指定數目行 grep -B 3 'linux' /etc/passwd
-C 顯示匹配行的先後指定相同數目行 grep -C 2 'linux' /etc/passwd
-n 顯示輸出行的行號 grep -nC 2 'linux' /etc/passwd
-E 支持擴展正則表達式 grep -E '[0-9]+' /etc/passwd
-c 只顯示匹配到行的數目 grep -c '^root\>' /etc/passwd

2)egrep相等於grep -E。

3)fgrep:fast grep,這裏不支持正則表達式,經常使用選項和grep同樣。


3、綜合練習

#一、顯示/proc/cpuinfo文件中以大寫或小寫C開頭的行,並顯示出對應的行號;
#實現命令:
#grep -n '^[Cc]' /proc/cpuinfo 
#grep -nE '^c|C' /proc/cpuinfo 
#grep -i '^c' /proc/cpuinfo
#演示結果 
[root@server ~]# grep -n '^[Cc]' /proc/cpuinfo | head -n 3
3:cpu family	: 6
7:cpu MHz		: 2394.620
8:cache size	: 3072 KB

#二、顯示/etc/passwd文件中其默認shell爲非/sbin/nologin的,而且UID最小的用戶
[root@server ~]# grep '/sbin/nologin$' /etc/passwd | sort -n -t: -k3 | head -n 1 | cut -d: -f1
bin

#三、找出/etc/passwd文件中的一位數或兩位數或三位數;
[root@server ~]#grep "\<[0-9]\{1,3\}\>" /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin


#四、-c:只顯示匹配到行的數目
[root@server ~]# grep 'root' -n /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[root@server ~]# grep 'root' -c /etc/passwd
2


#五、找出ifconfig命令結果中的1-255之間的數字
# ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

wKioL1O5VIzh3c07AAHz7Enw6N4250.jpg

相關文章
相關標籤/搜索