Linux
基础知识
01搭建Centos7系统
02软件管理仓库
03Shell
04查看帮助命令
05系统工作命令
06系统状态检测命令
07工作目录切换命令
08文本文件编辑命令
09文件目录管理
10打包压缩与搜索命令
11输入输出重定向
12管道符与通配符
13Vim编辑器
14Shell脚本
15shell流程控制语句
16用户管理操作
17文件权限与归属
18文件隐藏属性
19文件访问控制列表
20su与sudo
21存储结构
22物理设备命名规则
23文件系统
24挂载硬件设备
25虚拟机添加硬盘设备
26系统中操作添加硬盘设备
27添加交换分区
28磁盘容器配额
29软硬方式链接
30RAID
31LVM
32程序安装与管理
33计划任务
34日志文件分析
35测试网络联通性
36FTP服务
37操作系统基本符号
38操作系统三剑客
39shell基础
40shell语法
41DNS
42Apache概述
43Nginx概述
44集群概述
Vmware安装Ubuntu
更换源
-
+
首页
38操作系统三剑客
# 操作系统三剑客 操作系统三剑客命令-grep、sed、awk ## grep grep擅长查找功能 **常用参数** | 参数 | 描述 | | ------ | ----------------------------------------------- | | -n | 显示出 匹配行,原位置所在的行号 | | -a | 二进制以文本方式搜索数据 | | -c | 计算找到的搜索字符串总行数 | | -o | 仅显示出匹配到的内容,统计文件出现的次数 | | -i | 不区分大小写 | | -v | 反向选择 | | -E | 扩展的grep,即egrep | | -B num | 除显示匹配的一行之外,并显示该行之前的前num行 | | -A num | 除显示匹配的一行之外,并显示该行之后的num行 | | -C num | 除了显示匹配的一行之外,并显示该行前后的各num行 | | -w | 按照单词搜索,相等于-b | | -r | 递归查找目录下所包含的内容 | **示例** ```shell 查看包含root的行: # grep "root" /etc/passwd 查看不包含root的行: # grep -v "root" /etc/passwd 列出以m开头和m结尾的行: # grep "^m" /etc/passwd # grep "m$" /etc/passwd 匹配非空行并显示出行号: # grep -vn "^$" /etc/passwd ``` ## sed 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作 sed在处理时一次只读取文件的一行,并对该行进行处理 sed将处理后的数据只会显示在屏幕上,并不会对原文件进行修改,所以说sed是一个行编辑器 在使用sed时最主要用到四个功能:增加、查询、删除、修改 sed命令的语法信息: sed [OPTION]... {script-only-if-no-other-script} [input-file]... **常用参数** | 参数 | 描述 | | ---------- | ------------------------------------------------------------ | | -n | 使用安静(silent)模式 | | -e | 直接在命令列模式上进行sed的动作编辑 | | -r | 扩展的正则表达式 | | -f | 直接将sed的动作写在一个文件内,例如:-f filename,则可以运行filename内的sed动作 | | -i | 直接编辑源文件,而不输出到屏幕中 | | -d | 删除 | | p | 查询,以行号为单位查询,例如:sed -n '3p' passwd.txt | | i | 在被指定到的行上面插入文本 | | a | 在被指定到的行下面插入文本 | | c | 取代被指定的某些行 | | s | 取代,内容取代,通常这个 s 的动作可以搭配正规表示式,例如 1,20s/old/new/g | | r 文件路径 | 在指定的位置插入另外一个文件的内容 | | w 文件路径 | 将符合条件的所有行保存至指定的文件中 | | = | 显示符合条件的所在行的行号 | | s@@@ | 查找条件也可以使用模式,但是被替换的内容不能使用模式 | 注意:在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来 **示例:** ```shell 查询: -n:只对匹配的内容进行显示 p:将查询的内容显示出来 以行号为单位查询**** 查询文档第3行: # sed -n '3p' passwd.txt 查询文档第1-3行: # sed -n '1,3p' passwd.txt 查询第一行与最后一行: # sed -n '1p;$p' passwd.txt 查询文件中所有内容: # sed -n '1,$p' passwd.txt # cat -n passwd.txt | sed -n '1,3p;5,10p' 以指定内容查询: 只查询sshd相关的行: # sed -n '/sshd/p' passwd.txt 查询以nologin结尾的行: # sed -n '/nologin$/p' passwd.txt 查询从111行开始到abc行中间的行: //匹配第一个结果即停止 # sed -n '/111/,/abc/p' passwd.txt 查询只包含root和张三的行: # sed -n '/root/p;/zhangsan/p' passwd.txt 查询时在文本中的所有行后都加入一行空行: # sed 'G' passwd.txt 查询文本内容的空行再让每行内容再隔1空行显示: # sed '/^$/d;G' passwd.txt //删除文本中的空行并将其他内容隔一行空行显示 查询时让每行内容再隔2行显示: # sed '/^$/d;G;G' passwd.txt 在查询到的abc后面插入一行空行 # sed '/abc/G' passwd.txt 在匹配abc的前面插入一空行: # sed '/abc/{x;p;x;}' passwd.txt 同时在前面后面插入一空行: # sed '/abc/{x;p;x;G;}' passwd.txt 为每行内容加入行号: # sed = passwd.txt | sed 'N;s/\n/ /' //末尾处有一个空格,表示行号后也有空格 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daaemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 为每行内容加入行号及. # sed = passwd.txt | sed 'N;s/\n/\./' 1.root:x:0:0:root:/root:/bin/bash 2.bin:x:1:1:bin:/bin:/sbin/nologin 3.daaemon:x:2:2:daemon:/sbin:/sbin/nologin 4.adm:x:3:4:adm:/var/adm:/sbin/nologin 增加 行级增加内容****** 以行号指定插入行内容 添加信息到第一行: # sed '1i00,root,level9' passwd.txt 1表示在第几行操作,i表示在第几行的前面操作 在文件第三行之后添加信息: # sed '3a00,root,level9' passwd.txt 3表示在第几行操作,a表示在第几行的后面操作 在文件末尾添加一行新内容 # sed '$aabc' passwd.txt 同时添加两行内容呢? # sed '$auseradd zhangsan\nuseradd lisi' /etc/profile 以关键字插入行内容 在匹配行的下一行添加一行数字内容,/a表示在下一行添加内容: # sed '/sshd/a123456' passwd.txt 在匹配行的上一行添加一行数字内容,/i表示在上一行添加内容: # sed '/sshd/i123456' passwd.txt 在有zhangsan行的前面添加###### 后面添加######信息: -e 同一行执行多条命令 # sed -e '/zhangsan/i######' -e '/zhangsan/a######' passwd.txt 在匹配内容中增加内容***** 在关键字为末尾的匹配行的末尾增加新内容/aaa: # sed 's/nologin$/&\aa/g' passwd.txt //&表示匹配的关键字 以下命令和上面命令区别? # sed 's/nologin/&\/aaa/' passwd.txt 在有包含root的行首加入字符aaa: # sed '/root/s/^/&aaa/' passwd.txt 在有包含root的行尾加入字符.: # sed -e '/root/s/$/&./' passwd.txt 在有包含root的行首加入字符aaa并在以bash结尾的行加入内容.: # sed -e '/root/s/^/&aaa/' -e 's/bash$/&./' passwd.txt # sed -e '/root/s/^/&aaa/;s/root$/&./' passwd.txt 替换: 行级替换***** 替换某一行数据: 从第1行到70行所有内容替换成一行??? # nl passwd.txt | sed '73c 73行数据有误!' 行范围替换: # nl passwd.txt | sed '70,73c no 70-73!!!' 从指定行到文件末尾行包括末尾行进行替换: # nl passwd.txt | sed '70,$c over!' # nl passwd.txt | sed '71,73c 71新内容\n72新内容\n73新内容!' 指定内容进行替换****** 将每行的第一个出现的root都替换成aaaa: # sed s/root/aaaa/ passwd.txt 将每行的所有root都替换成aaaa: # sed s/root/aaaa/g passwd.txt 将文档中1个0及以上都改成1个0 # sed s/0+/0/g passwd.txt 关闭selinux,使用-i表示直接修改配置文件: 查询SELINUX行中将enforcing内容替换成disabled # sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config 排除SELINUX行将其他行中enforcing内容替换成disabled # sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config 删除: 以行为单位删除****** 删除第8行再显示文本内容: # sed 8d passwd.txt 删除1-3行: # sed '1,3d' passwd.txt 从文本开始处一直删除到第一个空行为止,第一个空行也会被删除: # sed 1,/^$/d passwd.txt 删除文本中的空行: # sed '/^$/d' passwd.txt 删除文本中包含sshd的行: # sed '/sshd/d' passwd.txt 从第一行开始,删除偶数行: # sed 'n;d' passwd.txt 从第一行开始,每隔两行删除一行: # sed 'n;n;d' passwd.txt 删除每行行前行后的所有空格: # sed 's/^[ \t]*//; s/[ \t]*$//' passwd.txt 删除匹配行至最后一行: # sed '/sshd/,$d' passwd.txt 删除最后一行: # sed '$d' passwd.txt 删除文档中所有包含sshd的关键字,行中其他数据保留: # sed s/sshd//g passwd.txt 删除文件passwd最后六行,修改文件内容的方式,需要的话,先将文件备份: # for((i=1;i<7;i++)); do sed -i '$d' passwd.txt ; done ``` ## awk awk 主要切片列内容 awk基本原理是逐行处理文件中的数据,查找与命令行中所给定内容想匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容继续处理下一行。 **常用参数** | 参数 | 描述 | | ----------------------- | ------------------------------------------------------------ | | FS | 指定字段分隔符,默认空格 | | NF | 当前处理行的最后一列 | | OFS | 输出分隔符 | | NR | 当前处理行的行号 | | $0 | 当前处理行的整行内容 | | $n | 当前处理行的第n个字段 | | '' | 为了和shell命令区分 | | {} | 表示一个命令分组 | | pattern | 过滤器,匹配pattern条件的行才进行action处理。【action是处理动作,常见的动作为print】 | | gsub(r,s) | 在$0中用s代替r | | index(s,t) | 返回s中的 t的第一个位置 | | length(s) | s的长度 | | match(s,r) | s是否匹配r | | split(s,a,fs) | 在fs上将s分成序列a | | substr(s,p) | 返回s从p开始的子串 | | ++ -- | 增加与减少 | | ^ ** | 指数 | | + - * / % | 加减乘除取余 | | < <= == != > >= | 数值比较 | | && \|\| | 逻辑与逻辑或 | | = += -= *= /= %= ^= **= | 赋值 | **示例** ```shell 列出文件所有内容: # awk '{print $0}' netstat.txt 列出以tcp开头的行: # awk '/^tcp/ {print}' netstat.txt 列出以udp结尾的行: # awk '/udp$/ {print}' netstat.txt 默认以空格为分隔符,列出第一、第四列数据: # awk '{print $1,$4}' netstat.txt 列出第一列内容,默认以空格为分隔符: # df -TH | awk '{print $1}' 列出第一列内容,以:为分隔符: # awk -F: '{print $1}' passwd.txt 行显示 查询第3-5行内容: # awk 'NR==3,NR==5 {print}' passwd.txt 以:为分隔符查询第3-5行的第一列与最后一列: # awk -F: 'NR==3,NR==5 {print $1,$NF}' passwd.txt 将行中字符串数量大于20的行的行号显示出来: # awk 'length($0)>20 {print NR}' passwd.txt 前五行的第一列: # head -5 passwd.txt | awk -F: '{print $1}' 查询网卡信息后截取网卡IP地址并加上备注显示: # ifconfig ens32 | grep "inet" | head -1 | awk '{print "ip地址是:" $2}' ip地址是:192.168.1.10 以:为分隔符格式化输出第一列、第二列及最后一列: printf为格式化查询,-12 -6 -10 分别为每列占用多少个空格 # awk -F: '{printf "% -12s % -6s % -10s\n",$1,$2,$NF}' /etc/passwd root x /bin/bash bin x /sbin/nologin daemon x /sbin/nologin adm x /sbin/nologin lp x /sbin/nologin sync x /bin/sync shutdown x /sbin/shutdown halt x /sbin/halt ```
毛林
2025年9月12日 20:50
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码