1.四劍客
| 四劍客 | 功能 | 擅長 |
|---|---|---|
| find | 查找文件 | |
| grep | 過濾 | 進(jìn)行過濾 測試正則(加上顏色) 過濾速度最快 |
| sed | 過濾 | 替換 修改文件內(nèi)容 取行 |
| awk | 過濾 | 取列 取行 統(tǒng)計(jì)分析 awk數(shù)組 |
2.正則表達(dá)式
- 基礎(chǔ)正則
- 擴(kuò)展 正則
- perl正則
| 基礎(chǔ) | 含義 |
|---|---|
| ^ | 以..開頭 |
| $ | 以..結(jié)尾 |
| ^$ | 排除空行 |
| . | 任意一個(gè)字符 |
| * | 出現(xiàn)0次或0次以上 |
| .* | 任意一個(gè)字符出現(xiàn) 0次或0次以上 |
| [] | 匹配中括號(hào)里面的內(nèi)容 |
| [^] | 排除中括號(hào)里的內(nèi)容 |
| + | 出現(xiàn)一次或多次 |
| | | 或 |
| () | 括號(hào)里的內(nèi)容相當(dāng)于是一個(gè)整體 |
| ? | 前一個(gè)字符出現(xiàn)0次或1次 |
注意事項(xiàng):
- 一行一行過濾
- 注意字符集:export LANG=C 或UTF-8
- [^$] 大部分正則符號(hào)在[]中 原有的特殊含義
| perl正則 : | 領(lǐng)寬斷言 | 匹配位置 |
|---|---|---|
| 匹配左邊 前面 | lookahead | (?=xxx) |
| 匹配右邊 后面 | lookbehind | (?<=xxx) |
3.四劍客之find
- find 查找文件
find相關(guān)面試題類型
- 請(qǐng)使用shell腳本,找出/oldboy以.txt結(jié)尾的 修改時(shí)間小于7天大 小大于100k 2. 請(qǐng)使用shell腳本,找出/oldboy以.log結(jié)尾的 修改時(shí)間小于7天大 小大于100k 把這些文件刪除 3. 請(qǐng)使用shell腳本,找出/oldboy以.log結(jié)尾的 修改時(shí)間小于7天大 小大于100k 復(fù)制/移動(dòng) 到/tmp目錄 4. 請(qǐng)使用shell腳本,找出/oldboy以.log結(jié)尾的 修改時(shí)間小于7天大 小大于100k 打包壓縮存放在/backup
find參數(shù)
| 參數(shù) | 含義 |
|---|---|
| - maxdepth | 最大深度 最多查找?guī)讓幽夸?/td> |
| - type | 類型 f普通文件 d目錄 |
| - name | 執(zhí)行名字 支持通配符 * {} -name '*.log' |
| - iname | 查找的時(shí)候不區(qū)分大小寫 |
| - size | +10k -10G -10M |
| -mtime | 修改時(shí)間 +7 7天之前 |
| -mmin | 修改時(shí)間 +7 7分鐘之前的內(nèi)容 搭建網(wǎng)站 查找出那個(gè)是上傳目錄 find /www -type f -mmin -5 |
| -exec | find找出的文件 交給exec處理 |
| -o | 或者 |
| -a | 并且find命令默認(rèn)就是-a |
| ! | 取反 |
| -pront | find找出每個(gè)文件的時(shí)候 結(jié)尾加上空(null)符號(hào) 與、 xargs -o |
| -inum | 指定文件的inode號(hào)碼 一般刪除 包含特殊符號(hào)、亂碼的文件 |
解密與xargs區(qū)別
| 解密 | 與xargs區(qū)別 | 傳遞 |
|---|---|---|
| cmd1|cmd2 | 一般命令與|配合使用 | 傳遞字符 |
| xargs | find與|xargs一起使用 | 傳遞的是文件名(參數(shù)) |
find核心功能
- 參數(shù)
- find查找文件
- 面試題find與命令配合rm/sed/ls-l
- find與移動(dòng)或復(fù)制
- find與打包壓縮 tar/zip gzip (一般與mysqldump)
4.四劍客-grep
- 過濾
| 參數(shù) | 功能 |
|---|---|
| -A | 把grep找出的內(nèi)容及接下來的幾行顯示出來 |
| -B | 把grep找出的內(nèi)容及前幾行顯示出來 |
| -C | 把grep找出的內(nèi)容及上下各幾行顯示出來 |
| -E | 讓grep支持?jǐn)U展正則 |
| -i | 忽略大小寫 |
| -v | 取反 排除 |
| -n | 顯示行號(hào) |
| -o | 顯示過程 顯示每次grep沒一次匹配到的過程 |
| -R | 遞歸過濾 一般與-l一起使用 |
| -l | 只顯示文件名 不顯示文件內(nèi)容 |
| -c | 只顯示行數(shù) |
| -w | 精確匹配 按照單詞進(jìn)行過濾 |
| -p | 匹配位置 領(lǐng)寬斷言 |
5.四劍客 -sed
- sed stream editor 流編輯器 認(rèn)為我們文件 像水流 源源不斷通過sed處理
- 應(yīng)用
-- 增刪改查
-- 把文件中的回車替換為空格
sed參數(shù)
| 參數(shù) | 功能 |
|---|---|
| -n | 取消默認(rèn)輸出 |
| -r | 支持?jǐn)U展正則 |
| -i | --inplace 修改文件內(nèi)容 |
| -i.bak | 先把oldboy.txt文件改名為 oldboy.txt.bak 然后修改bak內(nèi)容 生成oldboy.txt |
sed 執(zhí)行過程
- 讀取文件內(nèi)容
-
進(jìn)行判斷(是否滿足條件)
-- 滿足 執(zhí)行對(duì)應(yīng)的命令 增刪改查
-- 不滿足 ---判斷是否有-n參數(shù)
image.png
sed增刪改查 查找(條件)
| 格式 | 作用 |
|---|---|
| -n '1p' | 顯示第一行 |
| -n '1p,5p' | 顯示第一行到第五行 |
| -n '/oldboy/p' | 顯示包含oldboy的行 |
| -n '/101/,/105/' | 顯示從包含101的行開始到包含105的結(jié)束 |
| -n '$p' | 顯示最后一行 |
| -n '1~2p' | 從第一行開始 每次增加2 第一行 第三行 第五行 |
sed增刪改查之增加
| 命令 | 作用 |
|---|---|
| i | 在指定行前面插入行 |
| a | 在指定行后面追加 |
| c | 把指定行整體替換為 要求的內(nèi)容 |
sed增刪改查之刪除
d(delete)
刪除文件中的空行 或只有空格的行
egrep -nv '^ *$' 加文件名稱
sed '/^ *$/d' 加上文件名稱
awk '!/^ *$/' 加上文件名稱
sed -n '/^ *$/!p' 加上文件名稱
sed增刪改查之替換
- 基本格式
- 后向引用
's#找誰#替換為什么#g' substitute
's@@@g' global 全局替換 不加上默認(rèn)替換每一行第一行內(nèi)容
sed命令模式空間與保持空間(擴(kuò)展)
| 名詞 | 含義 | 特點(diǎn) |
|---|---|---|
| 模式空間 | sed默認(rèn)把數(shù)據(jù)讀取到這里 sed命令(增刪改查)默認(rèn)處理這里的數(shù)據(jù) | 1.sed處理完1行后 內(nèi)容會(huì)被刪除、清空 2.命令或顯示(p) 都是顯示模式空間 |
| 保持空間 | 默認(rèn)是空的 ,只有特定的命令才能操作(h;H;g;G;x) | 1.這里面的數(shù)據(jù)會(huì)持續(xù)保留 知道sed處理完文件 |
模式空間與保持空間的命令
- H 把模式空間的內(nèi)容 追加到 保持空間中 (會(huì)自動(dòng)加上一個(gè)回車符號(hào))
- x 交換模式空間與保持空間內(nèi)容
操作模式空間
- N 把下一行追加到模式空間中
1.把文件中的所有回車替換為空格
方法一:
[root@m01 /oldboy]# seq 5 | sed -n 'H;$x;s#\n# #gp'
1 2 3 4 5
方法二:
[root@m01 /oldboy]# seq 5 | sed -n 'N;N;N;N;s#\n# #gp'
1 2 3 4 5

image.png
sed 命令格式 執(zhí)行流程

image.png
5四劍客-awk
- awk
- 過濾
- 分析 統(tǒng)計(jì)
awk參數(shù)
-F 字段分隔符 列
-v 創(chuàng)建或修改awk可以使用變量 shell腳本變量 傳遞給 awk 使用
awk運(yùn)算
[root@m01 /oldboy]# awk 'BEGIN{print 1/3}'
0.333333
awk執(zhí)行過程

image.png
awk取行
[root@m01 /oldboy]# awk 'NR==3' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
| awk符號(hào) | shell中[] | |
|---|---|---|
| == | -eq | 等于 |
| != | -ne | 不等于 |
| > | -gt | 大于 |
| >= | -ge | 大于等于 |
| < | -lt | 小于 |
| <= | -le | 小于等于 |
1.取出/etc/passwd 第二行到第五行
多個(gè)條件
取第二行到第五行
[root@m01 /oldboy]# awk 'NR>=2 && NR<=5{print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
2.取出 ifconfig 命令結(jié)果中 >=1 && <=255 數(shù)字
ifconfig |awk -vRS='[^0-9]+' '{print }' |awk '$0>=1 && $0<=255'
3.對(duì)齊每一列內(nèi)容
[root@m01 /oldboy]# awk -vFS=: '{print $1,$3,$NF}' /etc/passwd |column -t
root 0 /bin/bash
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
adm 3 /sbin/nologin
lp 4 /sbin/nologin
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
mail 8 /sbin/nologin
operator 11 /sbin/nologin
games 12 /sbin/nologin
ftp 14 /sbin/nologin
awk內(nèi)置變量
| 變量 | 含義 |
|---|---|
| FS | 字段分隔符 列 |
| $數(shù)字 | 取某一列 |
| $0 | 一行的內(nèi)容 整行 |
| NF | 每一行中有多少列 |
| $NF | 最后一列 |
| $(NF-2) | 倒數(shù)第三列 |
OFS 輸出字段分隔符 awk顯示每一列的時(shí)候 每一列之間的分隔符號(hào) 默認(rèn)是空格
NR 記錄號(hào) 行號(hào)
RS 記錄分隔符 awk每一行的結(jié)束標(biāo)記 默認(rèn)是回車
ORS 輸出記錄分隔符 awk顯示每一行的時(shí)候 誒一行的結(jié)束標(biāo)記(默認(rèn)是回車)
awk過濾(條件)
- 比較表達(dá)式 > < == >= <=
使用正則 - 范圍
-特殊 BEGIN{} END{}
awk比較表達(dá)式
1.過濾出 /etc/passwd中 第3列 大于等于1 小于等于1000的行
[root@m01 ~]# awk -F: '$3>=1 && $3<=1000' /etc/passwd |head
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
2.取出磁盤使用率低于50%的分區(qū)
第一種方法:
[root@m01 ~]# df -h |awk -F'[ %]+' '$5>=0 && $5<=50{print $5}'
10
0
0
3
0
0
awk使用正則
^ 以XXX開頭的行 某一列的開頭
$ 以XXX結(jié)尾的行 某一列的結(jié)尾
- awk使用正則符號(hào)~
-- 匹配包含 $3~/[1-3]/
-- awk !~ 不匹配
3.過濾出 /etc/passwd中第3列是以數(shù)字1-3開頭的
[root@m01 ~]# awk -F: '$3~/^[1-3]/' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
**awk中的特殊條件BEGIN{} 和ENG{}
- BEGIN{} BEGIN{}里面的內(nèi)容會(huì)在awk讀取文件之前執(zhí)行
-- 1.修改或創(chuàng)建awk內(nèi)置變量 (可用-v實(shí)現(xiàn))
-- 2.進(jìn)行計(jì)算
-- 3.進(jìn)行測試
-- 4.顯示表頭 - END{} END{}里面的內(nèi)容會(huì)在awk讀取文件之后執(zhí)行
-- awk執(zhí)行的進(jìn)行計(jì)算 最后在END{}顯示最終結(jié)果
計(jì)算 1+ ++20總和
[root@m01 /server/files]# seq 20 |awk '{i=i+$1}END{print i}'
210
- i=i+1 i++ 統(tǒng)計(jì)次數(shù) 一共有多少次
- i=i+$n(n是數(shù)字) i+$n 累加(求和)總數(shù)
awk表示范圍
- awk 'NR==1,NR==5' /etc/passwd
- awk '/2015:11:02/,/2015:11;05/'
雙分支判斷
- 如果磁盤使用率大于70% 提示not enough 掛載點(diǎn)名稱 否則 提示磁盤 OK
#!/bin/bash
df -h |awk -F'[ %]+' '{
if($5>=`70) print "not enough",$NF;else print "disk is ok";
}'
[root@m01 /server/scripts]# sh cipan.sh
not enough on
disk is ok
disk is ok
disk is ok
disk is ok
disk is ok
disk is ok
disk is ok
- shell中的循環(huán)
-- for 變量 in 內(nèi)容
-- do
-- cmd(命令)
-- done - awk中的循環(huán)
-- awk數(shù)組
-- for(i=1;i<+10;i++)
案列
- 統(tǒng)計(jì)每個(gè)學(xué)生的總成績和平均成績
