grep、sed竟宋、awk
一、grep的用法
1形纺、grep簡介
- grep是一種強(qiáng)大的文本搜索工具丘侠,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來逐样。
- grep包含grep和egrep蜗字,其中egrep為擴(kuò)展正則打肝,支持更多的元字符,功能更強(qiáng)大挪捕。使用-E也可以實(shí)現(xiàn)grep的擴(kuò)展功能粗梭。
2、grep命令參數(shù)
-a或--text 不要忽略二進(jìn)制的數(shù)據(jù)级零。
-A<顯示列數(shù)>或--after-context=<顯示列數(shù)> 除了顯示符合范本樣式的那一列之外断医,并顯示該列之后的內(nèi)容。
-b或--byte-offset 在顯示符合范本樣式的那一列之前妄讯,標(biāo)示出該列第一個字符的位編號孩锡。
-B<顯示列數(shù)>或--before-context=<顯示列數(shù)> 除了顯示符合范本樣式的那一列之外,并顯示該列之前的內(nèi)容亥贸。
-c或--count 計算符合范本樣式的列數(shù)躬窜。
-C<顯示列數(shù)>或--context=<顯示列數(shù)>或-<顯示列數(shù)> 除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內(nèi)容炕置。
-d<進(jìn)行動作>或--directories=<進(jìn)行動作> 當(dāng)指定要查找的是目錄而非文件時荣挨,必須使用這項參數(shù),否則grep指令將回報信息并停止動作朴摊。
-e<范本樣式>或--regexp=<范本樣式> 指定字符串做為查找文件內(nèi)容的范本樣式默垄。
-E或--extended-regexp 將范本樣式為延伸的普通表示法來使用。
-f<范本文件>或--file=<范本文件> 指定范本文件甚纲,其內(nèi)容含有一個或多個范本樣式口锭,讓grep查找符合范本條件的文件內(nèi)容,格式為每列一個范本樣式介杆。
-F或--fixed-regexp 將范本樣式視為固定字符串的列表鹃操。
-G或--basic-regexp 將范本樣式視為普通的表示法來使用。
-h或--no-filename 在顯示符合范本樣式的那一列之前春哨,不標(biāo)示該列所屬的文件名稱荆隘。
-H或--with-filename 在顯示符合范本樣式的那一列之前,表示該列所屬的文件名稱赴背。
-i或--ignore-case 忽略字符大小寫的差別椰拒。
-l或--file-with-matches 列出文件內(nèi)容符合指定的范本樣式的文件名稱。
-L或--files-without-match 列出文件內(nèi)容不符合指定的范本樣式的文件名稱凰荚。
-n或--line-number 在顯示符合范本樣式的那一列之前燃观,標(biāo)示出該列的列數(shù)編號。
-q或--quiet或--silent 不顯示任何信息便瑟。
-r或--recursive 此參數(shù)的效果和指定“-d recurse”參數(shù)相同缆毁。
-s或--no-messages 不顯示錯誤信息。
-v或--revert-match 反轉(zhuǎn)查找胳徽。
-V或--version 顯示版本信息积锅。
-w或--word-regexp 只顯示全字符合的列。
-x或--line-regexp 只顯示全列符合的列养盗。
-y 此參數(shù)的效果和指定“-i”參數(shù)相同缚陷。
--help 在線幫助。
3往核、grep實(shí)例
(1)過濾以m開頭的行
[root@jzyue ~]# grep ^m test.txt
(2)過濾以k結(jié)尾的行
[root@jzyue ~]# grep k$ a.txt
(3)排除空行并打印行號
[root@jzyue ~]# grep -vn "^$" a.txt
(4)匹配任意一個字符箫爷,不包括空行
[root@jzyue ~]# grep "." a.txt
(5)匹配所有
[root@jzyue ~]# grep ".*" a.txt
(6)精確匹配
[root@jzyue ~]# grep "file" a.txt
(7)匹配有xyz的行
[root@jzyue ~]# grep "[xyz]" a.txt
(8)重復(fù)a三次
[root@jzyue ~]# grep "a{3}" a.txt
(9)匹配a至少出現(xiàn)3次最多出現(xiàn)5次
[root@jzyue ~]# grep -E "a{3,5}" a.txt
(10)至少出現(xiàn)1次或一次以上的
[root@jzyue ~]# egrep "a{1,}" a.txt
二、sed的用法
1聂儒、sed簡介
- Stream Editor文本流編輯虎锚,sed是一個“非交互式的”面向字符流的編輯器。能同時處理多個文件多行的內(nèi)容衩婚,可以不對原文件改動窜护,把整個文件輸入到屏幕,可以把只匹配到模式的內(nèi)容輸入到屏幕上。還可以對原文件改動非春,但是不會再屏幕上返回結(jié)果柱徙。
- Sed 要用來自動編輯一個或多個文件;簡化對文件的反復(fù)操作奇昙;編寫轉(zhuǎn)換程序等护侮。
2、sed命令參數(shù)
-e 允許多項編輯
-n 只打印模式匹配的行
-i 直接修改對應(yīng)文件
-r 支持?jǐn)U展元字符
3储耐、sed實(shí)例
(1)刪除1-2行信息
[root@jzyue ~]# sed '1,2d' a.txt
(2)打印出/etc/passwd下第二行信息
[root@jzyue ~]# sed -n '2p' /etc/passwd
(3)打印出/etc/passwd下最后一行信息
[root@jzyue ~]# sed -n '$p' /etc/passwd
(4)修改網(wǎng)卡IP地址(111改為70)
[root@jzyue ~]# sed 's#111#70#g' /etc/sysconfig/network-scripts/ifcfg-eth0
(5)使用sed命令關(guān)閉selinux
[root@jzyue ~]# sed '7c SELINUX=Disable' /etc/selinux/config
(6)將a.txt第20行下添加ideapad
[root@jzyue ~]# sed -i '20a ideapad;' a.txt
(7)刪除第21行信息
[root@jzyue ~]# sed '21d' a.txt
(8)刪除所有行的信息
[root@jzyue ~]# sed '1,$d' a.txt
(9)為第二行到第六行添加注釋信息
[root@jzyue ~]# sed -r '2,6s/.*/#&/' passwd.txt
三羊初、awk的用法
1、awk簡介
awk是一個優(yōu)良的文本處理工具什湘,linux及unix環(huán)境現(xiàn)有的功能最強(qiáng)大的數(shù)據(jù)處理引擎之一长赞。awk進(jìn)行逐行掃描文件,從第一行到最后一行禽炬,尋找匹配的行進(jìn)行操作涧卵。
2、awk命令參數(shù)
-F:定義分隔符
3腹尖、awk實(shí)例
(1)匹配包含nologin的行
[root@jzyue ~]# awk '/nologin/' passwd.txt
(2)指定冒號為分隔符柳恐,顯示第一列
[root@jzyue ~]# awk -F: '{print $1}' passwd.txt
(3)NR記錄輸入總的行號
[root@jzyue ~]# awk '{print NR,$0}' passwd.txt
(4)以root開頭的行
[root@jzyue ~]# awk '/^root/' passwd.txt
(5)UID為0的列出來
[root@jzyue ~]# awk -F ":" '$3==0' /etc/passwd
(6)UID小于10的列出來
[root@jzyue ~]# awk -F: '$3 < 10' /etc/passwd
(7)常見的表達(dá)式
關(guān)系運(yùn)算符
運(yùn)算符 含義 示例
< 小于 x<y
<= 小于或等于 x<=y
== 等于 x==y
!= 不等于 x!=y
= 大于等于 x>=y
大于 x>y
(8)邏輯操作符
&&邏輯與 || 邏輯或 !邏輯非
匹配用戶名為root并且打印uid小于15的行
[root@jzyue ~]# awk -F: '3<=15' /etc/passwd
匹配用戶名為root或uid大于5000
[root@jzyue ~]# awk -F: '3>=5000' /etc/passwd
(9)條件判斷
if語句格式:{ if(表達(dá)式){語句;語句;... }}
打印當(dāng)前管理員用戶名稱
[root@jzyue ~]# awk -F: '{ if(1 "is adminisitrator"} }' /etc/passwd
統(tǒng)計系統(tǒng)用戶數(shù)量
[root@jzyue ~]# awk -F: '{ if(3<1000){i++}} END {print i}' /etc/passwd
統(tǒng)計普通用戶數(shù)量
[root@jzyue ~]# awk -F: '{ if($3>1000){i++}} END {print i}' /etc/passwd
(10)..else 語句格式: {if(表達(dá)式){語句;語句;... }else{語句;語句;...}}
awk -F: '{if(1} else {print 3==0) {count++} else{i++} }' /etc/passwd
awk -F: '{if($3==0){count++} else{i++}} END{print " 管理員個數(shù): "count ; print " 系統(tǒng)用戶數(shù): "i}' /etc/passwd
(11)循環(huán)語句
[root@jzyue ~]# awk 'BEGIN{ i=1; while(i<=10){print i; i++} }'
[root@jzyue ~]# awk -F: '{i=1; while(i<=NF){print 0; i++}}' /etc/passwd
(12)1.4.13.10 統(tǒng)計2018年01月25日,8:30-9:00訪問狀態(tài)碼是404*
[root@jzyue ~]# awk '4<="[25/Jan/2018:19:00:00" && 9]++} END {for(i in code){print i,code[i]}}' log.bjstack.log
[root@jzyue ~]# awk '9]++} END {for(i in code){print i,code[i]}}' log.bjstack.log