操作系统三剑客命令-grep、sed、awk
-
课程介绍部分
- grep命令使用方法
- sed命令使用方法
- awk命令使用方法
-
课程知识回顾
正则表达式的作用:
大量的字符串文件需要进行配置,而且是非交互式的
过滤相关的字符串,匹配字符串,查询字符串。
基本正则符号:
^ 匹配行首,awk中则是匹配字符串的开始
$ 匹配行尾,awk中则是匹配字符串的结尾
^$ 表示空行
- 匹配之前的项N次或者多次,相当于 .*
. 匹配除换行符\n之外的任意单个字符,包括空格
.* 匹配所有
[] 匹配包含在[字符]之中的任意一个字符
[ok] 在文件中找有o的字符信息和在文件中有k的字符信息
PS: 将一个字符串信息,进行拆分成一个一个的字符进行匹配
[^ok] 匹配[^字符]之外的任意一个字符
[^ok] 在文件中找有0的字符信息和在文件中有k的字符信息,进行排除不要显示,显示其他信息
[ - ] 匹配[]中指定范围内的一个字符
扩展正则符号:
? 匹配之前的项1次或0次
- 匹配之前的项1次或多次
() 将多个字符信息汇总成整体,进行过滤
进行后项引用前项 (test) \1--sed
x{n} 匹配之前的项n次。n可以是0的正整数
x{3,} 之前的项至少需要匹配N次
x{n,m} 指定之前的项至少匹配n次,最多匹配m次,n<=m
egrep "a{2}" 查询数据中a连续出现两次的行,2个a以上的行也会 显示,比如一行有aaa,aaaa都会显示出来
egrep "a{1,2}" 查询数据中a出现一个a或连续两个a的行
| 交替匹配|两边的任意一项ab(c|d)匹配abc或者abd
\ 将有意义的字符信息,转义成普通字符进行识别
将特殊的扩展正则符号,转换成基础正则符号
将没有意义的字符信息转成有意义的字符
\n \t \e .
扩展正则符号使用注意:
grep命令识别扩展正则: egrep / -E
sed命令识别扩展正则: sed -r
三剑客的作用:
grep擅长查找功能,sed擅长取行和替换,awk擅长取列。
grep参数
-n 显示出匹配的行在原位置所在的行号
-a 二进制以文本方式搜索数据
-c 计算找到的搜索字符串总行数
-o 仅显示出匹配到的内容 统计文件中出现的次数
-i 不区分大小写
-v 反向选择
-E 扩展的grep,即egrep
-B 除显示匹配一行之外,并显示该行之前的num行
grep -B 3 "root" /etc/passwd
-A 除显示匹配一行之外,并显示该行之后的num行
-C 除了显示匹配的行外,并显示该行前后的各num行
-w 按单词搜索,相当于\b
-r 递归查找目录下所包含的内容
查看包含root的行:
1|0grep "root" /etc/passwd
查看不包含root的行:
2|0grep -v "root" /etc/passwd
列出以m开头和m结尾的行:
3|0grep "^m" /etc/passwd
4|0grep "m$" /etc/passwd
匹配非空行并显示出行号:
5|0grep -vn "^$" /etc/passwd
sed
sed命令: 字符流编辑工具(行编辑工具)==按照每行中的字符进行处理操作
sed在处理时一次只读取文件的一行并对这一行进行处理,并且sed将处理后的数据只会显示在屏幕上,并不会对原文件进行修改,所以说sed是一个行编辑器
在使用sed时最主要用到四个功能:增加、查询、删除、修改
sed命令的语法信息
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
选项:
-n:使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e:直接在命令列模式上进行 sed 的动作编辑;
-r:扩展的正则表达式
-f:直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的sed 动作
-i:直接编辑源文件而不是输出到屏幕
动作:
d:删除
p:查询,通常与-n同时使用
i :在被指定到的行上面插入文本
a :在被指定到的行下面插入文本
c :取代被指定的某些行
s:取代,内容取代,通常这个 s 的动作可以搭配正规表示式,例如 1,20s/old/new/g
r 文件路径:在指定的位置插入另外一个文件的内容
w 文件路径:将符合条件的所有行保存至指定的文件中
= 显示符合条件的所在行的行号
s@@@:查找条件也可以使用模式,但是被替换的内容不能使用模式
6|0cat /etc/passwd > passwd.txt
查询:
-n:只对匹配的内容进行显示
p:将查询的内容显示出来
以行号为单位查询****
查询文档第3行:
7|0sed -n '3p' passwd.txt
查询文档第1-3行:
8|0sed -n '1,3p' passwd.txt
查询第一行与最后一行:
9|0sed -n '1p;$p' passwd.txt
查询文件中所有内容:
10|0sed -n '1,$p' passwd.txt
11|0cat -n passwd.txt | sed -n '1,3p;5,10p'
以指定内容查询:
只查询sshd相关的行:
12|0sed -n '/sshd/p' passwd.txt
查询以nologin结尾的行:
13|0sed -n '/nologin$/p' passwd.txt
查询从111行开始到abc行中间的行: //匹配第一个结果即停止
14|0sed -n '/111/,/abc/p' passwd.txt
查询只包含root和张三的行:
15|0sed -n '/root/p;/zhangsan/p' passwd.txt
查询时在文本中的所有行后都加入一行空行:
16|0sed 'G' passwd.txt
查询文本内容的空行再让每行内容再隔1空行显示:
17|0sed '/^$/d;G' passwd.txt //删除文本中的空行并将其他内容隔一行空行显示
查询时让每行内容再隔2行显示:
18|0sed '/^$/d;G;G' passwd.txt
在查询到的abc后面插入一行空行
19|0sed '/abc/G' passwd.txt
在匹配abc的前面插入一空行:
20|0sed '/abc/{x;p;x;}' passwd.txt
同时在前面后面插入一空行:
21|0sed '/abc/{x;p;x;G;}' passwd.txt
为每行内容加入行号:
22|0sed = passwd.txt | sed 'N;s/\n/ /' //末尾处有一个空格,表示行号后也有空格
1 root❌0:0:root:/root:/bin/bash
2 bin❌1:1:bin:/bin:/sbin/nologin
3 daaemon❌2:2:daemon:/sbin:/sbin/nologin
4 adm❌3:4:adm:/var/adm:/sbin/nologin
为每行内容加入行号及.
23|0sed = passwd.txt | sed 'N;s/\n/./'
1.root❌0:0:root:/root:/bin/bash
2.bin❌1:1:bin:/bin:/sbin/nologin
3.daaemon❌2:2:daemon:/sbin:/sbin/nologin
4.adm❌3:4:adm:/var/adm:/sbin/nologin
增加
行级增加内容******
以行号指定插入行内容
添加信息到第一行:
24|0sed '1i00,root,level9' passwd.txt 1表示在第几行操作,i表示在第几行的前面操作
在文件第三行之后添加信息:
25|0sed '3a00,root,level9' passwd.txt 3表示在第几行操作,a表示在第几行的后面操作
在文件末尾添加一行新内容
26|0sed '$aabc' passwd.txt
同时添加两行内容呢?
27|0sed '$auseradd zhangsan\nuseradd lisi' /etc/profile
以关键字插入行内容
在匹配行的下一行添加一行数字内容,/a表示在下一行添加内容:
28|0sed '/sshd/a123456' passwd.txt
在匹配行的上一行添加一行数字内容,/i表示在上一行添加内容:
29|0sed '/sshd/i123456' passwd.txt
在有zhangsan行的前面添加###### 后面添加######信息:
-e 同一行执行多条命令
30|0sed -e '/zhangsan/i######' -e '/zhangsan/a######' passwd.txt
在匹配内容中增加内容*****
在关键字为末尾的匹配行的末尾增加新内容/aaa:
31|0sed 's/nologin$/&\aa/g' passwd.txt //&表示匹配的关键字
以下命令和上面命令区别?
32|0sed 's/nologin/&/aaa/' passwd.txt
在有包含root的行首加入字符aaa:
33|0sed '/root/s/^/&aaa/' passwd.txt
在有包含root的行尾加入字符.:
34|0sed -e '/root/s/$/&./' passwd.txt
在有包含root的行首加入字符aaa并在以bash结尾的行加入内容.:
35|0sed -e '/root/s/^/&aaa/' -e 's/bash$/&./' passwd.txt
36|0sed -e '/root/s/^/&aaa/;s/root$/&./' passwd.txt
替换:
行级替换*****
替换某一行数据:
从第1行到70行所有内容替换成一行???
37|0nl passwd.txt | sed '73c 73行数据有误!'
行范围替换:
38|0nl passwd.txt | sed '70,73c no 70-73!!!'
从指定行到文件末尾行包括末尾行进行替换:
39|0nl passwd.txt | sed '70,$c over!'
40|0nl passwd.txt | sed '71,73c 71新内容\n72新内容\n73新内容!'
指定内容进行替换******
将每行的第一个出现的root都替换成aaaa:
41|0sed s/root/aaaa/ passwd.txt
将每行的所有root都替换成aaaa:
42|0sed s/root/aaaa/g passwd.txt
将文档中1个0及以上都改成1个0
43|0sed s/0+/0/g passwd.txt
关闭selinux,使用-i表示直接修改配置文件:
查询SELINUX行中将enforcing内容替换成disabled
44|0sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
排除SELINUX行将其他行中enforcing内容替换成disabled
45|0sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config
通过替换来获取网卡IP地址信息:
46|0ifconfig ens33 | grep 'inet ' | sed 's/^.inet //g' | sed 's/ .netmask.//g'
47|0ifconfig ens32 | grep netmask | sed -r 's/ +inet //' | sed -r 's/ +net.*//'
编写脚本: 修改文件内容信息时
网络服务中的IP地址进行修改: 50台主机迁移机房--新机房
第一个步骤: vi ifcfg-ens33
第二个步骤: 重启网络服务
第三个步骤: 检查测试
自动修改网卡地址脚本:
第一个步骤: 修改地址
48|0sed -i "s#192.168.2.11#192.168.3.11#g" ifcfg-ens33
第二个步骤: 重启网络服务
49|0systemctl restart network
第三个步骤: 过滤网卡地址信息存储到一个文件中
删除:
以行为单位删除******
删除第8行再显示文本内容:
50|0sed 8d passwd.txt
删除1-3行:
51|0sed '1,3d' passwd.txt
从文本开始处一直删除到第一个空行为止,第一个空行也会被删除:
52|0sed 1,/^$/d passwd.txt
删除文本中的空行:
53|0sed '/^$/d' passwd.txt
删除文本中包含sshd的行:
54|0sed '/sshd/d' passwd.txt
从第一行开始,删除偶数行:
55|0sed 'n;d' passwd.txt
从第一行开始,每隔两行删除一行:
56|0sed 'n;n;d' passwd.txt
删除每行行前行后的所有空格:
57|0sed 's/[1]//; s/[ \t]$//' passwd.txt
删除匹配行至最后一行:
58|0sed '/sshd/,$d' passwd.txt
删除最后一行:
59|0sed '$d' passwd.txt
删除文档中所有包含sshd的关键字,行中其他数据保留:
60|0sed s/sshd//g passwd.txt
删除文件passwd最后六行,修改文件内容的方式,需要的话,先将文件备份:
61|0for((i=1;i<7;i++)); do sed -i '$d' passwd.txt ; done
awk 主要切片列内容
awk基本原理是逐行处理文件中的数据,查找与命令行中所给定内容想匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容继续处理下一行。
1.awk常见内置变量
变量 解释
FS 指定字段分隔符,默认空格
NF 当前处理行的最后一列
OFS 输出分隔符
NR 当前处理行的行号
$0 当前处理行的整行内容
$n 当前处理行的第n个字段
2.基本语法参数
'' 为了和shell命令区分
{} 表示一个命令分组
pattern 过滤器,匹配pattern条件的行才进行action处理。
action是处理动作,常见的动作为print。
3.内置函数
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开始的子串
4.常用操作符、运算符及判断符
++ -- 增加与减少
^ ** 指数
-
-
- / % 加减乘除取余
< <= == != > >= 数值比较
&& || 逻辑与逻辑或
= += -= *= /= %= ^= **= 赋值
- / % 加减乘除取余
-
列出文件所有内容:
62|0awk '{print $0}' netstat.txt
列出以tcp开头的行:
63|0awk '/^tcp/ {print}' netstat.txt
列出以udp结尾的行:
64|0awk '/udp$/ {print}' netstat.txt
默认以空格为分隔符,列出第一、第四列数据:
65|0awk '{print $1,$4}' netstat.txt
列出第一列内容,默认以空格为分隔符:
66|0df -TH | awk '{print $1}'
列出第一列内容,以:为分隔符:
67|0awk -F: '{print $1}' passwd.txt
行显示
查询第3-5行内容:
68|0awk 'NR3,NR5 {print}' passwd.txt
以:为分隔符查询第3-5行的第一列与最后一列:
69|0awk -F: 'NR3,NR5 {print $1,$NF}' passwd.txt
将行中字符串数量大于20的行的行号显示出来:
70|0awk 'length($0)>20 {print NR}' passwd.txt
前五行的第一列:
71|0head -5 passwd.txt | awk -F: '{print $1}'
查询网卡信息后截取网卡IP地址并加上备注显示:
72|0ifconfig ens32 | grep "inet" | head -1 | awk '{print "ip地址是:" $2}'
ip地址是:192.168.1.10
以:为分隔符格式化输出第一列、第二列及最后一列:
printf为格式化查询,-12 -6 -10 分别为每列占用多少个空格
73|0awk -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
\t ↩︎
__EOF__

本文链接:https://www.cnblogs.com/Crushz-2024/p/18390299.html
关于博主:Crushz
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)