一、Linux文本處理三劍客
linux上主要處理文件的工具主要有grep家族(grep,egrep,fgrep)、awk、sed
grep:文本搜索工具;根據給定的”pattern“對文本進行搜索
sed:主要是以行爲單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作
awk:是一個強大的文本分析工具
二、文本查找工具grep
grep:(Globally search a Regular Expression and Print);
作用:文本搜索工具,根據用戶所指定的pattern(過濾條件)對目標文本逐行進行匹配查; 打印出符合條件的行;grep支持正則表達式,正則表達式一般趨向於最大長度匹配,也就是 所謂的貪婪模式。
正則表達式:Regular Expression
正則表達式就是處理字符串的方法,它是以行爲單位來進行字符串的處理行爲,可以讓用戶輕易達 到查找、刪除、替換某特定字符串的處理程序
分類:
基本正則表達式:BRE Basic Regular Expression
擴展正則表達式:ERE Expand Regular Expression
grep家族:
grep: 支持使用基本正則表達式
egrep:支持使用擴展正則表達式
fgrep:不支持使用正則表達式
二grep命令的主要參數:
grep [OPTIONS] PATTERN [FILE...]
PATTERN是過濾的條件,可以理解爲我們想要找到的內容。
常用選項:
--color=auto:對匹配到的文本着色後高亮顯示
[root@localhost ~]# alias alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto'
# alias是查看系統中的有哪些命令被替換了;如果不需要命令替換可以使用unalias NAME 刪除替換。
-i:忽略字符大小寫
[root@localhost ~]# grep "oot" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin
# 可以看出只要包含pattern,也就是oot的行都會被匹配到,這一特性就是正則表達式的貪婪模式。
-o:僅顯示匹配 到的文本自身
[root@localhost ~]# grep -o "oot" /etc/passwd oot oot oot oot oot oot
# -o選項列出所有匹配pattern中的內容,而不是行!
-v, --invert-match:反向匹配
[root@localhost ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [root@localhost ~]# grep -v "E" /etc/default/useradd # useradd defaults file GROUP=100
-E:支持擴展的正則表達式
# grep -e=egrep
-q, --quiet, --silient:靜默模式,不輸出任何信息
[root@localhost ~]# grep -q "O" /etc/default/useradd [root@localhost ~]# echo $? 0 [root@localhost ~]# grep -q "OOO" /etc/default/useradd [root@localhost ~]# echo $? 1
# grep 靜默模式不會有信息打印到屏幕上,但是我們可以通過執行結果得知grep是否匹配到。通過echo "$?" 顯示出上個命令執行結果,0表示上條命令執行成功,1表示失敗。
-P 支持使用prel正則表達式
-e PATTERN 進行多模式匹配
[root@localhost ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes grep -e "HO" -e "RO" /etc/default/useradd GROUP=100 HOME=/home
匹配上下文:
-A NUM 連同後面#行顯示 #爲非負整數
[root@localhost ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [root@localhost ~]# grep -A 2 "IN" /etc/default/useradd INACTIVE=-1 EXPIRE= SHELL=/bin/bash
-B NUM 連同前面#行顯示 #爲非負整數
[root@localhost ~]# grep -B 2 "IN" /etc/default/useradd GROUP=100 HOME=/home INACTIVE=-1
-C NUM 連同前後#行一起顯示 #爲非負整數
[root@localhost ~]# grep -C 2 "IN" /etc/default/useradd GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash
三、基本正則表達式 :
①字符匹配:
.:匹配任意單個字符
[root@localhost ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [root@localhost ~]# grep "M" /etc/default/useradd HOME=/home CREATE_MAIL_SPOOL=yes [root@localhost ~]# grep "M..L" /etc/default/useradd CREATE_MAIL_SPOOL=yes
[ ]:匹配範圍內的任意單個字符
[root@localhost ~]# grep "[MS]" /etc/default/useradd HOME=/home SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
^ :匹配範圍外的任意單個字符
[root@localhost ~]# grep "^[MS]" /etc/default/useradd SHELL=/bin/bash SKEL=/etc/skel
[:digit:]:所有數字
[root@localhost ~]# grep "[[:digit:]]" /etc/default/useradd GROUP=100 INACTIVE=-1
[:lower:]:所有小寫字母
[root@localhost ~]# grep "[[:lower:]]" /etc/default/useradd # useradd defaults file HOME=/home SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
[:upper:]:所有大寫字母
[root@localhost ~]# grep "[[:upper:]]" /etc/default/useradd GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
[:alpha:]:所有字母
[root@localhost mnt]# cat test innode innode table innode table superblock ext2 exr3 83 82 5400 7200 [root@localhost mnt]# grep "[[:alpha:]]" /mnt/test innode innode table innode table superblock ext2 ext3
[:alnum:]:所有字母和數字
[root@localhost mnt]# grep "[[:alnum:]]" /mnt/test innode innode table innode table superblock ext2 exr3 83 82 5400 7200
[:space:]:空白
[:blank:]:空格和TAB
[:punct:]:所有標點符號
②匹配次數: 非負整數
用限制其前面的字符要出現的次數;默認工作於貪婪模式(只要找到符合的內容整行顯示出來);
*:匹配前面的字符任意N次
[root@localhost mnt]# cat test3 c abcd acccd bccca [root@localhost mnt]# cat test3 c abcd acccd bccca
#前面的字符可以0次,1次....N次
\+:匹配前面的字符至少1次
[root@localhost mnt]# grep "d\+" /mnt/test3 abcd acccd
\?:匹配前面的0次或1次
[root@localhost mnt]# grep "d\?" /mnt/test3 c abcd acccd bccca
\{m\}:其前面的字符出現m次
[root@localhost mnt]# grep "c\{3\}" /mnt/test3 acccd bccca
\{m,n\}:其前面的字符出現m-n次 [m,n]
[root@localhost mnt]# grep "c\{1,3\}" /mnt/test3 c abcd acccd bccca
\{0,n\}:出現0-n次
[root@localhost mnt]# grep "c\{0\}d" /mnt/test3 abcd acccd
\{m,\}:至少出現m次
[root@localhost mnt]# grep "c\{3,\}d" /mnt/test3 acccd
③位置錨定
用來限制所匹配到的文本所出現在目標文本的位置。
^:行首錨定;用於模式的最左側,^PATTERN
[root@localhost mnt]# tail -6 /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin tom:x:1000:1000:mageedu:/home/mageedu:/bin/bash [root@localhost mnt]# tail -6 /etc/passwd | grep "^n" nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin
$:行尾錨定;用於模式的最右側,PATTERN$
[root@localhost mnt]# tail -6 /etc/passwd | grep "n$" nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
^PATTERN$:要讓PATTERN完全匹配一整行
[root@localhost mnt]# cat test4 root root 123 root1234 [root@localhost mnt]# grep "^root1234$" test4 root1234
^$:空行
[root@localhost mnt]# cat /etc/issue \S Kernel \r on an \m Welcome [root@localhost mnt]# grep -v "^$" /etc/issue \S Kernel \r on an \m Welcome
# -v用來匹配pattern以外的內容 用來顯示出空行 ,配合wc可以計算空白行的數量
^[[:space:]]*$ 用於使用^$查找不到空白行的情況
[root@localhost mnt]# cat test4 root root 123 root1234 [root@localhost mnt]# grep "^$" /mnt/test4 |wc -l 0 [root@localhost mnt]# grep "^[[:space:]]*$" /mnt/test4 |wc -l 2
\<或\b:詞首錨定,用於限制匹配單詞左側,\<PATTERN, \bPATTERN
[root@localhost mnt]# grep "\<c" /etc/passwd colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin chrony:x:993:990::/var/lib/chrony:/sbin/nologin
\>或\b:詞尾錨定,用於限制匹配單詞右側,PATTERN\>, PATTERN\b
[root@localhost mnt]# grep "S\>" /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
\<PATTERN\>:單詞錨定,精確匹配整個單詞
[root@localhost mnt]# grep "\<root\>" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
④分組與引用:
\(PATTERN\):將此PATTERN匹配到的字符當作一個整體,分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中
可以理解爲一個括號對應一個變量,變量爲$1,$2,$3.....
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
\1: \(pat2\)pat3\(pat4\(pat5\)pat6\)匹配到的結果
\2:\(pat4\(pat5\)pat6\)匹配到的結果
....
[root@localhost mnt]# grep "^\([[:alnum:]]\{1,\}\)\>.*\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
四、文本查找工具egrep :
支持使用擴展正則表達式的grep命令,相當於grep -E;使用的方法和grep基本上沒什麼不同,\除了詞首錨定和詞尾錨定都可以去除。
egrep [OPTIONS] PATTERN [FILE...]
①字符匹配:
.:匹配任意單個字符
[ ]:匹配範圍內的任意單個字符
[^ ]:匹配範圍外的任意單個字符
[:digit:]:數字
[:lower:]:所有小寫字母
[:upper:]:所有大寫字母
[:alpha:]:所有字母
[:alnum:]:所有字母和數字
[:space:]:空白
[:blank:]:空格和TAB
[:punct:]:所有標點符號
②匹配次數:
用限制其前面的字符要出現的次數;默認工作於貪婪模式(只要找到符合的內容整行顯示出來)
*:匹配前面的字符任意次(0,+∞)
+:匹配前面的字符至少1次
?:匹配前面的0次或1次
{m}:其前面的字符出現m次,m爲非負整數
{m,}:其前面的字符出現m次,m爲非負整數[m,n]
③位置錨定
用來限制模式所匹配到的文本只能出現於目標文本的位置
^:行首錨定;用於模式的最左側,^PATTERN
$:行尾錨定;用於模式的最右側,PATTERN$
^PATTERN$:要讓PATTERN完全匹配一整行
^$:空行
^[[:space:]]*$
\<或\b:詞首錨定,用於限定單詞的左側,\<PATTERN, \bPATTERN
\>或\b:詞尾錨定,用於限定單詞的右側,PATTERN\>, PATTERN\b
\<PATTERN\>:單詞錨定,精確匹配整個單詞
④分組與引用:
(PATTERN):將此PATTERN匹配到的字符當作一個整體,分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中
可以理解爲一個括號對應一個變量,變量爲$1,$2,$3.....
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat
這裏就用之前grep的例子作爲比較
1.分組中\可以去掉
[root@localhost mnt]# egrep "^([[:alnum:]]{1,})\>.*\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
2.詞首詞尾的錨定\不能去掉
[root@localhost mnt]# egrep "\<root\>" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
3.查找UID大於1000的數字
[root@localhost mnt]# egrep -v "\<([0-9]|[1-9][0-9]|[1-9][0-9][0-9])\>" /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin