shell三剑客学习

SHELL知识点学习

基本正则表达式:

^$.[]*

扩展正则表达式:
包含基本正则表达式的字符

(){}?+|等字符

基本正则表达式BRE集合

1.匹配字符
2.匹配位数
3.位置定位
在这里插入图片描述

扩展正则表达式ERE集合

必须用grep -E才能生效
在这里插入图片描述
Tip:

1.grep需要使用参数-E才能支持正则表达式
2.egrep不推荐使用,使用grep -E替代
3.grep不加参数,得在特殊字符前加"\"反斜杠,才能识别为正则

grep

grep是linux系统中的一个强大的文本搜索工具,可以按照正则表达式搜索文本,并把匹配到的行打印出来(匹配到的内容标红)

grep [options]…… pattern [file]……
命令   参数        匹配模式   文件     

匹配模式就是你想要查找的内容
参数也可以写在命令的最后

工作方式:grep在一个或者多个文件中搜索字符串模板,如果模板中包括空格,需要使用引号引起来,模板后的所有字符串会被看作是文件名。
工作结果:如果模板搜索成功,则返回0状态码;如果搜索不成功,则返回1状态码;如果搜索的文件不存在,则返回2的状态码。我们可以利用这些返回状态码进行一些自动化的shell脚本处理工作。

参数 释义

参数功能
-i不区分大小写
-A打印匹配的行以及(以后的n行)after,n为用户定义,跟在A 后面
-B打印匹配的行以及(以前的行n)before
-C匹配的前后n行
-v结果取反(匹配指定的字符串以外的内容)
-n显示行号
-E支持使用扩展的正则表达式
-b显示匹配行距文件头部的偏移量
-c只显示匹配的行数
-F匹配固定字符串的内容
-h搜索多文件时不显示文件名
-l只显示符合匹配条件的文件名
-o只显示匹配到的关键字,而不是正常的内容都输出
-q静默执行模式
-r递归搜索模式
-s不显示没有匹配文本的错误信息
-v显示不包含匹配文本的所有行
-w精准匹配整词
-x精准匹配整行
- - color =atuo指定颜色,默认值是–color=aut
词首【\ \ <或 \ \b】和词尾锚定【\ >或者\ \ b】其后面的任意字符必须作为单词首部出现;其前面的任意字符必须作为单词尾部出现

词首【\ <或\ \b】:表示单词的开头。如果我们使用【<】,它将匹配单词的开头,而不会匹配单词的中间或结尾。例如,"<shell"将匹配以"shell"开头的单词。
词尾锚定【\ \ >或者\ \ b】:表示单词的结尾。如果我们使用【>】,它将匹配单词的结尾,而不会匹配单词的开头或中间。例如,"shell>“将匹配以"shell"结尾的单词。
结合起来使用,可以确保我们匹配的是整个单词。例如,”<shell>"将匹配包含整个单词"shell"的文本,而不会匹配包含"shell"作为一部分的文本。

sed

sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变。
是操作,过滤,和转换文本内容的强大工具。
常用的功能包括结合正则表达式对文件实现快速的增删改查,其中查询的功能中最常用的两大功能就是过滤(过滤指定字符串),取行
在这里插入图片描述
sed的基本语法:

sed OPTIONS… [SCRIPT] [INPUTFILE…]
sed  选项     sed内置命令符   输入文件

选项:

选项功能
-nsed命令默认输出文件中的全部内容,当加上-n选项后,只会输出匹配到的内容;
-i直接编辑原文件,而不是由屏幕输出;默认不对原文件进行操作,只对内存中的数据操作
-e直接在命令行模式上进行sed的动作编辑,多次编辑,不需要管道符;
-r使用扩展正则表达式;
-f直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作。

sed的内置命令符用于对文件进行不同的操作功能,如对文件的增删改查

sed的常用内置命令符:

内置命令符功能示例
d删除匹配到的行[root@node13 ~]#sed ‘1 d’ file
[root@node13 ~]#sed ‘/^$/d’ /etc/hosts
p打印匹配到的行[root@node13 ~]#sed ‘1p’ file
a 文本内容将文本内容添加到匹配到的行的下一行[root@node13 ~]#sed ‘1 a hello’ file
i 文本内容将文本内容添加到匹配到的行上一行[root@node13 ~]#sed ‘1 i hello’ file
c 文本内容用文本内容替换匹配到的所有行[root@node13 ~]#sed ‘1,3 i hello’ file
s/正则/replacement/flag根据正则表达式进行匹配,将匹配到的内容替换为replacement,flag可以指定g(表示全局替换,默认只替换每行第一个)num1(表示对匹配到的第几个内容进行替换),i(不区分大小写),p(如果成功替换则打印)[root@node13 ~]#sed ‘1 s#\<print\>#echo#g’ file
[root@node13 ~]# sed ‘1 s/\bprint\b/echo/2’ file
r读入文件内容追加到匹配行后面[root@node13 ~]#sed ‘2 r /root/ceshi.sh’ file
R读入文件一行内容追加到匹配行后面[root@node13 ~]#sed ‘2 R /root/ceshi.sh’ file
w /dir/filename将匹配到的内容另存到/dir/filename中[root@node13 ~]# sed ‘1 w /dir1/file1’ file

sed的匹配范围

范围示例功能
不写地址定界表示对文件所有行进行处理
num1,num21,3或者1,$对文件的1-3行内容进行处理;如果是$表示文件的最后一行
num1,+N1,+3对文件的num1行以及以后的N行内容进行处理
first~step1~2对文件的1,3,5,7,……的行内容进行处理
/pattern//^root/,/r/I对任何能够被正则表达式匹配到的行进行处理
%pattern%%/r%可以使用其他的边界符号(例如#),对任何能够被正则表达式匹配到的行进行处理
/pattern1/,/pattern2//root/,/adm/表示正则表达式1和正则表达式2匹配到的行和两个正则表达式之间的所有行
0,/pattern1/或者1,/pattern1/0,/^adm/从第一行开始到能够被正则表达式匹配到的行之间的所有内容

在这里插入图片描述
打印与内存删除
在这里插入图片描述
打印第五行到最后一行
在这里插入图片描述
替换字符串
在这里插入图片描述
连续操作
在这里插入图片描述
增加
在这里插入图片描述
空模式下的匹配
在这里插入图片描述

awk

什么是awk

awk是Linux以及UNIX环境中现有的功能最强大的数据处理工具。简单地讲,awk是一种处理文本数据的编程语言。awk的设计使得它非常适合于处理由行和列组成的文本数据。而在Linux或者UNIX环境中,这种类型的数据是非常普遍的。

除此之外,awk 还是一种编程语言环境,它提供了正则表达式的匹配,流程控制,运算符,表达式,变量以及函数等一系列的程序设计语言所具备的特性。它从C语言中获取了一些优秀的思想。awk程序可以读取文本文件,对数据进行排序,对其中的数值执行计算以及生成报表等。

awk的工作流程

awk命令的基本语法如下:

awk ‘pattern { actions }’

在上面的语法中,pattern表示匹配模式,actions表示要执行的操作。以上语法表示,当某个文本行符合pattern指定的匹配规则时,执行actions所执行的操作。在上面的语法中,pattern和actions都是可选的,但是两者必须保证至少有一个。如果省略匹配模式pattern,则表示对所有的文本行执行actions所表示的操作;如果省略actions,则表示将匹配成功的行输出到屏幕。

对于初学者来说,搞清楚awk的工作流程非常重要。只有在掌握了awk的工作流程之后,才有可能用好awk来处理数据。在awk处理数据时,它会反复执行以下4个步骤:
(1)自动从指定的数据文件中读取行文本。
(2)自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量$1、$2等等。
(3)依次执行程序中所有的匹配模式及其操作。
(4)当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有未读取的数据行,则返回到第(1)步,重复执行(1)~(4)的操作。

awk的基本语法

awk [option] ' pattern{action} ' file
awk 可选参数 ‘模式{动作}’ 文件

模式可以是正则表达式或其他条件,用于决定是否执行相应的动作。如果模式为空,则默认匹配所有行。动作是要执行的操作,可以是打印、赋值、循环等。当模式匹配成功时,相应的动作就会被执行。
因此我的理解是:‘模式’是用来匹配行的,之后将匹配的行传送给’动作’,动作再对得到的行中的列进行操作

举个例子,下面的awk命令会打印出包含"apple"的行:

awk ‘/apple/ { print }’ file.txt
在这个例子中,模式是/apple/,表示匹配包含"apple"的行;动作是{ print },表示打印匹配到的行。

action是指动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print和printf

一条最简单的命令:

awk '{print $2}' filename

他的作用就是输出文本中第二列的信息,此时没有使用任何参数和模式
awk默认以空格为分隔符,且多个空格也识别为一个空格,作为风格符
awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分割符去工作,没有指定则默认空格

当指定了分隔符后,awk把每一行切割后的数据对应到内置变量中

字段数:相当于文件中的文本被分隔符分为几个部分,一个部分就相当于一个字段,就跟表格中的列一样

awk内置变量

变量说明
$0记录变量,表示当前正在处理的记录,也表示整行
$n字段变量,其中n为整数,且n大于1。表示第n个字段的值
NF整数值,表示当前记录(变量$0所代表的记录)的字段数
NR整数值,表示awk已经读入的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数。(显示的是文件的每一行的行号)
FNR与NR不同的是,FNR用于记录正处理的行是当前这一文件中被总共处理的行数;
FILENAME表示正在处理的数据文件的名称
FS输入字段分隔符,默认值是空格或者制表符,可使用-F指定分隔符
OFS输出字段分隔符 ,OFS=”#”指定输出分割符为#。 默认为空格
RS记录分隔符,默认值是换行符 \n
ORS输出记录分隔符(行之间的分隔符),默认值是换行符\n
ENVIRON当前shell环境变量及其值的关联数组;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

awk参数

参数解释
-F指定分割字段符
-v定义或修改一个awk内部的变量
-f从脚本中读取awk命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
打印行号和指定字段
在这里插入图片描述

打印文件第一列,倒数第二列和最后一列的内容
因为NF就是这一行的列数,所以 $ NF就是最后一列,$(NF-1) 就是倒数第二列
在这里插入图片描述

awk的分隔符有两种:

  • 输入分隔符,awk默认是空格,空白字符,变量名是FS
  • 输出分隔符,变量名OFS

FS输入分隔符

awk逐行处理文本时,以输入分隔符为准,把文本切成多个片段,默认符号是空格
当我们处理特殊文件时,没有空格的时候,可以自由指定分隔符特点
在这里插入图片描述
想打印第一列但还是全打印出来了,因为系统默认空格为分隔符,里面没有空格,所以是一个字段
在这里插入图片描述
这里当我们指定分隔符为"F"后,就可以打印出第一列的信息了
在这里插入图片描述

输出分隔符

OFS:字段间的输出分隔符

awk执行完命令,默认每个字段之间用空格隔开每一列,这个空格就是awk的默认输出符,例如
在这里插入图片描述
示例2:
在这里插入图片描述
笨办法:在每行打印时,在两个字段中间加上自定义的分隔符
在这里插入图片描述
修改默认输出分割符:以前的默认分隔符,(逗号)表示一个空格,我们用-v OFS命令修改输出风格符后,此时一个逗号就表示"==="
在这里插入图片描述

ORS:行之间的输出分隔符

awk默认认为,每一行结束了,就得添加回车回车换行符(系统默认为\n)
ORS变量可以更改输出符
在这里插入图片描述
这里就通过- V 选项重定义了ORS的输出符

awk的模式

在awk中,匹配模式处于非常重要的地位,它决定着匹配模式后面的操作会影响到哪些文本行。awk中的匹配模式主要包括关系表达式、正则表达式、混合模式,BEGIN模式以及END模式等。

(1)关系表达式
awk提供了许多关系运算符,例如大于>、小于<或者等于==等。awk允许用户使用关系表达式作为匹配模式,当某个文本行满足关系表达式时,将会执行相应的操作。

[root@localhost test11]# cat file 
liming 80
wangmei 70
zhangsan 90
lisi 81
[root@localhost test11]# awk '$2 > 80 {print}' file
zhangsan 90
lisi 81

(2)正则表达式
awk支持以正则表达式作为匹配模式,与sed一样,用户需要将正则表达式放在两条斜线之间,其基本语法如下:/regular_expression/

[root@localhost test11]# awk '/^l/{print}' file
liming  80
lisi	81
[root@localhost test11]# awk '/^l|z/{print}' file
liming  80
zhangsan  90
lisi	81

(3)混合模式
awk不仅支持单个的关系表达式或者正则表达式作为模式,还支持使用逻辑运算符&&、||或者!将多个表达式组合起来作为一个模式。其中,&&表示逻辑与,||表示逻辑或,!表示逻辑非。

[root@localhost test11]# awk '/^l/ && $2>80 {print}' file
lisi	81

(4)区间模式
awk还支持一种区间模式,也就是说通过模式可以匹配一段连续的文本行。区间模式的语法如下:

pattern1, pattern2

其中,pattern1和pattern2都是前面所讲的匹配模式,可以是关系表达式,也可以是正则表达式等。当然,也可以是这些模式的混合形式。

[root@localhost test11]# awk '/^liming/,$2==90 {print}' file
liming  80
wangmei  70
zhangsan  90

(5)BEGIN模式
BEGIN模式是一种特殊的内置模式,其成立的时机为awk程序刚开始执行,但是又尚未读取任何数据之前。因此,该模式所对应的操作仅仅被执行一次,当awk读取数据之后,BEGIN模式便不再成立。所以,用户可以将与数据文件无关,而且在整个程序的生命周期中,只需执行1次的代码放在BEGIN模式对应的操作中。(简单一句话来说就是,在对文本进行操作之前要完成的事)

[root@localhost test11]# cat 1.sh 
#!/bin/awk -f
BEGIN {print "hello,world"}
[root@localhost test11]# ./1.sh 
hello,world
[root@localhost ~]# awk -F: 'BEGIN {printf "%-15s %-3s %-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-15s %-3s %-15s\n",$1,$3,$7}' /etc/passwd

(6)END模式
END模式是awk的另外一种特殊模式,该模式成立的时机与BEGIN模式恰好相反,它是在awk命令处理完所有的数据,即将退出程序时成立,在此之前,END模式并不成立。无论数据文件中包含多少行数据,在整个程序的生命周期中,该模式所对应的操作只被执行1次。因此,一般情况下,用户可以将许多善后工作放在END模式对应的操作中。(简单一句话来说就是,在对文本完成操作之后要完成的事)

[root@localhost test11]# cat 2.sh 
#! /bin/awk -f
BEGIN {
   print "scores report"
   print "================================="
}
{ print }
END {
   print "================================"
   print "printing is over"
}
[root@localhost test11]# ./2.sh file 
scores report
=================================
liming  80
wangmei  70
zhangsan  90
lisi	81
================================
printing is over
[root@localhost ~]# awk -F: 'BEGIN {printf "%-15s %-3s %-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-15s %-3s %-15s\n",$1,$3,$7} END {print "-----End file-----"}' /etc/passwd

awk的格式化输出

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2090314fb295475f846a447cc931f8fd.png

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值