linux的正则表达式

目录

正则表达式

grep命令

grep命令的语法

grep -v:取反

grep -m:多个匹配只取第一个

grep -n:显示匹配内容和匹配行号

grep -o:仅显示匹配到的字符串,不再输出其他内容

grep -A:after 显示匹配到的行以及匹配行的后几行(行数可自定义)

grep -B:before 显示匹配行以及匹配行的前几行(行数可自定义)

grep -C:显示匹配行以及匹配行的前后各几行(行数可自定义)

grep -e:实现多个选择逻辑或的关系(逻辑关系可以有多个)

grep -f:过滤出两个文件相同内容

grep -r:递归目录下所有包含过滤内容的文件以及匹配的内容行。但是不处理软连接ln -s

grep -R:递归目录下所有包含过滤内容的文件以及匹配的内容行。但是不处理软连接

| 管道符的方式同样也可以

sort命令

sort -n:按照数字进行排序

sort -r:反向排序

sort -u:去重,相同的数据行只显示一行

小练习

uniq命令

sort去重和uniq去重的区别

uniq -c:统计连续重复的行的次数,合并重复的行

uniq -u:显示仅出现一次的行(包括不连续的重复行也算仅出现一次的行)

uniq -d:仅显示重复出现的行(必须是了连续的重复行)

tr命令

tr -c:必须保留字符集1的字符,其他字符用字符集2来进行替换

tr -d:删除字符集

tr -s:将重复出现的字符串压缩为一个字符。

tr -t:替换可以不加选项-t

cut命令

cut -f:对字段进行截取

文件拆分

split -l:指定行数拆分

分件合并

paste和cat的区别

paste:左右合并

cat:上下合并

小练习

正则表达式

通配符和正则表达式的区别

元字符

转义符

基本正则表达式

表示次数

*:匹配前面的字符任意次包括0次,尽可能长的匹配

.*:匹配前面的字符任意次,但是不包括0次。也就是匹配所有。

\?:匹配前面的字符出现0次,或者1次。有且只有一次

\ +:匹配前面出现的字符,至少出现一次,也就是>=1

\ {n \ }:匹配前面出现的字符等于几次

\ {m,n \ }:匹配前面出现的字符最少m次,最多是n次

\ { ,n \ }:匹配前面的字符最多n次。没有也算

\ {n, \ }:匹配前面的字符最少n次,只要连续出现n次,后面的都算。

例题:过滤出IP地址

基本正则表达式总结

位置锚定

^:行首锚定。以什么为开头

$:行尾锚定。以什么为结尾

^root$:匹配行模式。整行匹配且需要单独一行只有这一个

^$:是空白行

\ < 或者 \b:词首锚定

\ > 或者 \b:词尾锚定

位置锚定总结

分组以及逻辑或

():分组

\ | :逻辑或

sed编辑器

sed的操作格式

sed的功能

文本内容过滤-----sed

思考题

sed使用扩展正则表达式

思考题

sed删除文件内容

指定删除

匹配字符串的内容进行删除

sed修改和替换

把大写转换成小写

练习题

单字符替换

sed新增命令

sed的总结

awk

awk的格式

awk的常用选项

awk的内置变量

awk的总结

awk的内置变量


正则表达式

指的是对文件内容进行的增删改查

例如linux的文本三剑客:grep、sed、awk

grep:表示过滤(查找文本内容---配合正则表达式一块使用)查

sed:表示修改

awk:表示对行来进行却列,awk自带编程,类java

grep命令

grep命令主要作用就是对日志内容进行过滤。

grep命令都是按行来处理的

grep命令的语法

grep -v:取反

表示找出不包含“root”的行

grep -m:多个匹配只取第一个

grep -m 表示多个匹配,后面的数字可以自定义,不加数字会报错

grep -n:显示匹配内容和匹配行号

grep -o:仅显示匹配到的字符串,不再输出其他内容

linux的正则表达式_第1张图片

grep -A:after 显示匹配到的行以及匹配行的后几行(行数可自定义)

linux的正则表达式_第2张图片

grep -B:before 显示匹配行以及匹配行的前几行(行数可自定义)

grep -C:显示匹配行以及匹配行的前后各几行(行数可自定义)

linux的正则表达式_第3张图片

grep -e:实现多个选择逻辑或的关系(逻辑关系可以有多个)

grep -f:过滤出两个文件相同内容

linux的正则表达式_第4张图片

linux的正则表达式_第5张图片

grep -f会以第一个文件为标的:只看红色部分。红色部分就是匹配到的部分

grep -r:递归目录下所有包含过滤内容的文件以及匹配的内容行。但是不处理软连接ln -s

linux的正则表达式_第6张图片

grep -R:递归目录下所有包含过滤内容的文件以及匹配的内容行。但是不处理软连接

linux的正则表达式_第7张图片

| 管道符的方式同样也可以

sort命令

sort:以行为单位对文件内容进行排序,也可以根据不同的数据类型进行排序

写法1

sort 选项 参数

写法2

cat /etc/passwd | sort 选项 参数

linux的正则表达式_第8张图片

sort -b:忽略每行前面的空格,进行排序,而不是把空格缩进,有空格也不影响排序

sort -n:按照数字进行排序

linux的正则表达式_第9张图片

sort -r:反向排序

linux的正则表达式_第10张图片

sort -u:去重,相同的数据行只显示一行

linux的正则表达式_第11张图片

sort -o:输出文件。把排序后的结果输出到指定的内容文件

小练习

把原文件格式不变定向传输到另一个文件中

linux的正则表达式_第12张图片

uniq命令

快捷去重 uniq:用于报告或者忽略文件中连续的重复行。常与sort命令结合使用

写法1

uniq 选项 参数

写法2

cat 文件 | uniq 选项

sort去重和uniq去重的区别

linux的正则表达式_第13张图片

linux的正则表达式_第14张图片

uniq -c:统计连续重复的行的次数,合并重复的行

linux的正则表达式_第15张图片

uniq -u:显示仅出现一次的行(包括不连续的重复行也算仅出现一次的行)

linux的正则表达式_第16张图片

uniq -d:仅显示重复出现的行(必须是了连续的重复行)

tr命令

tr的作用就是对字符进行替换压缩和删除

tr 选项 参数

echo 123: | tr 选项

常用选项:

tr -c:必须保留字符集1的字符,其他字符用字符集2来进行替换

替换的字符集默认输出2个

tr -d:删除字符集

linux的正则表达式_第17张图片

tr -s:将重复出现的字符串压缩为一个字符。

linux的正则表达式_第18张图片

linux的正则表达式_第19张图片

tr -s:相同行的内容不会压缩,只会压缩相同的字符

linux的正则表达式_第20张图片

linux的正则表达式_第21张图片

tr -t:替换可以不加选项-t

linux的正则表达式_第22张图片

cut命令

cut:对字段进行截取和裁剪

cut 选项 参数

cat 文件名 | cut 选项

cut -d:指定分隔符

cut -f:对字段进行截取

以冒号为分割符,截取1-3列

以冒号分割符,截取1和3列

cut -b:以字节为单位截取

cut -c:以字符为单位截取

cut -complement:排除所指定的字段

cut --output-delimiter:更改原内容的分隔符

cut命令和awk有相似之处,都是对行来去列。

cut的默认分割符是tab键。主要是切文本,指定分隔符明显最好是指向性越强越好

awk的默认分隔符就是空格,把多个连续的空格当作一个处理

文件拆分

split:可以把文件拆分成若干个小文件

用split命令对文件进行拆分

split -l:指定行数拆分

split -b:指定文件大小进行拆分

文件大可以用大小来切,文件小可以用行数来切。无法合并

分件合并

分件合并:paste

paste和cat的区别

paste:左右合并

linux的正则表达式_第23张图片

cat:上下合并

文件合并输出了才可以保存

小练习

如何统计当前主机的连接状态。有多少个listen监听。有多少个estab

linux的正则表达式_第24张图片

linux的正则表达式_第25张图片

正则表达式

核心:匹配文件内容。根据特定的字符和表达式匹配文件内容。

在Linux环境下:grep命令、sed命令、awk命令

nginx、mysql配置文件也可以支持正则表达式

通配符和正则表达式的区别

*匹配任意一个或者多个字符

?匹配任意一个字符

[] 可以是范围匹配,也可以是单个字符

linux的正则表达式_第26张图片

通配符只是匹配文件名和文件内容没有关系

元字符

. 点表示匹配任意单个字符,可以是一个汉字。

linux的正则表达式_第27张图片

转义符

\ 配上.点,变成斜杠\ .点。此时点就代表点

linux的正则表达式_第28张图片

()表示分组 只有\ ( \ )才表示()

[] 表示匹配任意范围内的单个字符

linux的正则表达式_第29张图片

红字就标识正则表达式

使用正则表达式一定要把匹配内容引起来

[^a-z] 取反

linux的正则表达式_第30张图片

”[[:blank:]]“ 既可以匹配空格也可以匹配制表符(tab)

"[]" 只能匹配空格

"[:space:]" 空格 tab键 换行符 回车 各种类型的空白都可以匹配

" [:cntrl:]" 匹配退格 删除

基本正则表达式

表示次数

*:匹配前面的字符任意次包括0次,尽可能长的匹配

linux的正则表达式_第31张图片

这里*表示前面的o出现了多少次(没有也可以匹配)

.*:匹配前面的字符任意次,但是不包括0次。也就是匹配所有。

linux的正则表达式_第32张图片

\?:匹配前面的字符出现0次,或者1次。有且只有一次

linux的正则表达式_第33张图片

\ +:匹配前面出现的字符,至少出现一次,也就是>=1

linux的正则表达式_第34张图片

\ {n \ }:匹配前面出现的字符等于几次

linux的正则表达式_第35张图片

\ {m,n \ }:匹配前面出现的字符最少m次,最多是n次

linux的正则表达式_第36张图片

\ { ,n \ }:匹配前面的字符最多n次。没有也算

linux的正则表达式_第37张图片

\ {n, \ }:匹配前面的字符最少n次,只要连续出现n次,后面的都算。

linux的正则表达式_第38张图片

例题:过滤出IP地址

linux的正则表达式_第39张图片

ifconfig ens33 | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" 
基本正则表达式总结

*:匹配前面的字符任意次包括0次,尽可能长的匹配

.*:匹配前面的字符任意次,但是不包括0次。也就是匹配所有。

\?:匹配前面的字符出现0次,或者1次。有且只有一次

\ +:匹配前面出现的字符,至少出现一次,也就是>=1

\ {n \ }:匹配前面出现的字符等于几次

\ {m,n \ }:匹配前面出现的字符最少m次,最多是n次

\ { ,n \ }:匹配前面的字符最多n次。没有也算

\ {n, \ }:匹配前面的字符最少n次,只要连续出现n次,后面的都算。

位置锚定

^:行首锚定。以什么为开头
$:行尾锚定。以什么为结尾

linux的正则表达式_第40张图片

^root$:匹配行模式。整行匹配且需要单独一行只有这一个

linux的正则表达式_第41张图片

^$:是空白行

linux的正则表达式_第42张图片

^[[:space:]]:也表示空白行
\ < 或者 \b:词首锚定

一般用于匹配单词模式的左侧

从左往右全部都算,所有一起都包含,所有都算匹配到

linux的正则表达式_第43张图片

\ > 或者 \b:词尾锚定

一般用于匹配单词模式的右侧

只匹配右侧的单词,左侧的单词不匹配

linux的正则表达式_第44张图片

位置锚定总结

^:行首锚定。以什么为开头

$:行尾锚定。以什么为结尾

^root$:匹配行模式。整行匹配且需要单独一行只有这一个

^$:是空白行  ^[[:space:]]:也表示空白行

\ < 或者 \b:词首锚定  从左往右全部都算,所有一起都包含,所有都算匹配到

\ > 或者 \b:词尾锚定  只匹配右侧的单词,左侧的单词不匹配

分组以及逻辑或

():分组

linux的正则表达式_第45张图片

不是连续出现,只算出现一次

\ | :逻辑或

linux的正则表达式_第46张图片

加了()相当于把1abc和2abc合并为1组

grep -E 扩展正则表达式

1 * :匹配前面的字符任意次包括0次,尽可能长的匹配

2 . * : 匹配前面的字符任意次,但是不包括0次。也就是匹配所有。

3 ?: 匹配前面的字符出现0次,或者1次,有且只有一次。

4 +:匹配前面出现的字符,至少出现一次,也就是>=1,

5 {n }:匹配前面出现的字符等于几次。

6 {m,n }:匹配前面出现的字符最少M次,最多是n次

7 { ,n } : 匹配前面的字符最多N次,没有也算。

8 { n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。 9 |:表示逻辑或 grep -E egrep 扩展正则表达式这两个都可以

sed编辑器

文本三剑客:grep过滤文本内容 查

sed:行编辑器

sed也是按行来处理。

sed是一种流编辑器。每一次处理内容只有确认才会生效。如果不确认,只是把模式空间的临时数据展示给用户,然后删除。

sed是按照文本的行,一行一行向下处理,知道文件的最后一行。

默认情况下:sed都是在模式空间执行,因此元文件不会发生变化。

linux的正则表达式_第47张图片

sed的操作格式

sed -e "操作" 文件1 文件2

sed -e "操作1;操作2" 文件

sed -e:指定命令来处理输入的文本文件。如果只有一个操作那-e可以省略。多个指令才会用-e

sed -f:用特定的脚本文件来处理来处理输入的文件。

sed -i:即时生效。立即生效(慎用)

sed -n:仅显示script处理之后的结果

sed的功能

sed最强的功能就是替换功能

sed的操作符: p: 打印 =:只打印行号 d:删除行

sed的打印功能

linux的正则表达式_第48张图片

sed 'p':打印

linux的正则表达式_第49张图片

sed -e 'p' sed默认自己会输出结果,加上了p打印,就有了两行

sed -n 就是禁止了默认输出

linux的正则表达式_第50张图片

sed -n '2p' 文件名 输出指定行,其他的都没有

sed -n '=' 文件名 只显示行号

=号 只打印行号

linux的正则表达式_第51张图片

sed -n '=;p' 文件名 显示行号和内容

linux的正则表达式_第52张图片

sed -n '$p' 文件名 打印最后一行

linux的正则表达式_第53张图片

sed -n '1,3p' 文件名 范围打印

linux的正则表达式_第54张图片

sed -n '1;3p' 文件名 打印第一行和第三行

sed -n '1p;$p' 文件名 打印第一行和最后一行

或者sed -n -e '1p' -e '$p' 文件名

sed -n 'n;p' 文件名 打印偶数行

n在p的前面就是跳过当前一行,打印下一行。

sed -n 'p;n' 文件名 打印奇数行

p在n的前面就是打印当前一行,跳过下一行继续打印。

linux的正则表达式_第55张图片

文本内容过滤-----sed

方法1

sed -n '/o/p' 文件名 打印所有包含o的行 打印指定的过滤内容

格式:sed -n '/过滤内容/p' 文件名

linux的正则表达式_第56张图片

方法2使用正则表达式进行过滤:^表示以什么为开头 $表示以什么为结尾

linux的正则表达式_第57张图片

思考题

cat /etc/passwd | sed -n '4,/bash$/p' 匹配从第四行开始到最后一行bash结尾的行

linux的正则表达式_第58张图片

sed使用扩展正则表达式

sed -r 使用扩展正则

{n }:匹配前面出现的字符等于几次。

{m,n }:匹配前面出现的字符最少M次,最多是n次

{ ,n } : 匹配前面的字符最多N次,没有也算。

{ n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。

思考题

包含两个99:的所在行打印出来

打印所有要么是以root为开头,要么是以bash为结尾的行

linux的正则表达式_第59张图片

sed删除文件内容

‘d’:操作符,删除的意思是删除行。免交互删除

指定删除

sed -n '3d;p' 文件名 删除第三行,打印剩余行

linux的正则表达式_第60张图片

sed -n '2,6d;p' 文件名 删除第二行到第六行,打印剩余行

linux的正则表达式_第61张图片

sed -n '5,$d;p' 文件名 删除第五行到最后一行,打印剩余行

linux的正则表达式_第62张图片

sed -n '1,4!d;p' 文件名 取反删除其他行保留1-4行

linux的正则表达式_第63张图片

匹配字符串的内容进行删除

sed '/o/d' 文件名 删除包含o的行

linux的正则表达式_第64张图片

sed '/one/,/six/d' 文件名 删除one到six之间的行

linux的正则表达式_第65张图片

sed '/one/,/six/!d' 文件名 取反,保留one到six之间的行删除其他行

linux的正则表达式_第66张图片

sed '/^$/d' 文件名 正则匹配删除空行

linux的正则表达式_第67张图片

grep -v '^$' 过滤出非空行

linux的正则表达式_第68张图片

sed和grep两种方法都可以

sed修改和替换

sed 字符串替换的格式:sed 's/要替换的内容/新的内容/p' 文件名

sed 整行替换的格式:sed '/要替换的内容/c 新的内容' 文件名

s:替换字符串

c:整行替换

y:单字符替换。要替换的内容和新的内容必须要前后长度保持一致

sed -n 's/root/test/p' /etc/passwd 替换第一个出现的root为test

linux的正则表达式_第69张图片

sed -n 's/root/test/2p' /etc/passwd 替换第二个出现的root为test

这里的p表示需要更换第几个。

sed -n 's/root/test/gp' /etc/passwd 替换所有的root为test

linux的正则表达式_第70张图片

练习:以root开头的替换成#号键。/etc/passwd

cat /etc/passwd | sed -n '/^root/ s/^/#/p'

对字母字符进行大小写替换

把大写转换成小写

sed 's/[A-Z]/\l&/g' 文件名 把大写全部转换成小写

linux的正则表达式_第71张图片

l&:转换成小写的特殊符号,需要在l&前面加转义符\一起使用 \l&

sed 's/[a-z]/\u&/' 文件名 把小写字母的开头转换成大写

linux的正则表达式_第72张图片

u&:转换成大写的特殊符号,需要在u&前面加转义符\一起使用 \u&

sed 's/[a-z]/\u&/g' 文件名 把小写字母全部转换成大写

linux的正则表达式_第73张图片

这里g表示全部

练习题

替换ip地址

cat ifcfg-ens33 | sed '/IPADDR/c IPADDR=1.1.1.1'

linux的正则表达式_第74张图片

单字符替换

sed 'y/on/12/' 文件名 单个字符替换

linux的正则表达式_第75张图片

要替换的内容和新的内容必须长度一致

sed新增命令

a:在匹配行的下一行添加内容

i:在匹配行的上一行添加内容

r:可以在其他文件读取内容,然后在匹配行的行后添加

sed '/原来的内容/a 新的内容' 文件名

sed '/three/a guoqizhenshuai' 文件名 表示在three的下一行插入新的内容

linux的正则表达式_第76张图片

sed '/原来的内容/i 新的内容' 文件名

sed '/three/i guoqizhenshuai' 文件名 表示在three的上一行插入新的内容

linux的正则表达式_第77张图片

sed '/six/r ifconcfg-ens33' 文件名 在six下面一行插入其他文件内的内容

也可以用绝对路径表示sed '/six/r /etc/passwd' 文件名

sed '$a 123' test.txt'

$a:可以在文本的最后一行添加内容(推荐,在文本的行后追加内容是最直观的)

linux的正则表达式_第78张图片

sed '$i 123' test.txt

$i:可以在文本的最后一行的上一行添加内容(不太好用)

linux的正则表达式_第79张图片

echo lwkyylyw | sed -r 's/(lwk)(yy)(lyw)/\3\2\1/' 字符位置替换。可以用数字表示位置

linux的正则表达式_第80张图片

文件名 | sed -r 's/(内容1)(内容2)(内容3)/\1\2\3/'

echo lwkyylyw | sed -r 's/(lwk)(yy)(lyw)/\3\1/' 字符位置替换。也可以删除所代表的数字来实现过滤字符串

扩展正则表达式加分组的方式来替换

sed -f 执行文件 处理对象

linux的正则表达式_第81张图片

练习:提取版本号

提取版本号

ant-1.9.7.jar
ant-launcher-1.9.7.jar
antlr-2.7.7.jar
antlr-runtime-3.4.jar
aopalliance-1.0.jar
archaius-core-0.7.6.jar
asm-5.0.4.jar
aspectjweaver-1.9.5.jar
bcpkix-jdk15on-1.64.jar
bcprov-jdk15-1.46.jar
bcprov-jdk15on-1.64.jar
checker-compat-qual-2.5.5.jar

使用cat 123.txt | sed -r 's/(. * )-(. * )(\.jar)/\2/'

linux的正则表达式_第82张图片

用sed查看10分到50分的所有日志

sed -n '/开头的内容/,/目的开头的内容/p'

思考题:现在有一个文件,文件名我想保留,但是原有的内容我要删除且要使用面交互删除

方法1 cat /dev/null > test.txt

linux的正则表达式_第83张图片

方法2 sed -i 'd' test.txt

linux的正则表达式_第84张图片

sed的总结

sed -e "操作" 文件1 文件2

sed -e "操作1;操作2" 文件

sed -e:指定命令来处理输入的文本文件。如果只有一个操作那-e可以省略。多个指令才会用-e

sed -f:用特定的脚本文件来处理来处理输入的文件。

sed -i:即时生效。立即生效(慎用)

sed -n:仅显示script处理之后的结果

sed使用扩展正则表达式:

sed -r 使用扩展正则

{n }:匹配前面出现的字符等于几次。

{m,n }:匹配前面出现的字符最少M次,最多是n次

{ ,n } : 匹配前面的字符最多N次,没有也算。

{ n, }: 匹配前面的字符最少N次,只要连续出现N次,后面的都算。

sed 可以增删改查

sed 也可以结合正则表达式

但是sed最主要的作用:改 增

使用sed命令时,注意,大文件一定要分割之后再交给sed处理

搭配扩展正则:sed -r {n} {n,} {n,m} {,m} 可以不用加\

使用sed -i 立即生效,要注意,事先做好测试,还要做好备份。

sed的功能

sed最强的功能就是替换功能

sed的操作符: p: 打印 =:只打印行号 d:删除行

sed -n '=;p' 文件名 显示行号和内容

sed -n '$p' 文件名 打印最后一行

sed -n '1,3p' 文件名 范围打印

sed -n '1p;$p' 文件名 打印第一行和最后一行或者或者sed -n -e '1p' -e '$p' 文件名也可以

sed -n 'n;p' 文件名 打印偶数行  n在p的前面就是跳过当前一行,打印下一行。

sed -n 'p;n' 文件名 打印奇数行  p在n的前面就是打印当前一行,跳过下一行继续打印。

sed -n '/过滤内容/p' 文件名 打印所有包含过滤内容的行 打印指定的过滤内容

cat /dev/null > test.txt  免交互删除文件内容或者sed -i 'd' test.txt 两种方法都可以

awk

awk是文本三剑客之一,也是功能最强大的文本工具。同样只针对文本内容

awk是逐行读取输入的文本内容,默认已空格和tab键作为分隔符,但是多个空格或者tab键的空格,会自动压缩成一个。然后按照指定的模式或者条件来执行编辑命令

awk 逐行匹配,符合条件的才会进行格式化输出或者过滤

awk 可以在面交互的情况下实现复杂的文本操作。完成各种自动化的配置

awk的格式

awk '操作符 action(动作)' file

操作符:想干啥 action(动作):怎么干 file:处理对象

awk 'BEGIN'

awk 'BEGIN{x=1};{x++}END{处理动作}' 文件名 (定义一个初始化变量)

awk '操作符 {处理动作}' 文件名 不定义初始化变量可以使用

{} 外部表示定义条件 {}内表示指定操作。

BEGIN 对条件做初始化操作,类似于for ((i=1;i<=10;i++))

awk的常用选项

awk -f 指定分隔符。如果是空格 tab键,可以不加

awk -v 变量赋值。awk命令不能通过外部获取变量值,只能在内部赋值。

awk '{print}' 处理对象 :打印文本内容

awk的内置变量

awk '{print}' 处理对象 :打印文本内容

awk '0{print}' 处理对象 :什么都不打印(了解即可)

awk'{print NR}' 处理对象:打印需要处理行的行号

awk'{print NR,$0}' 处理对象:打印需要处理行的行号和全部内容

awk 'NR==3{print}' 处理对象:打印第三行

awk 'NR==3,NR==5{print}' 处理对象:打印第三行到第五行

方法1 awk 'NR==3;NR==5{print}' 处理对象:分别打印第三行和第五行

方法2 awk '(NR>=3)&&(NR>=5){print}' 处理对象:分别打印第三行和第五行

awk 'NR%2==0{print}' 处理对象 打印偶数行

awk 'NR%2==1{print}' 处理对象 打印奇数行

linux的正则表达式_第85张图片

awk 'BEGIN{print 1+2}':加法

awk 'BEGIN{print 1.12+2.09}' :小数加法

linux的正则表达式_第86张图片

方法1 awk 'BEGIN{print 2^3}':求幂的运算

方法2 awk 'BEGIN{print 2 * * 3}':求幂的运算

awk按行来取列

awk '{print $2,$3}' 文件名 按行取第二列和第三列

linux的正则表达式_第87张图片

练习题:取出文件内第二列和最后一列

cat /etc/passwd | awk -F: '{print $2,$NF}'

linux的正则表达式_第88张图片

NF这里表示最后列

awk精确筛选

$n:这里表示数字。可以通(> < ==)进行数值对比

$n~"字符串":代表这个字段包含某个字符串

$n!~'字符串':代表这个字段不包含某个字符串

$n=='字符串':代表字段要和字符串完全相同

$n!='字符串':不为某个字段

$NF:代表最后一个字段

练习题1:/etc/passwd文件输出最后一个字段中包含bash所在行的第一个字段和最后一个字段

cat /etc/passwd | awk -F: '$NF~bash" {print $1,$NF}'

练习题2:/etc/passwd文件输出只有第一列是root的行,我才打印他的第六列

cat /etc/passwd | awk -F: '$1=="root" {print $6}'

练习题3:/etc/passwd文件输出最后一个字段不包含bash且打印第1列和第6列

linux的正则表达式_第89张图片

指定第六个字段为/home/yy 而且最后一个字段为/bin/bash 满足条件的输出第一列和最后一列

cat /etc/passwd | awk -F: '($6="/home/yy")&&($NF=="/bin/bash") {print $1,$NF}'

打印第三列大于500的输出全部内容

cat /etc/passwd | awk -F: '$3>500 {print}'

linux的正则表达式_第90张图片

条件判断打印

if语句:

if $3>500 打印所有

例如:awk -F: '{if ($3>500) {print $0}}' /etc/passwd

awk的三元表达式

继承了java 格式和java也一样

三元表达式的格式:

awk '{条件表达式1?A表达式或者值:B表达式或者值{print}}' 文件名

例题:

awk -F: '{max=($3>=$4)?$3:$4;{print max $0}}' /etc/passwd

过滤出包含home的行

cat /etc/passwd | awk '/home/ {print}'

取出主机名放到hosts.txt里

cat test | awk -F'[ .]+' '{print $2}' >> hosts.txt

linux的正则表达式_第91张图片

linux的正则表达式_第92张图片

linux的正则表达式_第93张图片

使用正则的方式匹配分隔符

getline函数

当getline和管道符以及重定向符号在一起的时候

重定向:< > 把其中一个文件的内容传给另外一个

|:输出指定内容,到定义的变量,再通过getline调用变量当中的内容然后打印结果

awk '{getline;print}' 文件名

awk '{print;getline}' 文件名

linux的正则表达式_第94张图片

getline函数运行之后会改变awk的内置变量,读取的行数也就发生了变化。

getline在前,就是第1行跳过打印第2行,就是偶数行

getline在后,从第1行开始跳过第2行,就是奇数

使用重定向

awk '{getline < "test1.txt";print $0 > "hosts.txt";}' test1.txt

linux的正则表达式_第95张图片

awk -v 使用-v给变量赋值

从shell脚本里往awk里面传参:

read -p "输入第一个数" num1

read -p "输入第二个数" num2

sum=$(awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1+num2}')

echo $sum

linux的正则表达式_第96张图片

在awk中打印变量不需要加$

linux的正则表达式_第97张图片

输出时改变为+号

awk的内置变量

NR:行号

FS:列分割符,和F作用一致,如果要使用FS。格式:FS=" "

OFS:输出内容的分隔符

NF:表示最后一个字段

$n:也是属于内置变量

BEGIN模式

对变量初始化:

awk 'BEGIN{x=1};{x++};END{print x}' text1.txt

linux的正则表达式_第98张图片

计算行从0开始向下计算

awk和数组结合使用

awk中定义数组

定义数组

awk 'BEGIN{a[0]=10;a[1]=20;print a[1]}'

awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a)print i,a[1]}'

通过数组遍历的方式去重

awk '{a[$1]++};END{(for i in a)}{print i,a[i]}}'

索引下标值是唯一的

初始化awk默认从0开始算第1行,自增+1=1时a的值开始遍历文件内容然后把遍历到的值赋值给i 先打印i再打印a对应的索引下标

例题:利用数组下标去重

awk '{a[$1]++};END{(for i in a)}{print i,a[i]}}'

linux的正则表达式_第99张图片

sort和uniq的方法

linux的正则表达式_第100张图片

AWK的代码逻辑和shell不是一个逻辑

有几行,循环几次

awk处理行从0开始0自增从1开始

把a的值赋给i

linux的正则表达式_第101张图片

awk的总结

awk -F 指定分隔符。如果是空格 tab键,可以不加

awk -v 变量赋值。awk命令不能通过外部获取变量值,只能在内部赋值。

awk '{print}' 处理对象 :打印文本内容

awk的内置变量

awk '{print}' 处理对象 :打印文本内容

awk '0{print}' 处理对象 :什么都不打印(了解即可)

awk'{print NR}' 处理对象:打印需要处理行的行号

awk'{print NR,$0}' 处理对象:打印需要处理行的行号和全部内容

awk 'NR==3{print}' 处理对象:打印第三行

awk 'NR==3,NR==5{print}' 处理对象:打印第三行到第五行

方法1 awk 'NR==3;NR==5{print}' 处理对象:分别打印第三行和第五行

方法2 awk '(NR>=3)&&(NR>=5){print}' 处理对象:分别打印第三行和第五行

awk 'NR%2==0{print}' 处理对象 打印偶数行

awk 'NR%2==1{print}' 处理对象 打印奇数行

awk 'BEGIN{print 1+2}':加法

awk 'BEGIN{print 1.12+2.09}' :小数加法

方法1 awk 'BEGIN{print 2^3}':求幂的运算

方法2 awk 'BEGIN{print 2 * * 3}':求幂的运算

NR:行号

FS:列分割符,和F作用一致,如果要使用FS。格式:FS=" "

OFS:输出内容的分隔符

NF:表示最后一个字段

$n:也是属于内置变量

你可能感兴趣的:(linux,正则表达式)