egrep:
能夠實現文本處理的三劍客:
文本過濾工具:grep
(其實grep家族中有三個工具,也就是實現文本過濾的工具有三個,grep, egrep,fgrep)
文本編輯工具:sed
文本報告生成器(格式化文本):awk
其實文本過濾工具除了grep之外還有egrep,fgrep
grep:基本正則表達式;
-E:選項表示支持擴展正則表達式;
-F:選項表示支持fgrep正則表達式;
egrep:擴展正則表達式;
-G:選項表示支持基本正則表達式;
-F:選項表示支持fgrep正則表達式;
fgrep:不支持正則表達式;
-E:選項表示支持擴展正則表達式;
-G:選項表示支持基本正則表達式;
所以上面的三種文本過濾工具,其中的任意一個命令都可以通過選項來支持其他的命令
egrep:
支持擴展的正則表達式實現類似於grep文本過濾功能; grep -E也相當於egrep
egrep [OPTIONS] PATTERN [FILE......]
選項:
-i -o -v -q -A -B -C
-G:支持基本正則表達式;
-F:支持fgrep正則表達式;
擴展正則表達式的元字符:
.:匹配任意單個字符;
[]:匹配指定範圍內的任意單個字符;
[^]:匹配指定範圍外的任意單個字符;
匹配次數:
注意:擴展正則表達式的匹配選項模式與基本正則表達式的匹配次數的寫法,不同的地方是:基本正則表達式有反斜線的,在擴展正則表達式中沒有了反斜線“\”
*:匹配任意次,0次,1次,或多次。
?:0次或1次,其前面的字符是可有可無的;
+:精確匹配其前面的字符至少一次;
{m}:其前面的字符m次;
{m,n}:匹配至少m次,至多n次;
{0,n}:最多匹配次;
{m,}:最少匹配m次;
位置錨定:
^:行首錨定;
$:行尾錨定;
\<,\b:詞首錨定;
\>,\b:詞尾錨定;
分組及引用:
():分組,括號內的模式匹配到字符會被記錄於正則表達式引擎的內部中;
後向引用:\1 \2
或:
a|b:a或者b;
C|cat:表示的意思爲,C或者是cat;
(c|C)at:表示cat,或者表示Cat;
練習:用擴展正則表達式來顯示:
(1)顯示/etc/passwd文件中不以/bin/bash結尾的行;
[root@centos6 ~]# egrep -v "/bin/bash$"/etc/passwd
[root@centos6~]# grep -v"/bin/bash$" /etc/passwd
[root@centos6~]# grep -E -v "/bin/bash$" /etc/passwd
(2)找出/etc/passwd文件中兩位數或三位數;
錯誤的寫法:[root@centos6 ~]# grep"[[:digit:]]\{2,3\}" /etc/passwd
正確的寫法:[root@centos6 ~]# grep "\<[[:digit:]]\{2,3\}\>"/etc/passwd
或:[root@centos6 ~]# grep"\<[0-9]\{2,3\}\>" /etc/passwd
grep -E"\<[0-9]{2,3}\>" /etc/passwd //擴展正則表達式時,次數匹配時,可以不需 要轉義的繩子。
總結:這裏當匹配確定的幾位數時,我們一定要錨定開頭和結尾,因爲,不錨定的話, 五位數,六位數,等等它都包含三位數。
(3)找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且後面非空白字符的行;
錯誤的寫法:grep -v '[[:space:]]$'/etc/rc.d/rc.sysinit | grep '^[[:space:]]\+'
正確的寫法:[root@centos6 ~]# grep"^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit
(4)找出“netstat-tan”命令的結果中以“LISTEN”後跟0,1,或多個空白字符結尾的行;
分組及引用:
錯誤的寫法:[root@centos6~]# netstat -tan | grep "LISTEN[[:space:]].*$"
正確的寫法:[root@centos6~]# netstat -tan | grep"LISTEN[[:space:]]*$"
練習:
1.找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行;至少有三種實現方式;
解:
(1)[root@centos6~]# grep "^[S,s]" /proc/meminfo
[root@centos6~]# grep -i "^s"/proc/meminfo
(2)[root@centos6~]# grep -i "^\<s"/proc/meminfo
(3)[root@centos6~]# egrep -i "^\<s"/proc/meminfo
(4)[root@centos6~]# grep -E "^(S|s)" /proc/meminfo
2.顯示當前系統上root,centOS,user1用戶的相關信息;
解:
[root@centos6~]# grep -E"^(\<root\>|\<centos\>|\<user1\>)" /etc/passwd
或:
[root@centos6~]# grep -E"^(root|centos|user1)\>" /etc/passwd
3.找出/etc/rc.d/init.d/functions文件中某單詞後面跟一個小括號的行;
解:
[root@centos6~]# grep -o -E "[_[:alpha:]]+\(\)"/etc/rc.d/init.d/functions
4.使用echo命令輸出一絕對路徑,使用egrep取出基名;
解:
答案:
echo /etc/sysconfig | grep -E -o "[^/]+/?$"
分析:
我們可以用echo命令輸出一個絕對路徑,/etc/sysconfig,然後對這個 路徑取其基名,基名就是最後面的目錄或文件的基本名稱,那麼上面的路徑的基名 就是“sysconfig”,然後我們可以使用grep或egrep命令將其取出來。
我們從右邊開始取,取得內容爲不以反斜線爲行尾的“grep [^\]$”這樣我們 檢索 出來的還是整行,而不是隻顯示我們想要的基名,那麼我們就用到選項“-o”
但是僅顯示一個字母,所以我們加上一個“\+”表示從右端開始我們的字母至 少是一個,那麼合起來就是這樣寫:echo /etc/sysconfig |grep -o "[^/]\+$"
得到的結果爲:
用擴展正則表達式:echo /etc/sysconfig | grep -E -o"[^/]+$"
但是問題來了,如果我們的絕對路徑爲“/etc/sysconfig/”那麼在用上面的命令就沒有結果了:
那這種情況就是在行尾可能有一個反斜線“\”,那麼我們的匹配命令就改寫爲:
echo /etc/sysconfig/ | grep -E -o"[^/]+/$"
但是這些行尾的反斜線可有可無,那麼我們就在進行修改一下:
echo /etc/sysconfig/ | grep -E -o"[^/]+/?$"
拓展:
取出路徑名:
解:
5.找出ifconfig命令結果中的1-255之間的數值;
解:ifconfig | grep -E -o"\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
6找出ifconfig命令結果中的IP地址;
解:
7.添加用戶bash,testbash,basher以及nologin(其shell爲/sbin/nologin);而後找出 /etc/passwd文件中用名同shell名一樣的行;
解:第一步先添加用戶useradd
第二步過濾查找要找的內容: grep -E "^([^:]+\>).*\1$" /etc/passwd
fgrep:不支持正則表達式元字符:
當無需要用到元字符去編寫模式時,使用fgrep必能更好;
文本查看及處理工具:
wc,cut,sort,uniq,diff,patch
wc:
word count:單詞統計
功能:能夠顯示一個文件中的行數,單詞數,字節數;
格式:
wc[OPTION]... [FILE]... //使用的格式,命令字,選項,加上文件,文件可以有多個;
舉例:
[root@centos6~]# wc /etc/fstab
16 84899 /etc/fstab //顯示:16行,84個單詞,899個字節,(注意:這裏說的 單詞是指,連續的非特殊非特殊字符都是單詞。)
[root@centos6~]#
[root@centos6 ~]# wc -l /etc/fstab //僅顯示行數
16 /etc/fstab
[root@centos6 ~]# wc -w /etc/fstab //僅顯示單詞數
84 /etc/fstab
[root@centos6 ~]# wc -c /etc/fstab //僅顯示字節數,也可以使用“-m”
899 /etc/fstab
[root@centos6 ~]#
cut
功能:文本截取工具
格式:
cut OPTION... [FILE]...
選項:(注意特性:選項與選項參數之間可以不加空格)
-d, --delimiter=DELIM:表示指明使用什麼字段作爲分隔符,如果不指明則默認爲 使用空白字段作爲分隔符;
空白字符的表示:用兩個單引號中間加一個空格表示空白字段 : ' '
-f, --fields=LIST:表示僅保留那些字段,(選項參數有不同的表示如下用#表示數字
#:指定的單個字段;
#-#:連續的多個字段;
#,#:離散的多個字段;
舉例:
[root@centos6~]# cut -d : -f 1,7/etc/passwd //表示以冒號作爲分隔符,只保留第 一和第七字段,注意選項“-d”和選項“-f” 與他們後面的 參數之間可以有空格,也可已沒有。
sort
功能:排序
格式:
sort [OPTION]... [FILE]...
注意:我們發現很多的文本處理工具默認條件下都不會修改源文件,只是把內容從源文件中 讀出來,把處理結果輸出到屏幕上;
(sort在排序時還可以指明幾種選項,例如我們使用指定的字段進行排序,指明分隔符以後,以指定的字段進行排序,他跟“cut”一樣,默認情況下從最左側進行比較,如果不想從最左側進行比較,那麼依然需要指定分隔符)
-n:基於數值進行排序,而非字符;
-t CHAR:指定分隔符;
-k #:用於排序比較的字段;
-r:逆序排序;
-f:排序時不區分大小寫;
-u:重複的行只保留一份;(重複的行定義:連續且相同)
舉例:
[root@centos6~]# cut -d : -f 3 /etc/passwd|sort //看上去雜亂無章,其實是按照字符 進行排序的
0
1
10
11
113
12
13
14
170
173
2
27
29
3
32
38
4
42
48
497
498
499
5
500
501
502
503
504
505
506
507
6
65534
[root@centos6 ~]# cut -d : -f 3 /etc/passwd |sort -n //根據數值大小進行排序
0
1
2
3
4
5
6
7
8
10
11
12
13
14
27
29
32
38
42
48
68
69
72
74
81
89
99
113
170
如果是希望/etc/passwd文件上的每一個用戶,都可以根據其ID號大小進行排序,如果再用“cut”先切,就不是我們想要的全部顯示用戶信息又能完成排序的結果了,那麼這時我們應該用sort自己的切割機制,
[root@centos6 ~]# sort -t: -k3 -n /etc/passwd //原來的數據都保留,並且第三個字段進行排序
root:x:0:0:root:/root:/bin/bash
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
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
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@centos6 ~]# cut -d: -f7 /etc/passwd |sort -u | wc -l //查看當前系統上一共有多少個 shell
5
[root@centos6 ~]#
[root@centos6 ~]# grep "bash$" /etc/passwd |wc -l //當前bash一共有多少人用
9
[root@centos6 ~]#
uniq
功能:報告或移除重複的行
格式:
uniq [OPTION]...[INPUT [OUTPUT]]
選項:
-c, --count:統計每一行重複出現的次數;
-u,--unique:僅顯示未曾重複過的行;
-d,--repeated:僅顯示重複過的行;
舉例:
[root@centos6~]# cut -d: -f7 /etc/passwd|sort | uniq -c
9 /bin/bash //前面的9表示這種行重複出現過9次
1 /bin/sync
1 /sbin/halt
30 /sbin/nologin
1 /sbin/shutdown
[root@centos6~]#
diff
功能:逐行比較文件的不同之處;
格式:
diff [OPTION]... FILES
生成補丁文件:
diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
-u:顯示要修改的行的上下文,默認爲三行;
patch
功能:向文件打補丁
打補丁:
patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
或:
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
演示:
[root@centos6 ~]# cp -f /etc/fstab ./fstab
cp: overwrite `./fstab'? y
[root@centos6 ~]# cp -f /etc/fstab./fstab.new
[root@centos6 ~]# nano fstab.new
[root@centos6 ~]# cat fstab.new
#hahahaha
# /etc/fstab
# Created by anaconda on Tue Oct 1112:39:17 2016
#
# Accessible filesystems, by reference, aremaintained under '/dev/disk'
# See man pages fstab(5), findfs(8),mount(8) and/or blkid(8) for more info
#
UUID=2ead7599-15b0-4b11-b96d-5f9b59e2e7eb/ ext4 defaults 1 1
UUID=edb28e3e-5ee7-400f-8226-fab5fa157188/boot ext4 defaults 1 2
UUID=32376552-a128-416d-be08-0aa6acab4661/testdir ext4 defaults 1 2
UUID=091e5b14-8201-4ffc-9278-41b7acae00d9swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[root@centos6 ~]# diff fstab fstab.new
2c2
< # //表示老文件第二行的“#”給刪除了。
---
> #hahahaha //表示給老文件第二行刪除以後再新增一個“#hahahaha”作爲替換
[root@centos6 ~]#
其實上面就是告訴我們可以打補丁,打完補丁後,讓我的老文件跟新文件一模一樣
[root@centos6 ~]# diff fstab fstab.new > fstab.patch //生成補丁文件
[root@centos6 ~]# mount /dev/cdrom /media //掛載光盤
[root@centos6 ~]# yum clean all
[root@centos6 ~]# yum repolsit
[root@centos6 ~]# yum info patch //查看打補丁工具patch是否安裝上了
[root@centos6 ~]# patch -i fstab.patch fstab //打補丁
[root@centos6 ~]# cat fstab
[root@centos6 ~]# diff fstab fstab.new //再次進行比較
[root@centos6 ~]# patch -R -i fstab.patch fstab //將打好補丁的文件還原
[root@centos6 ~]# cat fstab
diff命令:
其實他的輸出風格有多種:
[root@centos6 ~]# diff fstab fstab.new
2c2
< #
---
> #hahahaha
[root@centos6 ~]# diff -u fstab fstab.new //加了選項u,就有了不同的風格
--- fstab 2016-11-0103:07:25.802174424 +0800 //----表示老文件
+++ fstab.new 2016-11-01 02:49:12.213175145 +0800 //++++表示新文件
@@ -1,5 +1,5 @@
-# //表示老文件要減去這麼一行
+#hahahaha //表示老文件加上這一行
#/etc/fstab //下面這三行表示上下文,說明我們修改的那行在什麼位置
#Created by anaconda on Tue Oct 11 12:39:17 2016
#
[root@centos6 ~]#
練習:
取出ifconfig eno16777736命令結果中的IP地址;
解:
ifconfig | head -2 | tail -1 |cut -d:-f2 | cut -d ' ' -f1
截圖如下: