grep、sed、awk的使用筆記
學習之前,我們要先建立兩個文件來練習。
vim a.txt
cp /etc/passwd passwd
第一章 grep和正則表達式
一、 正則表達式
1、單個字符
特定字符:某個具體字符(grep ‘1‘ passwd)
範圍內字符: []括號裏邊代表的是1個字符。
數字字符:[0-9],[259]
小寫字符:[a-z]
大寫字符:[A-Z]
例:
grep ‘[0-9]‘ passwdgrep ‘[259]‘ passwd
grep ‘[a-z]‘ passwd
grep ‘[a-zA-Z]‘ passwd (包括所有字母)
反向字符:^
取反:[^0-9] , [^0] (‘^’一定要放倒中括號裏邊才行)
grep ‘[^0-9]‘ passwd(過濾以數字開頭的行)
任意字符:? .
.代表任何1個字符。
2、邊界字符:頭尾字符
^:表示以某字符開頭。(註意[^]的意思是取反)
$:表示以某字符結尾。
例如:grep ‘^root‘ passwdgrep ‘bash$‘ passwd
^$:表示空行。
元字符(代表普通字符或特殊字符)
\w:匹配任何字類字符(數字、字母、下劃線)
\W: 匹配任何非字類字符(數字、字母、下劃線)
\b:代表單詞分隔
例:grep ‘\w‘ passwd
grep ‘\W‘ passwd
grep ‘\bx\b‘ passwd
字符串?? ‘root’‘1000’‘n…x’
[A-Z][a-z]:
[0-9][0-9]:匹配挨在一起的2位數,如45,56,28,96
3、重復字符
*:0次或者多次匹配前面的字符
+:1次或者多次匹配前面的字符(+不能直接用,需要加\來轉義)
?:0次或1次匹配前面的字符(?不能直接用,需要加\來轉義)
例:grep ‘se*‘ a.txt
grep ‘se\+‘ a.txt
grep ‘se\?‘ a.txt
如果要匹配多字符重復,需要用括號將多字符括起來。
例:
grep ‘\(se\)*‘ a.txt??? 註意()不能直接使用,需要轉義,前邊加\。
重復特定次數:? {n,m}? 代表重復n-m次
那麽我們就可以這樣理解為:
*:{0,1}
+:{1,}
?: {0,1}
例:過濾重復數字2-3次的行
grep ‘[0-9]\{2,3\}‘ passwd???? 註意:{}也是需要轉義的符號,前邊加\.
任意字符串的表示: .*
例:^r.* 表示以r開頭的任意字符串。
n.*x:表示n和x之間有任意個字符
n...x:表示n和x之間有3個任意字符
邏輯或: | (也是需要轉義,前邊加\)
例:過濾掉#開頭的行和空行
grep -v ‘^$\|^#‘ nginx.conf(-v是取反的意思)
案例:
1、 匹配4-10位的QQ號碼
grep ‘^[0-9]\{4,10\}$‘ a.txt
2、 匹配15或者18位×××號(支持帶X的)
分析,×××開始位不能為0,結尾包括x,中間部分是13位或16數字重復。(註意轉義符號)
grep ‘^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$‘ a.txt
3、 匹配密碼(由數字、字母和下劃線組成)
grep ‘^\w\+$‘ a.txt
說明:
grep高亮顯示:grep =’grep –color=auto’這樣寫只是臨時生效,斷開重新連接後就不行了。如果想永久生效,可以寫進全局變量文件中:/etc/profile
在文件的結尾添加:
alias grep=‘grep --color=auto‘
[root@rescue ~]# source /etc/profile
這樣就可以了。
第二章 巧妙破解sed
1、 sed是如何進行文本處理的?
(1)命令行格式
sed [options] ‘command’ file(s)
optiones(選項): -e ; -n
command命令:行定位(正則)+sed命令(操作)
1、sed操作命令
-p 打印相關的行,要和-n參數一起使用。
例:sed -n ‘p‘ passwd如果不加-n會每行顯示兩次。
定位1行:x或/正則/?????? 用x(代表數字)或者正則表達式來定位,正則兩邊要加/隔開。
例:打印第10行的內容。
sed -n ‘10p‘ passwd
sed -n ‘/redis/p‘ passwd
定位多行:x,y 或者/正則/
例:打印10-20行的內容:
nl passwd |sed -n ‘10,20p‘
nl passwd |sed -n ‘/uucp/,/redis/p‘兩個例子的效果是一樣的。
打印除第10行的所有內容:用“!”
nl passwd |sed -n ‘10!p‘
打印除10-20的所有行:
nl passwd |sed -n ‘10,20!p‘
定位間隔幾行:x~y
例:間隔5行打印
nl passwd |sed -n ‘1~5p‘
基本操作命令(2)
a(新增行)
i (插入行)
c(替代行)
d(刪除行)
例:在第5行後面增加“=========”
nl passwd |sed ‘5a ==========‘
在1-5行後分辨增加“=========”
nl passwd |sed ‘1,5a ==========‘
在第5行前面插入“=========”
nl passwd |sed ‘5i ==========‘
在1-5行前分辨插入“=========”
nl passwd |sed ‘1,5i ==========‘
替換22行內容為“11111”
nl passwd | sed ‘22c 11111‘
22-24行替換為“11111”
nl passwd | sed ‘20,24c 111111111‘
刪除“redis”行
nl passwd |sed ‘/redis/d‘
實戰應用一:優化服務器配置
在ssh的配置文件行尾加入相應文本:
Port 52112
PermitRootLogin no
[root@rescue ~]# sed ‘$a \ Port 52112 \n PermitRootLogin no‘ ssh_config
解釋一下:
$a代表在行尾增加
\Port 52112:在前邊加“\和兩個空格是為了對齊,\為轉義符”
\n:表示回車
如果:[root@rescue ~]# sed -i ‘$a \ Port 52112 \n PermitRootLogin no‘ ssh_config
其中-i表示直接修改源文件
實例2、刪除a.txt文本中的空行
sed ‘/^$/d‘ a.txt由於^$屬於正則,所以要用//隔離起來。
實例3、服務器日誌處理
找出log日誌中error信息。
sed -n ‘/error/p‘ secure
基本操作命令(2)
-s(替換):原內容/,#替換後內容,其中/,#隨便一個都可以
例:將passwd文件中的nologin全部替換為qqqqq
sed ‘s/nologin/qqqqqqqqqq/‘ passwd
-g(全局)
例:將passwd文件中所有的:替換為%
sed ‘s/:/%/g‘ passwd
實戰應用:
篩選數據,篩選出eth0的ip。(思路,將IP前後的內容全部替換為空)
ifconfig eth0 |sed -n ‘/inet/p‘ |sed ‘s/inet.*r://‘|sed ‘s/B.*$//‘
高級操作命令:
{}:多個sed命令同時使用,用;分開
例如:在passwd文件中刪除20-24行,並替換nologin為qqq
nl passwd |sed ‘{20,24d;s/nologin/qqqq/}‘
n:讀取下一個輸入行(用下一個命令處理)
例如:打印偶數行:
nl passwd |sed -n ‘{n;p}‘或:nl passwd |sed -n ‘1~2p‘
打印奇數行:
nl passwd |sed -n ‘{p;n}‘或nl passwd |sed -n ‘2~2p‘
&:替換固定字符串
例:passwd文件中的用戶名後邊加空格
sed ‘s/^[a-z_-]\+/& ‘ passwd
解釋:
^[a-z_-]的意思是以a-z任意字母開頭後邊跟橫線的內容
+的意思是重復1或者多次。
&的後邊跟著一個空格,&代表的是前面^[a-z_-]。
大小寫轉換
\u???? 表示對首字母轉換為大寫
\l????? 對首字母轉換為小寫
\U??? 對一串字符轉換成大寫
\L???? 對一串字符轉換成小寫
案例一:將用戶名的首字母轉換為大寫
[root@rescue ~]# sed ‘s/^[a-z_-]\+/\u/‘ passwd
\(?? \)? 替換某種(部分)字符串 \1,\2
\1就代表第一個括號中的內容,\2就代表第二個括號中的內容
例:獲取eth0網卡的IP地址
ifconfig eth0 |sed -n ‘/inet/p‘ |sed ‘s/ine.*r:\([0-9.]\+\) .*$/\1/‘
r:復制指定文件插入到匹配行
w:復制匹配行拷貝指定文件裏
例:文件123.txt
[root@rescue ~]# cat 123.txt
3823098908230
3823232343
833121332文件abc.txt
[root@rescue ~]# cat abc.txt
dasajlkl
asgfsdfsfsd
ferewejlfdas
現將讀取123.txt的內容插入到abc.txt的第一行之後
sed ‘1r 123.txt‘ abc.txt
復制123.txt內容到abc.txt的第一行之後
sed ‘1w abc.txt‘ 123.txt
q:退出sed
例:匹配到第10行後退出sed
nl passwd |sed ‘10q‘
第三章 輕松玩轉awk
alk是一款文本與數據處理工具,可以統計、制表、編程等。
命令格式:
awk [option] ‘command’ file
awk的內置參數一:
$0:?????? 表示當前整個行
$1:?? 每行第一個字段
$2:?? 每行第二個字段
$3:?? 每行第三個字段
分隔符: -F
例:打印passwd文件中的用戶名一列
awk -F ‘:‘ ‘{print $1}‘ passwd
打印用戶名和UID兩列?????
awk -F ‘:‘ ‘{print $1,$3}‘ passwd?????????????????????? 打印兩項內容用都好隔開
或:awk -F ‘:‘ ‘{print $1" "$3}‘ passwd????????? 雙引號中間加一個空格。
增加用戶名和UID兩列說明字符:
awk -F ‘:‘ ‘{print "User:"$1"\t""UID:"$3}‘ passwd
“User:”和”UID”是$1和$3前邊增加的說明,”\t”表示的是table鍵。
awk的內置參數二:
NR:行號,每行的記錄號
NF:列號,字段數量變量
FILENAME:正在處理的文件名
例:
[root@rescue ~]# awk -F ‘:‘ ‘{print NR,NF}‘ passwd
案例一:
顯示/etc/passwd每行的行號,每行的列數,對應行的用戶名(兩種方法:print,printf)
方法一:awk -F ‘:‘ ‘{print "Line:"NR, "Col:"NF,"User:"$1}‘ passwd
標紅部分都是字段的說明,用引號引起來。
方法二:awk -F ‘:‘ ‘{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}‘ passwd
\n表示回車符,不加的話不會斷行。
案例二:
顯示/etc/passwd中用戶ID大於100的行號和用戶名 (使用if….else)
awk -F ‘:‘ ‘{if ($3>100) print "Line:"NR,"User:"$1}‘ passwd
案例三:
在服務器log中找出“error”的發生日期
方法一:sed -n ‘/error/p‘ secure | awk ‘{print $1,$2,$3}‘
方法二:awk ‘/error/{print $1,$2,$3}‘ secure
awk——邏輯判斷式
~:匹配正則表達式
!~:不匹配正則表達式
==: 等於
!=:不等於
<:小於
>:大於
例1:匹配passwd文件第一個字段是否為m,是m則打印出來
awk -F ‘:‘ ‘$1~/^m.*/{print $1}‘ passwd
例2:匹配passwd文件中UID大於100的則輸出用戶名和UID
awk -F ‘:‘ ‘$3>100{print $1,$3}‘ passwd
awk——擴展格式
BEDIN{print “start”} command END {PRINT “END”}
例:
awk -F ‘:‘ ‘BEGIN{print "Line Col User"}{print NR,NF,$1}END{print"-----"FILENAME"-----"}‘ passwd
awk處理過程
案例一:統計當前文件夾下的文件/文件夾占用的大小
ls -l |awk ‘BEGIN{size=0}{size+=$5}END{print "size is " size/1024/1024"M"}‘
案例二:統計顯示/etc/passwd的賬戶總人數
awk -F ‘:‘ ‘BEGIN{count=0}$1!~/^$/{count++}END{print " count = "count}‘ passwd
grep、sed、awk的使用筆記