【运维知识基础篇】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年运维经验,持续分享运维干货,感谢大家的阅读和关注!

相关实践学习
CentOS 8迁移Anolis OS 8
Anolis OS 8在做出差异性开发同时,在生态上和依赖管理上保持跟CentOS 8.x兼容,本文为您介绍如何通过AOMS迁移工具实现CentOS 8.x到Anolis OS 8的迁移。
目录
相关文章
|
1月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
66 5
|
2月前
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
287 3
|
4月前
|
运维 监控 网络协议
|
3月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
289 3
|
3月前
|
运维 监控 安全
盘点Linux服务器运维管理面板
随着云计算和大数据技术的迅猛发展,Linux服务器在运维管理中扮演着越来越重要的角色。传统的Linux服务器管理方式已经无法满足现代企业的需求,因此,高效、安全、易用的运维管理面板应运而生。
|
3月前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
147 3
|
4月前
|
存储 运维 搜索推荐
|
4月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
158 1
|
4月前
|
运维 网络协议 安全
Linux安全运维--一篇文章全部搞懂iptables
Linux安全运维--一篇文章全部搞懂iptables
81 1
|
5月前
|
运维 监控 Linux
深入理解Linux系统运维:命令行工具的力量
【9月更文挑战第14天】在Linux的世界里,命令行工具是系统管理员的瑞士军刀。本文将带你领略命令行的魅力,从基础操作到高级技巧,让你的运维工作更加高效和精准。准备好了吗?让我们一起开启这段探索之旅!