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

00. 课程介绍部分
    1) grep命令使用方法
    2) sed命令使用方法
    3) awk命令使用方法


01. 课程知识回顾
正则表达式的作用:
大量的字符串文件需要进行配置,而且是非交互式的
过滤相关的字符串,匹配字符串,查询字符串。
 
基本正则符号:
^    匹配行首,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的行:
# 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命令的语法信息
    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@@@:查找条件也可以使用模式,但是被替换的内容不能使用模式   

# cat /etc/passwd > passwd.txt

查询:
-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

通过替换来获取网卡IP地址信息:

# ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ .netmask.*//g'
# ifconfig ens32 | grep netmask | sed -r 's/ +inet //' | sed -r 's/ +net.*//'

编写脚本: 修改文件内容信息时
网络服务中的IP地址进行修改:  50台主机迁移机房--新机房
第一个步骤: vi ifcfg-ens33
第二个步骤: 重启网络服务
第三个步骤: 检查测试    
 
自动修改网卡地址脚本:
第一个步骤: 修改地址
# sed -i "s#192.168.2.11#192.168.3.11#g" ifcfg-ens33
    
第二个步骤: 重启网络服务
# systemctl restart network
    
第三个步骤: 过滤网卡地址信息存储到一个文件中

删除:
以行为单位删除******
删除第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基本原理是逐行处理文件中的数据,查找与命令行中所给定内容想匹配的模式,如果发现匹配内容,则进行下一个编程步骤,如果找不到匹配内容继续处理下一行。
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.常用操作符、运算符及判断符
++ --     增加与减少
^ **    指数
+ - * / %    加减乘除取余
< <= == != > >=    数值比较
&& ||    逻辑与逻辑或
= += -= *= /= %= ^= **=  赋值


列出文件所有内容:
# 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值