grep、sed、awk的使用筆記

學習grep、sed、awk以前,確定是要先了解正則表達式。nginx

image

學習以前,咱們要先創建兩個文件來練習。正則表達式

vim a.txtredis

cp /etc/passwd passwd編程

第一章 grep和正則表達式vim

1、 正則表達式bash

1、單個字符服務器

特定字符:某個具體字符(grep '1' passwd)ssh

範圍內字符: []括號裏邊表明的是1個字符。ide

數字字符:[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]:匹配出挨在一塊兒的2個大小字母,如Gz、Af、Td

[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是取反的意思)

案例:

一、 匹配4-10位的QQ號碼

grep '^[0-9]\{4,10\}$' a.txt

二、 匹配15或者18位×××號(支持帶X的)

分析,×××開始位不能爲0,結尾包括x,中間部分是13位或16數字重複。(注意轉義符號)

grep '^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' a.txt

三、 匹配密碼(由數字、字母和下劃線組成)

grep '^\w\+$' a.txt

說明:

grep高亮顯示:grep =’grep –color=auto’這樣寫只是臨時生效,斷開從新鏈接後就不行了。若是想永久生效,能夠寫進全局變量文件中:/etc/profile

在文件的結尾添加:

alias grep='grep --color=auto'

[root@rescue ~]# source /etc/profile

這樣就能夠了。

第二章 巧妙破解sed

一、 sed是如何進行文本處理的?

image

(1)命令行格式

sed [options] ‘command’ file(s)

optiones(選項): -e ; -n

command命令:行定位(正則)+sed命令(操做)

1sed操做命令

-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表示直接修改源文件

實例二、刪除a.txt文本中的空行

sed '/^$/d' a.txt因爲^$屬於正則,因此要用//隔離起來。

實例三、服務器日誌處理

找出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

相關文章
相關標籤/搜索