吾日三省吾身,想出类拔萃,要把知识学牢,学全,学深,学广。
今天给大家分享linux三剑客,grep,sed,awk。
grep
grep 参数选项 '过滤内容' file/路径文件
grep 'root' /etc/passwd|grep 'bash'
cat /etc/passwd|grep 'root'
参数选项:
-i 过滤内容不区分大小写
-c 统计行数
-v 取反 取文件中的空行和注释的行进行取反
-o 显示匹配过程
-E 支持扩展正则 egrep
-c 统计单词数量
-r 递归过滤文件内容
-A 显示过滤到行,再往下显示n行
-B 显示过滤到行,再往上显示n行
-C 显示过滤到行,再往上下显示n行
grep “过滤的内容” 文件
grep -i “过滤的内容” 文件 #过滤文件的内容忽略大小写
示例1:查看ip中的10.0.0.200是否出现
[root@VMware-koten ~]#ip add|grep 10.0.0.200
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@VMware-koten ~]#
示例2:过滤文件中包含“Failed”的行 直接过滤区分大小写
[root@VMware-koten ~]#grep "Failed" /var/log/secure
Feb 27 10:18:12 VMware-koten sshd[20161]: Failed password for root from 10.0.0.1 port 53333 ssh2
Feb 27 17:10:39 VMware-koten sshd[34342]: Failed password for root from 10.0.0.1 port 57720 ssh2
[root@VMware-koten ~]#
[root@VMware-koten ~]#alias grep='grep -i --color=auto' #临时更改
永久更改需要加环境变量
示例3:过滤文件中包含“Failed”的行 忽略大小写
[root@VMware-koten ~]#grep -i "Failed" /var/log/secure
Feb 27 10:18:10 VMware-koten unix_chkpwd[20164]: password check failed for user (root)
Feb 27 10:18:12 VMware-koten sshd[20161]: Failed password for root from 10.0.0.1 port 53333 ssh2
Feb 27 17:10:38 VMware-koten unix_chkpwd[34345]: password check failed for user (root)
Feb 27 17:10:39 VMware-koten sshd[34342]: Failed password for root from 10.0.0.1 port 57720 ssh2
[root@VMware-koten ~]#
示例4:过滤文件中包含“Failed”的行,统计行数
[root@VMware-koten ~]#grep -i "Failed" /var/log/secure|wc -l
4
[root@VMware-koten ~]#
[root@VMware-koten ~]#grep -c "Failed" /var/log/secure
4
[root@VMware-koten ~]#
-r案例企业常用
代码文件被篡改,打开网站出现乱七八糟的网站
cat code.txt
www.test.com----->www.luanqibazao.com
grep -r 'www.luanqibazao.com' ./*
企业遇到被篡改:快速恢复业务,(代码要有备份)
云服务器支持快照,硬件服务器没有快照
备份在网站,公司备份服务器,自己笔记本
被篡改的代码不要删,先移除走
可能会选择在服务器,页面进行攻击
sed
作用:1.查找文件内容
2.直接按行查找
3.追加内容到文件
4.替换文件内容
5.进行格式化输出(后向引用)
6.模糊过滤
sed '模式' '动作' file #效率高 适合单个文件处理
cat file|sed '模式 动作' #效率低 适合前面是其他命令的,已经处理过的,需要sed继续处理
sed '找谁 干啥' file
默认输出所有的文件
找谁:怎么找 按行查找 模糊过滤内容
干啥:输出 删除 替换
动作包括:p d i a
参数:
-n 取消默认输出,使用sed有n就有p,print
, 表示区间范围
-r 支持扩展正则
-i 改变源文件
一、按行查找:
1.按照行进行查找
sed 'n p' file
找id.txt的第三行
[root@VMware-koten ~]#sed -n '3p' id.txt
2.输出文件的最后一行
[root@VMware-koten ~]#sed -n '$p' id.txt 此时$表示最后一行
3.查找文件的三到五行,区间使用逗号分割
[root@VMware-koten ~]#sed -n '3,5p' id.txt
4.显示三到最后一行
[root@VMware-koten ~]#sed -n '3,$p' id.txt
二、模糊过滤(类似grep)
sed -n '/过滤的内容/p' file 加斜杠只因为后面有动作,所以需要分割开
sed '/找谁/干啥' file 没有高亮
1.查找包含boy的行
[root@VMware-koten ~]#sed -n '/boy/p' id.txt
2.查找包含boy和ok的行
[root@VMware-koten ~]#sed -rn '/boy|ok/p' id.txt
sed不支持扩展,需要加-r
3.过滤boy和ok之间的行
[root@VMware-koten ~]#sed -n '/boy/,/ok/p' id.txt
注意:过滤区间范围时是成对出现,有头没有尾的会继续往下找,直到全部找到
有结尾没有开头的就找不着。
如果有两个结尾,且行连续,会匹配到最后的结尾,行不连续,则中间部分不会过滤出来
企业中可以匹配日志时间范围
三、sed增加内容(了解)
sed '3a 内容' file 在第三行后面追加内容
sed '3i 内容' file 在第三行插入内容,第三行原本内容下移,变成第四行
sed '3c 内容' file 替换第3行整行内容
sed '3w 新文件' file 把file的第三行写入到新文件中
示例1:追加 append
临时显示到屏幕上,没有修改源文件
sed '2a test' 1.txt
示例2:模糊过滤abc插入,因为是逐行查找,所有abc下面都插入
sed '/abc/i test' 1.txt
sed '1,$i test' 1.txt
所有行下面加test
示例3:替换整行,写xhell脚本,做系统优化的时候使用。
sed -i '3C aaa' 1.txt
四、sed删除
sed '3d' file #删除第3行
sed '3,5d' file #删除3-5行 没有第五行会删除后面的有几行算几行
sed '//d' file 删除过滤到内容的行
sed '//,//d' file 删除过滤到的区间范围
注意不能加-n,不然取消默认输出就不知道删没删了,没n也就没有p
示例1:删除第三行
sed '3d' 1.txt
示例2:删除第三行到第五行
sed '3,5d' 1.txt
示例3:删除模糊过滤到内容的行
sed '/boy/d' 1.txt
示例4:删除过滤到的区间范围
sed '/boy/,/ok/d' 1.txt
五、sed替换
作用:支持替换单词,替换特殊字符,替换数字、删除单词
sed 's###g' file #可以是任意三个相同的字符@,/
#但是要注意格式问题,别和里面内容一样了
sed -n '5s###gp' file #替换第五行内容
#加g是替换全局,不加是替换每行第一个
vim替换
:%s/root/boy/g
示例1:替换文件中的boy为ok,只替换每一行第一个出现boy的单词
sed 's#boy#ok#' 1.txt
示例2:替换文件中所有的boy为ok
sed 's#boy#ok#g' 1.txt
示例3:实际修改文件,将所有的boy为ok
sed -i 's#boy#ok#g' 1.txt
示例4:替换boy和ok为test
sed -r 's#boy|ok#test#g' 1.txt
示例4:只替换ten和ok为test
sed -r 's#\<ten|ok#test#g' 1.txt #需要加边界
sed -r 's#\bten|ok#test#g' 1.txt #需要加边界
示例5:把boy替换为空
sed 's#[a-Z]##g' 1.txt
[0-Z]表示[0-9][a-z][A-Z]
示例6:把特殊字符:/字母x数字为空
sed 's#[0-9:/x]##g' 1.txt
六、sed后向引用
作用:格式化输出
可以将一行内容通过正则方式匹配到,然后增加其他的字符串
sed -r 's#(匹配的内容)(内容)(内容)#\1\2\3#g' 前面都支持正则,匹配其他内容的输出
[root@VMware-koten ~]#echo test |sed -r 's#(test)#\1#g'
test
[root@VMware-koten ~]#echo test |sed -r 's#(test)#<\1>#g'
<test>
如果一行一个括弧就默认匹所有了
使用正则匹配字符串输出结果
可以批量创建用户
高难度例题!!!
使用sed给1.txt文件中1-3行前面加上#注释
[root@VMware-koten ~]# cat 1.txt
koten1:koten1:1111:111:koten1:/home/koten1:/bin/bash
koten1:koten1:1111:111:koten1:/home/koten1:/bin/bash
koten2:koten2:2222:111:koten2:/home/koten2:/bin/bash
koten2:koten2:2222:111:koten2:/home/koten2:/bin/bash
koten3:koten3:3333:111:koten3:/home/koten3:/bin/bash
koten4:koten4:444:111:koten4:/home/koten4:/sbin/nologin
方法一:
[root@VMware-koten ~]# sed -i -r '1,3s#(.*)#\#\1#g' 1.txt
[root@VMware-koten ~]# cat 1.txt
#koten1:koten1:1111:111:koten1:/home/koten1:/bin/bash
#koten1:koten1:1111:111:koten1:/home/koten1:/bin/bash
#koten2:koten2:2222:111:koten2:/home/koten2:/bin/bash
koten2:koten2:2222:111:koten2:/home/koten2:/bin/bash
koten3:koten3:3333:111:koten3:/home/koten3:/bin/bash
koten4:koten4:444:111:koten4:/home/koten4:/sbin/nologin
[root@VMware-koten ~]#
注意:-r和-i要分开,不能用-ir,但是可以用-ri
方法二:
[root@VMware-koten ~]# sed -i '1,3s#^#\##g' 1.txt
sed小结:
1.sed查找
sed按行查找
sed -n '3p' file #指定行
sed -n '3,5p' file #指定区间范围
sed模糊过滤
sed -n '//p' file #过滤内容
sed -n '//,//p' file #表示区间范围
2.sed删除
3.sed替换 支持正则
awk
作用:
1、按行查找文件内容
2、模糊过滤文件内容
3、按照列查找文件内容,可以对文件内容取列
4、还可以做数值运算,数值比对,字符串比对
5、支持for循环,while循环,if判断,数组,格式化输出
6、awk就好像一门编程语言,是GNU项目三个人一起写的 a w k 组成awk,也叫gawk
语法结构:
awk '找谁{干啥}' file
awk '查找' file 没有动作会输出所有的行(对每行进行一个默认的动作处理 输出)
df -h|awk '查找{干啥}'
一、awk取行
awk 'NR==3' file
awk 'NR==3{print}' file 默认
NR:是awk的内置变量 存储着每行的行号
NR可以是
==相等的行
!=不等于的行
>大于
<小于
>=大于等于
<=小于等于
&&并且
||或者
示例1、取1.txt第三行
awk 'NR==3' 1.txt
示例2:查找不等于第三行的内容
awk 'NR!=3' 1.txt
示例3:查找小于等于三行的内容
awk 'NR<=3' 1.txt
示例4:找出第一行或者大于九行的内容
awk 'NR==3||NR>=9' 1.txt #注意这里不是正则表达式,是比较判断
二、awk模糊过滤 最好的方式是去取字符创方式去匹配 cat -n 会耗费性能
awk '/内容/' 文件
df -h|awk '/内容/'
awk '//,//' 文件
示例1:查找过滤出包含root的行
awk '/root/' 1.txt
示例2:查找出包含root或者mail的行
awk '/root|mail/' 1.txt #默认支持扩展正则
示例3:支持正则
awk '/^.*mail/' 1.txt
示例4:匹配区间范围
awk '/boy/,/girl/' 1.txt
三、awk取列
awk '{print $1}' file
awk内置变量
$0表示所有文件内容,实际底层表示每一行的内容
$1表示文件的第一列
$2表示文件的第二列
$3表示文件的第三列
……
$NF表示所有文件的最后一列
,逗号为awk的内部变量,就是空格的含义
不想使用逗号就使用" ","----",双引号里面放什么东西都可以
注意:awk动作中{}所有字符串都视为变量
-F指定分割符
[root@VMware-koten ~]#cat 1.txt
aaa
bbb
ccc
[root@VMware-koten ~]#awk '{print ok}' 1.txt
[root@VMware-koten ~]#awk '{print "ok"}' 1.txt
ok
ok
ok
[root@VMware-koten ~]#awk '{a++}END{print a}' 1.txt #取行号
3
[root@VMware-koten ~]#
示例1:取出文件的第一列,awk默认对整个文件的内容处理
awk '{print $1}' 1.txt
#底层是对每一行进行动作处理,取第一列是先取第一行到内存空间,取的第一个,再取第二行的第二个
#如果遇到没有的就会print空
示例2: 取文件的最后一列(会取到每一行的最后一列)
NF 存储着每一行的列号
awk '{print $NF}' 1.txt
取倒数第二列
awk '{print $(NF-1)}' 1.txt
示例3:awk指定分隔符
awk取列默认按照空格 tab键
awk -F: '{print $1}' 1.txt #指定冒号为分割
awk -F ":" '{print $1}' 1.txt #指定冒号为分割
awk -F "[/:]" '{print $1}' 1.txt #以斜杠和冒号分割
awk -F "/|:" '{print $1}' 1.txt #不用中括号可以用|
awk -F "[/:]+" '{print $1}' 1.txt
#前面出现1次或1次以上,当做一个整体
#以斜杠和冒号和斜杠冒号和冒号斜杠分割,冒号和斜杠不管谁在前后都是连续的,一个整体
示例4:给文本加行号
awk '{print NR,$F}' 1.txt
四、模式+动作
awk 'NR==3' file #找谁
awk '{print $2}' file #动作
awk 'NR==3{print $2}' file #取下第三行的第二列
awk 'NR==3{print $2,$NF}' file #取下第三行的第二列和最后一列
awk 'NR>2&&NR<6{print $2,$NF}' file #取第三四五行的第2列和最后一列
awk -F: '/root/{print $1}' p.txt #先模糊过滤找行,再找以冒号分割的第一列
awk -F: '/root/,/shutdown/{print $1}' p.txt #区间范围也没有问题
五、字符串比较,数值比较
awk '$1=="root"' file 字符串比较 注意匹配字符串一定要加双引号
awk '$1=="root"{print $NF}' file 模式加动作
awk '$1=="root"' 1.txt 第一列等于root的行
awk '$1!="root"' 1.txt 第一列等于root的行
上面是字符串,也可以用正则
awk '$1~"n$"' file 先取出指定列,用正则进行匹配
awk '$1==0' file 数值比较,第一列等于0的输出出来
awk '$3<5&&$3>3' file 数值比较,第三列小于5大于3的行
临时扩展下:
cat -A 显示^是tab键的意思
如何选择三剑客?
简单过滤文件内容:grep
想要替换内容:sed
取列做数据统计:awk
正常文件的tab和空格都可以作为分隔符
cat -n出来的不必深究用空格分割
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!