Linux文本處理三劍客(grep、sed、awk)及正則表達式(上)

在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

  1. :space: ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章