常說Linux上有文本處理的三劍客,grep、sed和awk,本文就grep做出詳細的描述,並引出正則表達式。 grep 舉例1:匹配/etc/passwd下有frank的行 舉例2:匹配/etc/passwd下有frank的行,忽略大小寫 舉例3:匹配/etc/passwd下不能被bash匹配的行 ...
常說Linux上有文本處理的三劍客,grep、sed和awk,本文就grep做出詳細的描述,並引出正則表達式。
grep
NAME:列印模式匹配的行 SYNOPISIS: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] 常用選項: --color=auto:對匹配到的文本著色後進行高亮顯示,預設已被別名alias grep='grep --color=auto' -i:忽略字元的大小寫 -o:僅顯示匹配到的字元串本身 -v:顯示不能被模式匹配到的行 -E:支持使用擴展的正則表達式 -q:靜默模式,即不輸出任何信息 -A #:顯示被模式匹配的行及其後#行 -B #:顯示被模式匹配的行及其前#行 -C #:顯示被模式匹配的行及其前後各#行
舉例1:匹配/etc/passwd下有frank的行
[root@localhost tmp]# grep "frank" /etc/passwd frank:x:1000:1000:frank:/home/frank:/bin/bash
舉例2:匹配/etc/passwd下有frank的行,忽略大小寫
[root@localhost tmp]# grep -i "frank" /etc/passwd frank:x:1000:1000:frank:/home/frank:/bin/bash Frank:x:1001:1001::/home/Frank:/bin/bash
舉例3:匹配/etc/passwd下不能被bash匹配的行
[root@localhost tmp]# grep -v "bash" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown ...... pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
舉例4:僅僅匹配/etc/passwd下的frank,忽略大小寫
[root@localhost tmp]# grep -oi "frank" /etc/passwd frank frank frank Frank Frank
舉例5:靜默模式匹配含有frank的行
[root@localhost tmp]# grep -q "frank" /etc/passwd [root@localhost tmp]#
舉例6:匹配/etc/passwd下含有ftp的行及其後3行
[root@localhost tmp]# grep -A 3 "ftp" /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
舉例7:匹配/etc/passwd下含有ftp的行及其前3行
[root@localhost tmp]# grep -B 3 "ftp" /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
舉例8:匹配/etc/passwd下含有ftp的行及其前後各2行
[root@localhost tmp]# grep -C 2 "ftp" /etc/passwd operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
egrep
支持擴展正則表達式實現類似於grep的文本過濾功能,相當於grep -E
NAME:列印模式匹配的行 SYNOPISIS: egrep [OPTIONS] PATTERN [FILE...] -i:忽略字元的大小寫 -o:僅顯示匹配到的字元串本身 -v:顯示不能被模式匹配到的行 -q:靜默模式,即不輸出任何信息 -A #:顯示被模式匹配的行及其後#行 -B #:顯示被模式匹配的行及其前#行 -C #:顯示被模式匹配的行及其前後各#行 -G:支持基本正則表達式
fgrep
fgrep搜索字元串而不是搜索匹配的表達式的模式,所以支持正則表達式,當無需要用到元字元去編寫模式的時候,使用fgrep必能更好更快。
支持-i,-v,-o,-A,-B,-C,-p等選項
正則表達式
Regular Expression,正則表達式,由一類特殊字元及文本字元編寫的模式,其中有些不表示其字面的意義,而是用戶控制或通配功能,分為基本正則表達式和擴展正則表達式。
基本正則表達式元字元:
字元匹配
. :匹配任意單個字元;
[]:匹配指定範圍內的任意單個字元;
特殊匹配:[:digit:] 匹配任意單個數字
[:lower:] 匹配任意單個小寫字母
[:upper:] 匹配任意單個大寫字母
[:alpha:] 匹配任意單個字母
[:alnum:] 匹配任意單個字母或數字
[:punct:] 匹配任意單個符號
[:space:] 匹配單個空格
[^]:匹配指定範圍外的任意單個字元;
匹配次數
用在要指定其出現的次數的字元後面,用於限制其前面字元出現的次數,預設工作於貪婪模式
*:匹配其前面的字元任意次數:0,1,多次 .*:匹配任意長度的任意字元 \?:匹配其前面的字元0次或者1次; \+:匹配其前面的字元1次或者多次; \{m\}:匹配其前面的字元m次 \{m,n\}:匹配其前面的字元至少m次,至多n次 \{m,\}:至少m次
位置錨定
^:托字元,行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側
單詞:非特殊字元組成的連續字元(字元串)都稱為單詞
\<或\b:詞首錨定,用於單詞模式的左側 \>或\b:詞尾錨定,用戶單詞模式的右側 \<PATTERN\>:匹配完整單詞
分組及引用
分組: \(\):將一個或多個字元捆綁在一起,當做一個整體進行處理 後向引用:引用前面的分組括弧中的模式所匹配到的字元 分組括弧中的模式匹配到的內容或被正則表達式引擎自動記錄於內部的變數中: \1:模式從左側起,第一個左括弧及與之匹配的右括弧之間模式匹配到的內容 \2:模式從左側起,第二個左括弧及與之匹配的右括弧之間模式匹配到的內容 以此類推
舉例:
1.顯示/etc/passwd文件中不以/bin/bash結尾的行
[root@localhost tmp]# grep -v "/bin/bash$" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin ...... gdm:x:42:42::/var/lib/gdm:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
2.找出/etc/passwd文件中的兩位或三位數字
[root@localhost tmp]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ...... sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
3.找出etc/grub2.cfg文件中,以至少一個空白字元開頭,且後面非空白字元的行;
[root@localhost tmp]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg load_env set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true set default="${saved_entry}" menuentry_id_option="--id" menuentry_id_option="" set saved_entry="${prev_saved_entry}" save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true
4.找出"netstat -tan"命令的結果中以LISTEN後跟0,1或多個空白結尾的行
[root@localhost tmp]# netstat -tan | grep "LISTEN[[:space:]]*$" tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::111 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN
擴展正則表達式元字元:
字元匹配
. :匹配任意單個字元;
[]:匹配指定範圍內的任意單個字元;
特殊匹配:[:digit:] 匹配任意單個數字
[:lower:] 匹配任意單個小寫字母
[:upper:] 匹配任意單個大寫字母
[:alpha:] 匹配任意單個字母
[:alnum:] 匹配任意單個字母或數字
[:punct:] 匹配任意單個符號
[:space:] 匹配單個空格
[^]:匹配指定範圍外的任意單個字元;
匹配次數
用在要指定其出現的次數的字元後面,用於限制其前面字元出現的次數,預設工作於貪婪模式。
*:匹配其前面的字元任意次數:0,1,多次 .*:匹配任意長度的任意字元 ?:匹配其前面的字元0次或者1次; +:匹配其前面的字元1次或者多次; {m}:匹配其前面的字元m次 {m,n}:匹配其前面的字元至少m次,至多n次 {m,}:至少m次
位置錨定
^:托字元,行首錨定,用於模式的最左側
$:行尾錨定,用於模式的最右側
單詞:非特殊字元組成的連續字元(字元串)都稱為單詞
\<或\b:詞首錨定,用於單詞模式的左側 \>或\b:詞尾錨定,用戶單詞模式的右側 \<PATTERN\>:匹配完整單詞
分組及引用
分組: ():將一個或多個字元捆綁在一起,當做一個整體進行處理 後向引用:引用前面的分組括弧中的模式所匹配到的字元 分組括弧中的模式匹配到的內容或被正則表達式引擎自動記錄於內部的變數中: \1:模式從左側起,第一個左括弧及與之匹配的右括弧之間模式匹配到的內容 \2:模式從左側起,第二個左括弧及與之匹配的右括弧之間模式匹配到的內容 以此類推
或
a|b:a或b C|cat:C或cat
(C|c)at:cat或Cat
小練習
1、列出當前系統上所有已經登錄的用戶的用戶名,註意:同一個用戶登錄多次,則只顯示一次
who | grep -o "^\<[[:alpha:]]*" | uniqView Code
2、取出最後登錄到當前系統的用戶的相關信息
id `who | tail -1 | grep -o "^\<[[:alpha:]]*"`View Code
3.取出當前系統上被用戶當做其預設shell的最多的那個shell
cut -d: -f7 /etc/passwd | uniq -c | sort -n | tail -1 | cut -d' ' -f7View Code
4.將/etc/passd中的第三個欄位設置最大的後10個用戶的信息全部給為大寫保存至/tmp/maxuser.txt文件中
[root@localhost ~]# sort -t: -k3 -n /etc/passwd | tail -10 | tr 'a-z' 'A-Z' &> /tmp/maxuser.txtView Code
5.取出當前主機的IP地址
ifconfig | grep -Eo "([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4])\.([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])\.([0-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-5])\.([1-9]|[1-9][1-9]|1[0-9][0-9]|2[0-5][0-4])[[:space:]]" |grep -v "127.0.0.1" 或者 ifconfig | grep "[[:space:]*]\<inet\>" | cut -d' ' -f10 | grep -v "127.0.0.1"View Code
6.列出/etc目錄下所有已.conf結尾的文件的文件名,並將其名字轉換為大寫後保存至/tmp/etc.conf文件中
find /etc -name "*.conf" | egrep -o "[^/][^/]*$" | tr 'a-z' 'A-Z' > /tmp/etc.testView Code
7.顯示/var目錄下一級子目錄或文件的總數
ls /etc/ | wc -lView Code
8.取出/etc/group第三個欄位數值最小的10個組的名字
sort -t: -k3 -n /etc/group | head -10 | cut -d: -f1View Code
9.將/etc/fstab和/etc/issue文件的內容合併為同一個內容後保存至/tmp/etc.test文件中
cat /etc/issue /etc/fstab | tee /tmp/etc.test &> /dev/nullView Code
10.顯示/proc/meminfo文件中以大寫或者小寫S開頭的行,用兩種方式
[root@localhost home]# egrep "^[sS]" /proc/meminfo [root@localhost home]# egrep -i "^s" /proc/meminfoView Code
11.顯示/etc/passwd文件中其預設shell為非/sbin/nologin的用戶
[root@localhost home]# grep -v "/sbin/nologin" /etc/passwdView Code
12.顯示/etc/passwd文件中其預設shell為/bin/bash的用戶
[root@localhost home]# grep "/bin/bash" /etc/passwdView Code
13.找出/etc/passwd文件中的一位或兩位數
[root@localhost /]# egrep "\<[[:digit:]]{1,2}\>" /etc/passwdView Code
14.顯示/boot/grub2/grup.cfg中至少一個空白字元開頭的行
[root@localhost /]# egrep "^[[:space:]]+[^[:space:]]" /boot/grub2/grub.cfgView Code
15.顯示/etc/rc.d/rc.local文件中以#開頭,後面跟至少一個空白字元,而後又至少一個非空白字元的行
[root@localhost /]# egrep "^#[[:space:]]+[^[:space:]]" /etc/rc.d/rc.local # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES # It is highly advisable to create own systemd services or udev rules # to run scripts during boot instead of using this file. # In contrast to previous versions due to parallel execution during boot # this script will NOT be run after all other services. # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure # that this script will be executed during boot.View Code
16.打出netstat -tan命令執行結果以'LISTEN'後跟空白字元結尾的行
[root@localhost /]# netstat -tan | egrep "LISTEN[[:space:]]+" tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::111 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTENView Code
17.添加用戶bash,testbash,basher,nologin(此一個用戶的shell為/sbin/nologin),而後找出當前系統上其用戶名和預設shell相同的用戶的信息
[root@localhost /]# useradd bash [root@localhost /]# useradd testbash [root@localhost /]# useradd basher [root@localhost /]# useradd -s /sbin/nologin nologin [root@localhost /]# egrep "^(\<[a-z]+\>).*\1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:2004:2004::/home/bash:/bin/bash nologin:x:2007:2007::/home/nologin:/sbin/nologinView Code