【shell 编程-三剑客】【grep】【sed】【awk】

shell 编程-grep

grep命令是Globally search a Regular Expression and Print的缩写,表示进行全局的正则匹配并进行打印。grep的相关扩展命令egrep其中egrep支持更多的正则匹配。

grep基本正则匹配

< 词首定位符号 >词尾定位符号

[root@linux-server ~]# cat jack.txt
Jack JACK JAck jackly jack
:% s/<[Jj]ack>/123/g

^以什么开头 [root@linux-server ~]# grep ‘^root’ /etc/passwd
KaTeX parse error: Expected 'EOF', got '#' at position 28: …linux-server ~]#̲ grep 'bash’ /etc/passwd
root❌0:0:root:/root:/bin/bash
confluence❌1000:1000:Atlassian Confluence:/home/confluence:/bin/bash
to❌1003:1003::/home/to:/bin/bash

. 匹配单个字符
[root@linux-server ~]# grep ‘r…t’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin
[root@linux-server ~]#
grep ‘r.t’ /etc/passwd
operator❌11:0:operator:/root:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

.* 任意多个字符
[root@linux-server ~]# grep ‘r.*t’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network❌192:192:systemd Network Management:/:/sbin/nologin polkitd❌999:997:User for polkitd:/:/sbin/nologin postfix❌89:89::/var/spool/postfix:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin
tss❌59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
apache❌48:48:Apache:/usr/share/httpd:/sbin/nologin
abrt❌1041:1041::/home/abrt:/bin/bash

[] 匹配方括号中的任意一个字符
[root@linux-server ~]# useradd Root
[root@linux-server ~]# grep ‘Root’ /etc/passwd
[root@linux-server ~]# grep ‘[Rr]oot’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
Root❌1000:1000::/home/Root:/bin/bash

[ - ] 匹配指定范围内的一个字符
[root@linux-server ~]# grep [a-z]oot /etc/passwd #a-z
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin

[^] 匹配不在指定组内的字符,非得意思
[root@linux-server ~]# grep ‘[^0-9]’ /etc/passwd

[root@linux-server ~]# grep ‘[^0-9A-Z]oot’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin
#注意:在[]内表示取反,在[]外表示以什么开头

()匹配后的标签
[root@linux-server ~]# cat file1.txt
IPADDR=192.168.1.123
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
DNS=114.114.114.114
用法;
:%s/(192.168.1.)123/\12/
:%s/(192.)(168.)(1.)12/\1\2\35/

在这里插入图片描述

扩展正则匹配—egrep

egrep 支持正则表达式的拓展元字符
[root@linux-server ~]# egrep ‘[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}’ /etc/resolv.conf
nameserver 192.168.246.2

  • 匹配一个或多个前导字符
    [root@linux-server ~]# egrep ‘ro+t’ /etc/passwd
    root❌0:0:root:/root:/bin/bash
    operator❌11:0:operator:/root:/sbin/nologin
    dockerroot❌998:995:Docker User:/var/lib/docker:/sbin/nologin

a|b 匹配a或b
[root@linux-server ~]# netstat -anlp|egrep ‘:80|:22’
[root@linux-server ~]# egrep ‘root|jack’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
jack1❌1001:1001::/home/jack1:/bin/bash
jack2❌1002:1002::/home/jack2:/bin/bash

x{m} 字符x重复m次
[root@linux-server ~]# cat a.txt
love
love.
loove
looooove
[root@linux-server ~]# egrep ‘o{2}’ a.txt
loove
looooove
[root@linux-server ~]# egrep ‘o{2,}’ a.txt
loove
looooove
[root@linux-server ~]# egrep ‘o{6,7}’ a.txt
在这里插入图片描述

shell 编程-SED

sed:stream editor(流编辑器)的缩写是一种在线非交互式编辑器,它一次处理一行内容。这样不断重复,直到文件末尾。

Sed主要用

来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

非交互式编辑器,一次处理一行内容。

支持正则表达式
与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符,用于查找和替换,以下是sed支持的元字符:
使用基本元字符集 ^, $, ., *, [], [^], < >,()
使用扩展元字符集 ?, +, { }, |, ( )
在这里插入图片描述
sed基本用法
在这里插入图片描述

打印

sed 默认会输出文件的每一行,无论这行内容是否能匹配上匹配模式
语法:
sed -r ‘匹配内容’ file_name
-r:支持扩展正则,在实际使用的时候,都会加上 -r 参数,即使没有用的扩展正则也不会有任何影响。

搜索替换

sed会自动打印文件的每一行,同时查找模式匹配的行,找到后执行后面的命令,默认是 p 打印(不加 -n 的情况下)
在这里插入图片描述

4.-n #静默输出(不打印默认输出)

[root@localhost ~]# sed -r -n ‘s/MA/Massachusetts/’ test.txt
案例:
[root@localhost ~]# sed -r ‘s/SELINUX=disabled/SELINUX=enabled/’ /etc/sysconfig/selinux

多重编辑选项

在这里插入图片描述

地址(定址)

地址用于决定对哪些 进行编辑。地址形式可以是数字、正则表达式或二者的结合。如果没有指定地址,sed将处理输入文件中的所有行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

sed流编辑器命令用法及解析

在这里插入图片描述

sed常见操作

在这里插入图片描述

awk

awk处理过程: 依次对每一行进行处理,然后输出,默认分隔符是空格或者tab键

三、awk工作原理

awk -F":" '{print $1,$3}' /etc/passwd
(1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束
(2)然后,行被空格分解成字段,每个字段存储在已编号的变量中,从$1开始

参数以及用法
| BEGIN{} | 是可选项读取内容前加的内容 |
|END{}|文本全部读入完成之后执行的命令|
|\n | 默认是awk换行符 |
| 0 : ∣ 表 示 整 行 ; ∣ ∣ N F : ∣ 统 计 字 段 的 个 数 ∣ ∣ 0: |表示整行; | |NF :|统计字段的个数| | 0:NF:NF:| 表示最后一列的信息|
| RS: | 输入记录分隔符 |
| ORS:| 输出记录分隔符。 |
| NR: | 打印记录号,(行号) |
| FNR:| 可以分开,按不同的文件打印行号。 |
| FS : | 输入字段分隔符,默认为一个空格。 |
|OFS | 输出的字段分隔符,默认为一个空格。|
| $1,$2 | 第一个字段,第二个字段,依次类推… |
|\t\ tab补全,输入几个补几个 |

实战案例

FS(输入字段分隔符)—一般简写为-F(属于行处理前)
语法;awk ‘BEGIN{FS=":"} {print $1,$2}’ /etc/passwd
root x
bin x
语法;cat /etc/passwd | awk -F":" ‘{print $1,$2}’
root x
bin x
如果-F不加默认为空格区分!

OFS(输出字段分隔符)
语法;[root@awk ~]# cat /etc/passwd | awk ‘BEGIN{FS=":";OFS="…"} {print $1,$2}’
root…x
bin…x

NR 表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号
语法;[root@awk ~]# awk ‘{print NR,$0}’ a.txt NR代表打印第几行
1 love
2 love.
3 loove
4 looooove

FNR:表示记录编号, 在awk将行做为记录, 该变量相当于当前行号,也就是记录号(#会将不同文件分开)
语法;awk ‘{print FNR,$0}’ a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
1 isuo
2 IPADDR=192.168.246.211
3 hjahj123

RS(输入记录分隔符)
语法;cat passwd | awk ‘BEGIN{RS=“bash”} {print $0}’
root❌0:0:root:/root:/bin/
bin❌1:1:bin:/bin:/sbin/nologin

ORS(输出记录分隔符)
语法;cat passwd | awk ‘BEGIN{ORS=" "} {print $0}’
root❌0:0:root:/root:/bin/bash bin❌1:1:bin:/bin:/sbin/nologin

NF:统计字段的个数
语法;cat /etc/passwd | awk -F":" ‘{print NF}’
7
7

$NF:打印最后一列
语法;cat /etc/passwd | awk -F":" ‘{print $NF}’
/bin/bash
/sbin/nologin

关系运算符号

实现 字符串的完全相等需要使用 ==

字符串需要使用双引号
!= 表示不等于
语法
[root@awk ~]# awk -F":" ‘$NF == “/bin/bash”’ /etc/passwd
[root@awk ~]# awk -F":" ‘$1 != “root”’ /etc/passwd

比较表达式:
比较表达式采用对文本进行比较,只有当条件为真,才执行指定的动作。
比较表达式使用***关系运算符***,用于比较数字与字符串。

关系运算符有
< 小于 例如 x<y
> 大于 x>y
<= 小于或等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大于等于 x>=y

案例;
[root@awk ~]# awk -F":" ‘$3 == 0’ /etc/passwd
[root@awk ~]# awk -F":" ‘$3 < 10’ /etc/passwd

算术运算:+, -, *, /, %(模: 取余), ^(幂:2^3)

可以在模式中执行计算,awk都将按浮点数方式执行算术运算
语法;awk -F: ‘$3 * 10 > 500’ /etc/passwd

常见使用

在这里插入代码片1.打印一个文件中的第2列和第5列

```shell
# cat /etc/passwd | awk -F : '{print $2,$5}'

2.打印指定行指定列的某个字符

# free -m | awk 'NR==2 {print $2}'

3.统计一个文件的行数

# cat /etc/passwd | awk '{print NR}'

获取根分区的使用量

## 在awk中使用if条件判断
i++===先赋值在运算
++i===先运算在赋值
if语句:
{if(表达式){语句;语句;...}}

实战案例:
显示管理员用户姓名
[root@qfedu ~]# cat /etc/passwd | awk -F":" '{if($3==0) {print $1 " is administrator"}}'

统计系统用户数量
[root@qfedu ~]# cat /etc/passwd | awk -F":" '{if($3>=0 && $3<=1000){i++}} END{print i}'

## 在awk中使用for循环
每行打印两遍
[root@qfedu ~]# awk '{for(i=1;i<=2;i++) {print $0}}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
## awk    多次使用
![在这里插入图片描述](https://img-blog.csdnimg.cn/f47ce6f5396e4dbfba32a56b7f8ee566.png)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值