吾日三省吾身,想出类拔萃,要把知识学牢,学全,学深,学广。
今天给大家分享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年运维经验,持续分享运维干货,感谢大家的阅读和关注!