操作系统三剑客命令-grep、sed、awk

  1. 课程介绍部分

    1. grep命令使用方法
    2. sed命令使用方法
    3. awk命令使用方法
  2. 课程知识回顾
    正则表达式的作用:
    大量的字符串文件需要进行配置,而且是非交互式的
    过滤相关的字符串,匹配字符串,查询字符串。

基本正则符号:
^ 匹配行首,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


  1. \t ↩︎


__EOF__

本文作者Crushz
本文链接https://www.cnblogs.com/Crushz-2024/p/18390299.html
关于博主:Crushz
版权声明:转载请注明来源哟~ QAQ
声援博主:UP UP UP !!!
posted @   Crushz  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示