shell編程- 四劍客

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)面試題類型
  1. 請(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é)生的總成績和平均成績
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容