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相关面试题类型
- 请使用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参数
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
sed 命令格式 执行流程
5四剑客-awk
- awk
- 过滤
- 分析 统计
awk参数
-F 字段分隔符 列
-v 创建或修改awk可以使用变量 shell脚本变量 传递给 awk 使用
awk运算
[root@m01 /oldboy]# awk 'BEGIN{print 1/3}'
0.333333
awk执行过程
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++)
案列
- 统计每个学生的总成绩和平均成绩