shell编程- 四剑客

1.四剑客

四剑客 功能 擅长
find 查找文件
grep 过滤 进行过滤 测试正则(加上颜色) 过滤速度最快
sed 过滤 替换 修改文件内容 取行
awk 过滤 取列 取行 统计分析 awk数组

2.正则表达式

  • 基础正则
  • 扩展 正则
  • perl正则
基础 含义
^ 以..开头
$ 以..结尾
^$ 排除空行
. 任意一个字符
* 出现0次或0次以上
.* 任意一个字符出现 0次或0次以上
[] 匹配中括号里面的内容
[^] 排除中括号里的内容
+ 出现一次或多次
|
() 括号里的内容相当于是一个整体
前一个字符出现0次或1次

注意事项:

  • 一行一行过滤
  • 注意字符集:export LANG=C 或UTF-8
  • [^$] 大部分正则符号在[]中 原有的特殊含义
perl正则 : 领宽断言 匹配位置
匹配左边 前面 lookahead (?=xxx)
匹配右边 后面 lookbehind (?<=xxx)

3.四剑客之find

  • find 查找文件
    find相关面试题类型
  1. 请使用shell脚本,找出/oldboy以.txt结尾的 修改时间小于7天大 小大于100k 2. 请使用shell脚本,找出/oldboy以.log结尾的 修改时间小于7天大 小大于100k 把这些文件删除 3. 请使用shell脚本,找出/oldboy以.log结尾的 修改时间小于7天大 小大于100k 复制/移动 到/tmp目录 4. 请使用shell脚本,找出/oldboy以.log结尾的 修改时间小于7天大 小大于100k 打包压缩存放在/backup

find参数

参数 含义
- maxdepth 最大深度 最多查找几层目录
- type 类型 f普通文件 d目录
- name 执行名字 支持通配符 * {} -name '*.log'
- iname 查找的时候不区分大小写
- size +10k -10G -10M
-mtime 修改时间 +7 7天之前
-mmin 修改时间 +7 7分钟之前的内容 搭建网站 查找出那个是上传目录 find /www -type f -mmin -5
-exec find找出的文件 交给exec处理
-o 或者
-a 并且find命令默认就是-a
取反
-pront find找出每个文件的时候 结尾加上空(null)符号 与、 xargs -o
-inum 指定文件的inode号码 一般删除 包含特殊符号、乱码的文件

解密与xargs区别

解密 与xargs区别 传递
cmd1|cmd2 一般命令与|配合使用 传递字符
xargs find与|xargs一起使用 传递的是文件名(参数)

find核心功能

  • 参数
  • find查找文件
  • 面试题find与命令配合rm/sed/ls-l
  • find与移动或复制
  • find与打包压缩 tar/zip gzip (一般与mysqldump)

4.四剑客-grep

  • 过滤
参数 功能
-A 把grep找出的内容及接下来的几行显示出来
-B 把grep找出的内容及前几行显示出来
-C 把grep找出的内容及上下各几行显示出来
-E 让grep支持扩展正则
-i 忽略大小写
-v 取反 排除
-n 显示行号
-o 显示过程 显示每次grep没一次匹配到的过程
-R 递归过滤 一般与-l一起使用
-l 只显示文件名 不显示文件内容
-c 只显示行数
-w 精确匹配 按照单词进行过滤
-p 匹配位置 领宽断言

5.四剑客 -sed

  • sed stream editor 流编辑器 认为我们文件 像水流 源源不断通过sed处理
  • 应用
    -- 增删改查
    -- 把文件中的回车替换为空格
    sed参数
参数 功能
-n 取消默认输出
-r 支持扩展正则
-i --inplace 修改文件内容
-i.bak 先把oldboy.txt文件改名为 oldboy.txt.bak 然后修改bak内容 生成oldboy.txt

sed 执行过程

  • 读取文件内容
  • 进行判断(是否满足条件)
    -- 满足 执行对应的命令 增删改查
    -- 不满足 ---判断是否有-n参数


    image.png

sed增删改查 查找(条件)

格式 作用
-n '1p' 显示第一行
-n '1p,5p' 显示第一行到第五行
-n '/oldboy/p' 显示包含oldboy的行
-n '/101/,/105/' 显示从包含101的行开始到包含105的结束
-n '$p' 显示最后一行
-n '1~2p' 从第一行开始 每次增加2 第一行 第三行 第五行

sed增删改查之增加

命令 作用
i 在指定行前面插入行
a 在指定行后面追加
c 把指定行整体替换为 要求的内容

sed增删改查之删除

  • d(delete)

  • 删除文件中的空行 或只有空格的行

  • egrep -nv '^ *$' 加文件名称

  • sed '/^ *$/d' 加上文件名称

  • awk '!/^ *$/' 加上文件名称

  • sed -n '/^ *$/!p' 加上文件名称

sed增删改查之替换

  • 基本格式
  • 后向引用
    's#找谁#替换为什么#g' substitute
    's@@@g' global 全局替换 不加上默认替换每一行第一行内容

sed命令模式空间与保持空间(扩展)

名词 含义 特点
模式空间 sed默认把数据读取到这里 sed命令(增删改查)默认处理这里的数据 1.sed处理完1行后 内容会被删除、清空 2.命令或显示(p) 都是显示模式空间
保持空间 默认是空的 ,只有特定的命令才能操作(h;H;g;G;x) 1.这里面的数据会持续保留 知道sed处理完文件

模式空间与保持空间的命令

  • H 把模式空间的内容 追加到 保持空间中 (会自动加上一个回车符号)
  • x 交换模式空间与保持空间内容

操作模式空间

  • 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 命令格式 执行流程

image.png

5四剑客-awk

  • awk
  • 过滤
  • 分析 统计

awk参数
-F 字段分隔符 列
-v 创建或修改awk可以使用变量 shell脚本变量 传递给 awk 使用

awk运算
[root@m01 /oldboy]# awk 'BEGIN{print 1/3}'
0.333333

awk执行过程

image.png

awk取行
[root@m01 /oldboy]# awk 'NR==3' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
awk符号 shell中[]
== -eq 等于
!= -ne 不等于
> -gt 大于
>= -ge 大于等于
< -lt 小于
<= -le 小于等于

1.取出/etc/passwd 第二行到第五行

多个条件

取第二行到第五行
[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 命令结果中 >=1 && <=255 数字

ifconfig |awk -vRS='[^0-9]+'  '{print }' |awk '$0>=1 && $0<=255' 

3.对齐每一列内容

[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内置变量

变量 含义
FS 字段分隔符 列
$数字 取某一列
$0 一行的内容 整行
NF 每一行中有多少列
$NF 最后一列
$(NF-2) 倒数第三列
  • OFS 输出字段分隔符 awk显示每一列的时候 每一列之间的分隔符号 默认是空格

  • NR 记录号 行号

  • RS 记录分隔符 awk每一行的结束标记 默认是回车

  • ORS 输出记录分隔符 awk显示每一行的时候 诶一行的结束标记(默认是回车)

awk过滤(条件)

  • 比较表达式 > < == >= <=
    使用正则
  • 范围
    -特殊 BEGIN{} END{}
    awk比较表达式

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%的分区

第一种方法:
[root@m01 ~]# df -h |awk -F'[ %]+' '$5>=0 && $5<=50{print $5}' 
10
0
0
3
0
0

awk使用正则
^ 以XXX开头的行 某一列的开头
$ 以XXX结尾的行 某一列的结尾

  • awk使用正则符号~
    -- 匹配包含 $3~/[1-3]/
    -- awk !~ 不匹配

3.过滤出 /etc/passwd中第3列是以数字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{}里面的内容会在awk读取文件之前执行
    -- 1.修改或创建awk内置变量 (可用-v实现)
    -- 2.进行计算
    -- 3.进行测试
    -- 4.显示表头
  • END{} END{}里面的内容会在awk读取文件之后执行
    -- awk执行的进行计算 最后在END{}显示最终结果
    计算 1+ ++20总和
[root@m01 /server/files]# seq 20 |awk '{i=i+$1}END{print i}'
210
  • i=i+1 i++ 统计次数 一共有多少次
  • i=i+$n(n是数字) i+$n 累加(求和)总数

awk表示范围

  • awk 'NR==1,NR==5' /etc/passwd
  • awk '/2015:11:02/,/2015:11;05/'

双分支判断

  • 如果磁盘使用率大于70% 提示not enough 挂载点名称 否则 提示磁盘 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中的循环
    -- for 变量 in 内容
    -- do
    -- cmd(命令)
    -- done
  • awk中的循环
    -- awk数组
    -- for(i=1;i<+10;i++)

案列

  • 统计每个学生的总成绩和平均成绩
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容