【运维知识基础篇】Linux三剑客

简介: 【运维知识基础篇】Linux三剑客

吾日三省吾身,想出类拔萃,要把知识学牢,学全,学深,学广。


今天给大家分享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年运维经验,持续分享运维干货,感谢大家的阅读和关注!

目录
相关文章
|
23天前
|
运维 Linux Shell
linux运维常用命令
linux运维常用命令
|
30天前
|
运维 监控 Linux
linux脚本自动化运维任务
Linux自动化运维通过脚本提升效率,涵盖服务管理(启停服务、异常恢复)、系统监控(资源警报)、日志管理(清理分析)、备份恢复、补丁更新、自动化部署(如Ansible)、网络管理、定时任务(cron)和故障排查。结合shell、Python及工具,形成高效运维体系。
23 3
|
1月前
|
监控 网络协议 Linux
Linux 命令大全 & CentOS常用运维命令
Linux 命令大全 & CentOS常用运维命令
157 0
|
1月前
|
运维 监控 Linux
Linux本地部署1Panel现代化运维管理面板并实现公网访问
Linux本地部署1Panel现代化运维管理面板并实现公网访问
82 1
|
2月前
|
运维 Linux 数据安全/隐私保护
【Linux专题_01】宝塔面板安装及运维
【Linux专题_01】宝塔面板安装及运维
|
2月前
|
Kubernetes Linux 开发工具
容器开发运维人员的 Linux 操作机配置优化建议
容器开发运维人员的 Linux 操作机配置优化建议
|
2月前
|
运维 网络协议 Linux
Linux 这50个 systemd 命令值得每位Linux运维工程师收藏!
Linux 这50个 systemd 命令值得每位Linux运维工程师收藏!
443 0
Linux 这50个 systemd 命令值得每位Linux运维工程师收藏!
|
3月前
|
存储 运维 安全
1Panel开源Linux服务器运维管理面板
1Panel开源Linux服务器运维管理面板
119 0
|
4月前
|
运维 Linux
Linux 运维小技巧
Linux 运维小技巧
49 0
|
4月前
|
运维 数据可视化 Unix
Linux 可视化管理-webmin 和 bt 运维工具
Linux 可视化管理-webmin 和 bt 运维工具
71 0