在Linux中,文本處理無非是對文本內容做查看、修改等操作。本章將介紹Linux中常用的文本處理命令,以及被稱爲Linux三劍客的 grep、sed 和 awk 命令。三劍客以正則表達式爲基礎,熟練使用這三個工具可以使我們的運維工作大大滴提高效率。在學習這三個命令之前,我們首先簡單瞭解一下正則表達式,學正則表達式之前我們先看一下面的通配符和特殊字符:
一、通配符、特殊符號
1.1常用的通配符及含義
字符 | 含義 |
---|---|
* | 任意字符 |
? | 任意單個字符 |
[] | 範圍 |
{} | 序列 |
例:
#-----任意字符
[root@localhost ~]# ls /etc/*pass #列出/etc/目錄下以pass結尾的所有內容
ls: cannot access /etc/*pass: No such file or directory #沒有相應的內容
[root@localhost ~]# ls /etc/pass* #列出/etc/目錄下以pass開頭的所有內容
/etc/passwd /etc/passwd- #匹配到有兩項
###-----序列
[root@localhost ~]# touch a{01..10} #連續創建10個以a開頭的普通文件
[root@localhost ~]# ls
1. a03 a06 a09 adduser.sh his.txt passwd.txt
a01 a04 a07 a10 anaconda-ks.cfg ifconfig
a02 a05 a08 aa. err.txt ipaddr
#-----範圍
[root@localhost ~]# touch asda was2 23sad 323asd sad2 s2sa 2sdaf a
[root@localhost ~]# ls [a-z]
a
#-----任意單個字符
[root@localhost ~]# ls /etc/host?
/etc/hosts
1.2特殊字符
字符 | 含義 |
---|---|
‘’ | 強引用,把其中的字符看成一個整體,不解析變量 |
“” | 弱引用,有變量解析變量 |
`` | 命令,優先執行 |
^ | 匹配字符串開頭 |
$ | 匹配字符串結尾 |
; | 不管前面的命令執行成功與否都會執行下一個命令 |
&& | 前面的命令執行成功才執行後面的命令 |
ll | 前面的命令執行失敗才執行後面的命令 |
# | 註釋;命令提示符身份 |
$ | 變量;命令提示符身份 |
! | 取反;調用之前使用過的命令 |
<,>,<<,>>,&> | 重定向 |
l | 管道符,前面的輸出作爲後面的輸入 |
~ | 家目錄 |
. | 當前目錄;在當前文件名面前表示隱藏;chown改屬組 |
… | 上一級目錄 |
- | 文件類型:普通文件;cd - 進入上一次目錄;su - 完全切換用戶 |
+ | chmod加權限 |
例:
#-----弱引用
[root@localhost ~]# NAME=xiaoming
[root@localhost ~]# echo "my name is $NAME"
my name is xiaoming
#-----強引用
[root@localhost ~]# echo 'my name is $NAME'
my name is $NAME·
#------序列
[root@localhost ~]# touch a ab
[root@localhost ~]# ls a{,b}
a ab
[root@localhost ~]# cp a{,.back}
[root@localhost ~]# ls
a ab aback a.back anaconda-ks.cfg
二、正則表達式
正則表達式(Regular Expression)是一種字符模式,主要由一些元字符組成,用於在指定字符中匹配指定的字符,它將匹配被查找的行中任何位置出現的相同的模式。
正則表達式的作用:
Linux系統支持正則表達式的命令有find、grep、sed、awk
可以對大量的字符文件進行配置和處理,而且是非交互式的
可以過濾、匹配、打印相關的字符串
其實正則表達式就是一些特殊字符,只不過賦予了其特殊含義,其又分爲基本正則表達式和擴展正則表達式:
基礎正則表達式字符 | 描述 |
---|---|
\ | 轉義符 |
. | 匹配任意單個字符 |
[^] | 匹配除了其內部以外的任意一個字符 |
[] | 匹配其內部任意一個字符 |
\ + | 匹配之前的字符1次或多次 |
\? | 匹配之前的字符0次或1次 |
.* | 匹配任意長度任意字符 |
\ {n\ } | 匹配之前的項n次 |
\ {n,m \ } | 至少n次最多m次 |
{n,} | 至少n次 |
\ <或\b | 詞首錨定 |
\ >或\b | 詞尾錨定 |
[[:upper:]] | 所有大寫字母[A-Z] |
[[:lower:]] | 所有小寫字母[a-z] |
[[:digit:]] | 所有數字[0-9] |
[[:alnum:]] | 所有字母和數字[a-zA-Z0-9] |
[[:punct:]] | 所有標點符號 |
[[:space:]] | 空格 |
擴展正則表達式字符 | 描述 |
---|---|
^ | 匹配行首,在awk中則是匹配字符的開始 |
$ | 匹配行尾,在awk中則是匹配字符的結尾 |
^$ | 空行 |
& | 引用模式匹配到的整個串 |
? | 匹配之前的字符0次或1次 |
+ | 匹配之前的字符1次或多次 |
* | 匹配之前的字符0次或多次 |
. | 匹配任意單個字符,除空行外 |
() | 創建一個用於匹配的整體 |
{n} | 匹配之前的項n次 |
{n,m} | 至少連續n次最多m次 |
{n,} | 至少n次 |
l | 交替匹配;ab(cld):abc或abd |
三、實戰部分
3.1、三劍客之grep
用法:grep [OPTIONS] PATTERN [FILE…]
常用選項:
-v :反向過濾
-n :顯示行號(-n “”)
-i :忽略大小
-E :支持擴展正則表達式字符。等價於egrep
測試文件內容:
[root@localhost ~]# cat -A test.txt
linuxm $
adadasdasdadasm$
21312m$
hsj23$
khw3324ww.$
I Hate You,You BadBad$
I Love You$
$
mlinux.$
test5201ad3s14saddasssswqzlikes$
swzsadwswzsaswszswz$
MlinuxNN$
asaAaaa$
aBBBaaas$
$
$
$
MLinuxBB$
LINUX$
I Hate You,You BadBad$
I Love You $
[root@localhost ~]#
//排除空行
//找出以M或m開頭的行
//匹配所有內容
//找出以m結尾的行
找出以數字開頭的行:
//找出以.結尾的行
//匹配a出現一次或多次
//匹配a至少連續出現兩次至多連續出現4次
//詞首、詞尾錨定(事實證明這個不管是用grep還是egrep符號的\都是不能省略的)
//找出包含空格的行、找不包含空格的行
(注意:egrep -n ‘[[:space:]]’ test.txt 找出了包含空行的行而egrep -n ‘[1]’ test.txt 不排除含有空格的行,排除了空行)
//以空格開頭且後面是非空格的行
grep "^[[:space:]].+[^[:space:]]+" -nE /etc/grub2.cfg
:space: ↩︎