模板网站的弊端,佛山有几个区,wordpress 数据库挂马,pyhton可以做网站吗目录 一、正则表达式
1. 定义
2. 字符匹配
3. 重复限定符
4. 位置锚点
5. 分组和引用
6. 扩展正则表达式
二、文本三剑客
1. grep
1.1 定义
1.2 语法
1.3 选项
1.4 示例
2. sed
2.1 定义
2.2 通式
2.3 选项
2.4 脚本格式#xff08;脚本语法#xff09;
2.…目录 一、正则表达式
1. 定义
2. 字符匹配
3. 重复限定符
4. 位置锚点
5. 分组和引用
6. 扩展正则表达式
二、文本三剑客
1. grep
1.1 定义
1.2 语法
1.3 选项
1.4 示例
2. sed
2.1 定义
2.2 通式
2.3 选项
2.4 脚本格式脚本语法
2.4.1 地址了解
2.4.2 命令了解
2.5 搜索替代
2.6 分组替换
2.7 调用变量
2.8 修改配置文件
2.9 修改网卡名
3. awk
3.1 定义和格式
3.2 常见选项和执行流程
3.3 基本用法
3.4 常规应用
3.5 常见的内置变量
3.6 自定义变量
3.7 模式PATTERN
3.7.1 模式为空
3.7.2 正则匹配
3.7.3 line ranges行范围
3.7.4 /pat1/,/pat2/ 案例找到10:00到11:00之间的日志
3.7.5 关系表达式
3.8 条件判断
3.9 循环for | while
3.10 数组
3.10.1 访问、赋值数组元素
3.10.2 数组长度
3.10.3 遍历数组
3.10.4 实际案例
3.11 awk脚本 一、正则表达式
1. 定义
正则表达式是一种用于匹配和操作文本的强大工具它使用特定的语法和模式来描述文本的结构和模式。正则表达式被很多程序和开发语言所广泛支持vimlessgrepsedawknginxmysql等。
2. 字符匹配
正则表达式可以匹配普通字符和元字符。
普通字符任何普通字符都可以直接匹配自身 元字符一些字符具有特殊含义如点号.匹配除了换行符之外的任意字符星号*匹配前一个字符的零个或多个重复问号?匹配前一个字符的零个或一个重复
元字符说明.匹配任意单个字符可以是一个汉字[ ]匹配指定范围内的任意单个字符[0-9][a-zA-Z][^]匹配指定范围外的任意单个字符[^a.z]非a和z[:alnum:]字母和数字[:alpha:]代表任何英文大小写字符亦即A-Za-z[:lower:]小写字母,示例:[[:lower:]],相当于[a-z][:upper:]大写字母[:blank:]空白字符空格和制表符[:space:]包括空格、制表符 (水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广[:cntrl:]不可打印的控制字符退格、删除、警铃...[:digit:]十进制数字十进制数字[:xdigit:]十六进制数字[:graph:]可打印的非空白字符[:print:]可打印字符[:punct:]标点符号\w匹配单词构成部分等价于[_[:alnum:]]\W匹配非单词构成部分等价于[^_[:alnum:]]\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]\s匹配任何空白字符包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意Unicode 正则表达式会匹配全角空格符
示例
元字符点 .
[rootlocalhost ~]# ls /etc/|grep rc[.0-3] #此处的点代表字符
rc0.d
rc1.d
rc2.d
rc3.d
rc.d
rc.local
[rootlocalhost ~]# ls /etc/ | grep rc\. #点值表示点需要转义
rc.d
rc.local
[rootlocalhost ~]# grep r..t /etc/passwd #r..t ..代表任意两个字符
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin元字符[ ]
[rootlocalhost opt]# touch {a..z}.txt
[rootlocalhost opt]# ls | grep [fql].txt #fql三个字母任意一个
f.txt
l.txt
q.txt
元字符[^]
[rootlocalhost opt]# touch {1..3}.txt
[rootlocalhost opt]# touch {a..c}.txt
[rootlocalhost opt]# ls | grep [^0-9].txt #除去0-9任意字符.txt文件
a.txt
b.txt
c.txt
3. 重复限定符
① 星号*匹配前一个字符的零个或多个重复即匹配前面的字符任意次包括0次
[rootlocalhost ~]# echo ac | grep ab*c #匹配前面一个字符b0次
ac
[rootlocalhost ~]# echo abbbc | grep ab*c #匹配前面一个字符b3次
abbbc
② 点星.*任意长度的任意字符 不包括0次
[rootlocalhost ~]# echo ac | grep ab.*c;echo $?
1 #ac之间没有b匹配不到
[rootlocalhost ~]# echo abbbc | grep ab.*c
abbbc #匹配前面的字符b3次③ \? 匹配前面的字符1次或0次即可有可无
[rootlocalhost ~]# echo ac | grep ab\?c #匹配前面的字符b0次
ac
[rootlocalhost ~]# echo abc | grep ab\?c #匹配前面的字符b1次
abc
[rootlocalhost ~]# echo abbc | grep ab\?c;echo $? #无法匹配
1④ \匹配其前面的字符出现最少1次即肯定有且1次
[rootlocalhost ~]# echo ac | grep ab\c;echo $? #无法匹配
1
[rootlocalhost ~]# echo abc | grep ab\c #匹配前面的字符b1次
abc
[rootlocalhost ~]# echo abbc | grep ab\c #匹配前面的字符b两次
abbc
⑤ \{n\}匹配前面的字符n次
[rootlocalhost ~]# echo abbc | grep ab\{1\}c;echo $?
1 #匹配前面的字符b1次无法匹配\转义{和}
[rootlocalhost ~]# echo abbc | grep ab\{2\}c
abbc #匹配前面的字符b两次
⑥ \{m,n\}匹配前面的字符至少m次至多n次
[rootlocalhost ~]# echo ac | grep ab\{1,3\}c;echo $?
1 #匹配前面的字符b至少1次至多3次这里0次无法匹配
[rootlocalhost ~]# echo abc | grep ab\{1,3\}c
abc
[rootlocalhost ~]# echo abbbc | grep ab\{1,3\}c
abbbc
[rootlocalhost ~]# echo abbbbc | grep ab\{1,3\}c;echo $?
1 #匹配前面的字符b至少1次至多3次这里4次无法匹配⑦ \{,n\}匹配前面的字符至多n次n
[rootlocalhost ~]# echo ac | grep ab\{,1\}c
ac #匹配前面的字符b至多1次0次可以匹配
[rootlocalhost ~]# echo abc | grep ab\{,1\}c
abc
[rootlocalhost ~]# echo abbc | grep ab\{,1\}c;echo $?
1 #匹配前面的字符b至多1次两次无法匹配
⑧ \{n,\}匹配前面的字符至少n次
[rootlocalhost ~]# echo ac | grep ab\{1,\}c;echo $?
1 #匹配前面的字符b至少1次0次无法匹配
[rootlocalhost ~]# echo abc | grep ab\{1,\}c
abc
[rootlocalhost ~]# echo abbc | grep ab\{1,\}c
abbc
4. 位置锚点
① ^行首锚定, 用于模式的最左侧
② $行尾锚定用于模式的最右侧
③ ^PATTERN$表示用于模式匹配整行单独一行 只有PATTERN字符
④ ^$表示空行
⑤ ^[[:space:]]*$空白行如tab、换行、回车
⑥ \ 或 \b词首锚定用于单词模式的左侧(连续的数字字母下划线都算单词内部)
⑦ \ 或 \b词尾锚定用于单词模式的右侧
⑧ \PATTERN\匹配整个单词
示例
[rootlocalhost opt]# vim file.txt
root$
123root456$
123ro456ot$
abc cba$
efg ghe$
$ #空行
^I^I$ #TabTab
:set list #显示控制字符[rootlocalhost opt]# cat file.txt | grep ^a #过滤以a开头行
abc cba
[rootlocalhost opt]# cat file.txt | grep a$ #过滤以a结尾行
abc cba
[rootlocalhost opt]# cat file.txt | grep ^root$ #过滤只有root字符的行
root
[rootlocalhost opt]# cat file.txt | grep ^$ #过滤空行
#显示空行
[rootlocalhost opt]# cat file.txt | grep ^[[:space:]]*$ #过滤空白行
#显示空行
#显示空行
[rootlocalhost opt]# cat file.txt | grep g\b #过滤以g结尾的词efg
efg ghe
[rootlocalhost opt]# cat file.txt | grep \bc #过滤以c开头的词cba
abc cba
[rootlocalhost opt]# cat file.txt | grep \broot\b #过滤单词root
root5. 分组和引用
圆括号( )用于分组可以将多个字符作为一个整体进行处理
反向引用使用\nn 为数字来引用分组中匹配的内容如\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
示例
[rootlocalhost ~]# echo abccc | grep abc\{3\}
abccc
[rootlocalhost ~]# echo abccc | grep \(abc\)\{3\};echo $?
1
[rootlocalhost ~]# echo abcabcabccc | grep \(abc\)\{3\}
abcabcabccc #abcabcabc高亮[rootlocalhost ~]# echo 1abc |grep 1\|2abc
1abc #1高亮
[rootlocalhost ~]# echo 1abc |grep \(1\|2\)abc
1abc #1abc高亮应用过滤ens33ip地址
[rootlocalhost ~]# ifconfig ens33
ens33: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500inet 192.168.190.100 netmask 255.255.255.0 broadcast 192.168.190.255inet6 fe80::e743:cb44:9825:6230 prefixlen 64 scopeid 0x20linkether 00:0c:29:e1:cb:86 txqueuelen 1000 (Ethernet)RX packets 781 bytes 58624 (57.2 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 386 bytes 38313 (37.4 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[rootlocalhost ~]# ifconfig ens33 | grep netmask | grep -o \([0-9]\{1,3\}\.\)\{3\}[0-9]\{13\} | head -1
#显示被匹配到的字符串表示匹配1-9之间任意数组成的1位、2位或3位数点{13}表示出现1-3次
192.168.190.100
[rootlocalhost ~]# ifconfig ens33 |grep netmask | grep -Eo ([0-9]{1,3}\.){3}[0-9]{1,3} | head -1
192.168.190.100
#-E支持扩展正则表达式
6. 扩展正则表达式
① 使用方法
grep -E或者egrep 默认使用的是扩张正则表达式
② 表示次数
*匹配前面字符任意次 ?0或1次 1次或多次 {n}匹配n次 {m,n}至少m至多n次 {,n}匹配前面的字符至多n次,nn可以为0 {n,}匹配前面的字符至少n次,nn可以为0
③ 表示分组
() 分组将多个字符捆绑在一起当作一个整体处理
| 或者 a|b #a或b C|cat #C或cat (C|c)at #Cat或cat
二、文本三剑客
1. grep
1.1 定义
grep是Linux系统中一个常用的文本搜索工具用于在文件中查找指定的字符串或匹配某个正则表达式的文本行。
1.2 语法
grep [选项]… 查找条件 目标文件
1.3 选项
选项说明-m-m n匹配n次行后停止-v显示不被pattern匹配到的行即取反-i忽略字符大小写-n显示匹配的行号-c统计匹配的行数-o仅显示匹配到的字符串-q静默模式不输出任何信息 常用于脚本-Aafter后#行-Bbefore前#行-Ccontext前后各#行-e实现多个选项间的逻辑or关系-w匹配整个单词-E使用ERE相当于egrep-F不支持正则表达式相当于fgrep-ffile根据模式文件处理两个文件相同内容 把第一个文件作为匹配条件-r递归目录但不处理软链接开始搜索目录-R递归目录但处理软链接-colorauto对匹配到的文本着色显示
1.4 示例
[rootlocalhost opt]# cat file.txt
a 1
a 2
a 3
[rootlocalhost opt]# cat file.txt | grep -m 2 a #以a为过滤条件匹配到第二行停止
a 1
a 2[rootlocalhost opt]# cat file.txt
a 1
A 2
b 3
[rootlocalhost opt]# cat file.txt | grep -i a #以a为过滤条件忽略字符大小写
a 1
A 2[rootlocalhost opt]# cat file.txt
abc123
Aabc12
[rootlocalhost opt]# cat file.txt | grep -o abc #仅显示匹配到的字符串abc
abc
abc[rootlocalhost ~]# grep -e root -e bash /etc/passwd #包含root或者包含bash的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
fql:x:1000:1000:fql:/home/fql:/bin/bash
2. sed
2.1 定义
sed是一个流式文本编辑器它可以对文本文件进行各种编辑操作。它主要用于对文本文件进行替换、插入、删除、打印等操作它可以通过管道符|将多个命令串联起来使用。
Sed是从文件或管道中读取一行处理一行输出一行再读取一行再处理一行再输出一行直到最后一行。每当处理一行时把当前处理的行存储在临时缓冲区中称为模式空间PatternSpace接着用sed命令处理缓冲区中的内容处理完成后把缓冲区的内容送往屏幕。接着处理下一行这样不断重复直到文件末尾。一次处理一行的设计模式使得sed性能很高sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件明显会出现有卡顿的现象这是因为vi命令打开文件是一次性将文件加载到内存然后再打开。Sed就避免了这种情况一行一行的处理打开速度非常快执行速度也很快。
2.2 通式
sed [option]... script;script;... [input file...]选项 自身脚本语法 支持标准输入管道或者文件
#如果不知道语法可以写 文件则是打印文件内容
2.3 选项
选项说明-n不输出模式空间内容到屏幕即不自动打印-e多点编辑-f FILE从指定文件中读取编辑脚本-r-E使用扩展正则表达式-i.bak备份文件并原处编辑
注意
-ir不支持-i -r支持-ri支持-ni会清空文件
2.4 脚本格式脚本语法
脚本格式由地址命令组成。
2.4.1 地址了解
① 如果不给地址即对全文进行处理比如行号
[rootlocalhost ~]# seq 3 | sed #默认将输入内容打印出来系统自带自动打印
1 #支持管道符
2
3
[rootlocalhost ~]# sed /etc/passwd |wc -l #查看文件内容
41
[rootlocalhost ~]# sed /etc/passwd |wc -l #支持重定向
41② 单地址指定的行$代表最后一行
[rootlocalhost ~]# sed p /etc/passwd | wc -l
82
#p代表打印内容因为没有规定范围 默认也会打印一遍所以这里会造成打印两倍
[rootlocalhost ~]# sed -n p /etc/passwd | wc -l
41
#-n代表关闭自动打印
[rootlocalhost ~]# sed -n 2p /etc/passwd #打印文件的第二行单地址写法
bin:x:1:1:bin:/bin:/sbin/nologin
[rootlocalhost ~]# sed -n $p /etc/passwd #打印文件的最后一行单地址写法
fql:x:1000:1000:fql:/home/fql:/bin/bash
[rootlocalhost ~]# sed 2q /etc/passwd #到第二行退出也就是打印1到2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
③ 地址范围
#,##从#行到第#行36 从第3行到第6行#,##从#行到#行3,4 表示从3行到第7行/pat1/,/pat2/第一个正则表达式和第二个正则表达式之间的行#,/pat/从#号行为开始找到pat为止 (可能有bug)/pat/,#找到#号个pat为止
示例
[rootlocalhost ~]# sed -n 1,2p /etc/passwd #打印一到二行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[rootlocalhost ~]# sed -n 1,2p /etc/passwd #从第一行到第三行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[rootlocalhost opt]# cat file.txt
a123
b456
c789
d000
[rootlocalhost opt]# sed -n /^a/,/^b/p file.txt #从a开头行到b开头行
a123
b456
应用提取时间段的日志内容
[rootlocalhost log]# tail messages
Jan 29 22:38:17 localhost chronyd[708]: Source 2001:1600:4:1::123 replaced with 119.28.183.184
Jan 29 22:40:01 localhost systemd: Started Session 18 of user root.
Jan 29 22:40:01 localhost systemd: Starting Session 18 of user root.
Jan 29 22:43:42 localhost chronyd[708]: Selected source 119.28.183.184
Jan 29 22:50:01 localhost systemd: Started Session 19 of user root.
Jan 29 22:50:01 localhost systemd: Starting Session 19 of user root.
Jan 29 23:00:01 localhost systemd: Started Session 20 of user root.
Jan 29 23:00:01 localhost systemd: Starting Session 20 of user root.
Jan 29 23:01:01 localhost systemd: Started Session 21 of user root.
Jan 29 23:01:01 localhost systemd: Starting Session 21 of user root.
[rootlocalhost log]# sed -n /Jan 29 22:38:17/,/Jan 29 22:43:42/p messages
Jan 29 22:38:17 localhost chronyd[708]: Source 2001:1600:4:1::123 replaced with 119.28.183.184
Jan 29 22:40:01 localhost systemd: Started Session 18 of user root.
Jan 29 22:40:01 localhost systemd: Starting Session 18 of user root.
Jan 29 22:43:42 localhost chronyd[708]: Selected source 119.28.183.184
#提取Jan 29 22:38:17到Jan 29 22:43:42时间段的日志内容
④ 步进~
1~2 奇数行2~2 偶数行
示例
[rootlocalhost ~]# seq 4 | sed -n 1~2p #从1开始步长为2即每次加2奇数
1
3
[rootlocalhost ~]# seq 4 | sed -n 2~2p #从2开始步长为2即每次加2偶数
2
4
[rootlocalhost ~]# seq 4 | sed -n 1~2!p #取反也是打印偶数
2
4
[rootlocalhost ~]# seq 4 | sed -n n;p
2
4
#高级用法将第一个数放入第二空间第一个是匹配空间里不输出打印处理下一行。当处理完后12行后这两行已经不存在了处理第3行依然将第3行放入第二空间打印下一行。
[rootlocalhost ~]# seq 4 | sed -n 2,${n;p}
3
#与上面同理从2开始打印下一行代表奇数行
2.4.2 命令了解
命令说明p打印当前模式空间内容追加到默认输出之后Ip忽略大小写输出d删除模式空间匹配的行并立即启用下一轮循环a [\]text在指定行后面追加文本支持使用\n实现多行追加i [\]text在行前面插入文本c [\]text替换行为单行或多行文本w file保存模式匹配的行至指定文件r file读取指定文件的文本至模式空间中匹配到的行后为模式空间中的行打印行号!模式空间中匹配行取反处理q结束或退出sed
示例
[rootlocalhost ~]# seq 4 | sed 3d #删除第三行只是删输出的内容实际依然存在
1
2
4
[rootlocalhost ~]# sed 4 | sed -i 3d #真实删除原内容
[rootlocalhost ~]# sed 4 | sed -i.bak 3d #删除之前先备份[rootlocalhost ~]# seq 3 | sed 2a22 #在第二行后添加22
1
2
22
3
[rootlocalhost ~]# seq 3 | sed 2a22\n33 #下一行追加33
1
2
22
33
3[rootlocalhost ~]# seq 3 file.txt
[rootlocalhost ~]# cat file.txt
1
2
3
[rootlocalhost ~]# sed -i 3ccc file.txt #替换第三行内容为cc
[rootlocalhost ~]# cat file.txt
1
2
cc[rootlocalhost opt]# cat file.txt
a123
b456
[rootlocalhost opt]# sed -n 12wbbb.txt file.txt
#将file.txt文件的一到二行保存到bbb.txt文件中
[rootlocalhost opt]# ls
bbb.txt file.txt rh[rootlocalhost opt]# cat a.txt
a
b
[rootlocalhost opt]# cat b.txt
c
d
[rootlocalhost opt]# sed 2r b.txt a.txt #将b.txt插入到a.txt第二行后
a
b
c
d
2.5 搜索替代
s/pattern/string/修饰符 查找替换即s/旧内容/新内容/修饰符。支持使用其它分隔符可以是其它形式ss###。
替换修饰符 g行内全局替换 p显示替换成功的行 w /PATH/FILE将替换成功的行保存至文件中 I,i忽略大小写
[rootlocalhost ~]# cat /etc/selinux/config# This file controls the state of SELinux on the system.
# SELINUX can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUXenforcing
……
[rootlocalhost ~]# sed -i.bak s/SELINUXenforcing/SELINUXenforcing/ /etc/selinux/config
[rootlocalhost ~]# cat /etc/selinux/config | grep SELINUXenforcing
SELINUXenforcing
#修改主配置文件SELinux设为enforcing强制模式[rootlocalhost opt]# cat file.txt
root
rcot
rptt
r\ft
[rootlocalhost opt]# sed s/r..t/er/g file.txt
#代表前面匹配到的内容指代之前找到的内容
rooter
rcoter
rptter
r\fter
注意新内容一定是固定的字符串
2.6 分组替换
可以使用分组机制来进行文本替换操作分组可以将匹配的部分文本捕获并在替换操作中使用注意只有扩展表达式才可以实现分区替换。允许在模式匹配和替换中引用已匹配的文本。使用分组和后向引用可以在替换文本中包含匹配到的特定部分。
语法
sed -nr s/正则匹配/\1/p
示例
[rootlocalhost opt]# echo 123abcDEF | sed -nr s/123(abc)DEF/\1/p
abc
[rootlocalhost opt]# echo 123abcDEF | sed -nr s/123(abc)(DEF)/\2/p
DEF
#\1\2代表引用前面括号里的内容固定格式
[rootlocalhost opt]# echo 123abcDEF | sed -nr s/(123)(abc)(DEF)/\2\1\3/p
abc123DEF
应用sed命令提取网卡ip地址
[rootlocalhost ~]# ifconfig ens33
ens33: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500inet 192.168.190.100 netmask 255.255.255.0 broadcast 192.168.190.255inet6 fe80::e743:cb44:9825:6230 prefixlen 64 scopeid 0x20linkether 00:0c:29:e1:cb:86 txqueuelen 1000 (Ethernet)RX packets 12577 bytes 931901 (910.0 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 5565 bytes 1298791 (1.2 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0[rootlocalhost ~]# ifconfig ens33 | sed -rn 2s/.*inet (.*) netmask.*/\1/p
192.168.190.100
#sed命令提取网卡ip地址注意空格
[rootlocalhost opt]# ifconfig ens33 | sed -rn 2s/.*inet ([0-9.]).*/\1/p
192.168.190.100
#同样可以实现0-9数字.一个以上
[rootlocalhost opt]# echo /etc/sysconfig/network-scripts/ifcfg-ens33 | sed -nr s#.*/(.*)#\1#p
ifcfg-ens33
#提取ifcfg-ens33
应用提取文件的版本号
[rootlocalhost opt]# cat test
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
[rootlocalhost opt]# cat test | sed -nr s/.*-(.*).jar/\1/p
1.9.7
1.9.7
2.7.7
3.4
1.0
#提取文件的版本号
#使用cat test | grep -e [0-9]\\.也可以提取应用提取文件属性以数字形式显示
[rootlocalhost opt]# stat test文件test大小95 块8 IO 块4096 普通文件
设备fd00h/64768d Inode68786720 硬链接1
权限(0644/-rw-r--r--) Uid( 0/ root) Gid( 0/ root)
环境unconfined_u:object_r:usr_t:s0
最近访问2024-01-30 13:48:56.384782770 0800
最近更改2024-01-30 13:48:53.689798114 0800
最近改动2024-01-30 13:48:53.690798109 0800
创建时间-
[rootlocalhost opt]# stat test | sed -nr 4s/.*([0-9]{4}).*/\1/p
0644
#提取文件属性以数字形式显示
2.7 调用变量
要在sed命令中使用变量您需要使用双引号来引用变量不能使用单引号并使用符号来引用变量名。其中有一个-e选项代表多点编辑类似grep用法是“或”的意思。
示例
[rootlocalhost opt]# nameroot
[rootlocalhost opt]# sed -n /$name/p passwd #双引号可以查询
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[rootlocalhost opt]# sed -n /$name/p passwd #两单引号也可以查询
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2.8 修改配置文件
sed可以用于修改配置文件它可以从标准输入或文件中读取文本并对其进行编辑和转换。
示例不打开配置文件修改httpd80端口
[rootlocalhost ~]# sed -i.bak s/^Listen 80/Listen 8080/ /etc/httpd/conf/httpd.conf
[rootlocalhost ~]# grep 8080 /etc/httpd/conf/httpd.conf
Listen 8080
2.9 修改网卡名
[rootlocalhost ~]# cat /etc/default/grub
GRUB_TIMEOUT5
GRUB_DISTRIBUTOR$(sed s, release .*$,,g /etc/system-release)
GRUB_DEFAULTsaved
GRUB_DISABLE_SUBMENUtrue
GRUB_TERMINAL_OUTPUTconsole
GRUB_CMDLINE_LINUXcrashkernelauto rd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet
GRUB_DISABLE_RECOVERYtrue
[rootlocalhost ~]# sed -ri.bak /^GRUB_CMDLINE_LINUX/s#(.*)#\1 net.ifnames0# /etc/default/grub
[rootlocalhost ~]# grep GRUB_CMDLINE_LINUX /etc/default/grub
GRUB_CMDLINE_LINUXcrashkernelauto rd.lvm.lvcentos/root rd.lvm.lvcentos/swap rhgb quiet net.ifnames03. awk
3.1 定义和格式
awk是一个功能强大的编辑工具逐行读取输入文本默认以空格或tab键作为分隔符作为分隔并按模式或者条件执行编辑命令。 用于从文件、管道或标准输入中读取文本并根据用户指定的模式和操作进行处理。
前面提到sed命令常用于一整行的处理而awk比较倾向于将一行分成多个“字段然后再进行处理且默认情况下字段的分隔符为空格或tab键。awk执行结果可以通过print的功能将字段数据打印显示。sed是行处理工具不能直接处理列数据需要分组后向引用而awk可以直接处理列数据。
格式
awk [options] program varvalue file…选项 语法 值 文件支持标准输入、输出
awk pattern { action } input_file
语法program通常是被放在单引号中可分为pattern和action
pattern用于匹配输入文本的模式。可以使用正则表达式或字符串进行匹配。如果省略模式则默认匹配所有行。
action对数据进行处理放在{}内指明在满足模式的情况下要执行的动作。可以是单个命令或多个命令组合。如果省略动作则默认打印整行。处理动作默认写print即可。
3.2 常见选项和执行流程
常见选项
-F“分隔符” 指明输入时用到的字段分隔符默认的分隔符是若干个连续空白符
-vvarvalue 变量赋值
执行流程
① 执行BEGIN{action;… }{print}语句块中的语句 ② 从文件或标准输入(stdin)读取一行然后执行pattern{ action;… }语句块它逐行扫描文件 从第一行到最后一行重复这个过程直到文件全部被读取完毕。 ③ 当读至输入流末尾时执行END{action;…}语句块BEGIN语句块在awk开始从输入流中读取行之前被执行这是一个可选的语句块比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中END语句块在awk从输入流中读取完所有的行之后即被执行比如打印所有行的分析结果这类信息汇总都是在END语句块中完成它也是一个可选语句块pattern语句块中的通用命令是最重要的部分也是可选的。如果没有提供pattern语句块则默认执行{ print }即打印每一个读取到的行awk读取的每一行都会执行该语句块
示例
[rootlocalhost opt]# cat file.txt
1:a
2:b
3:c
[rootlocalhost opt]# awk -F: BEGIN{print 123abc}{print} file.txt
123abc
1:a
2:b
3:c
#以冒号为分割符awk开始从输入流中读取行之前执行打印123abc即在表头添加123abc
3.3 基本用法
[rootlocalhost ~]# echo 123 | awk {print}
123 #pattern什么都不写打印全部
[rootlocalhost opt]# cat file.txt
1234
abCD
[rootlocalhost opt]# cat file.txt | awk /[a-z]/{print}
abCD #匹配包含小写字母的行
[rootlocalhost opt]# awk {print hello} file.txt
hello #文件有几行打印几次hello
hello
hello
[rootlocalhost ~]# awk BEGIN{print 12}
3 #支持运算[rootlocalhost opt]# cat file.txt
1:a
2:b
[rootlocalhost opt]# awk -F: {print $1,$2} file.txt
1 a #默认以空格为分隔符
2 b
[rootlocalhost opt]# wk -F: {print $1$2} file.txt
1a #指定作为分隔符打印第一列和第二列
2b
小结
[rootlocalhost ~]#awk -F: {print $0} /etc/passwd
#$0代表全部元素
[rootlocalhost ~]#awk -F: {print $1} /etc/passwd
#代表第一列
[rootlocalhost ~]#awk -F: {print $1,$3} /etc/passwd
#代表第一第三列
[rootlocalhost ~]#awk /^root/{print} passwd
#已root为开头的行
[rootlocalhost ~]#grep -c /bin/bash$ passwd
#统计当前已/bin/bash结尾的行
2
3.4 常规应用 提取磁盘使用率
[rootlocalhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 3.5G 47G 7% /
devtmpfs 897M 0 897M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 9.0M 903M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda1 5.0G 179M 4.9G 4% /boot
tmpfs 183M 12K 183M 1% /run/user/42
tmpfs 183M 0 183M 0% /run/user/0
[rootlocalhost ~]# df | awk {print $5}| cut -d% -f1 |tail -n 2
7
0
0
1
0
4
1
0
df | awk -F( |%) {print $5} | tail -n 2 以空格或者%为分隔符
df | awk -F[ %] {print $5} | tail -n 2
df | awk -F[[:space:]]|% {print $5} | tail -n 2
#均可以实现提取
提取网卡ip地址
[rootlocalhost opt]# ifconfig ens33
ens33: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500inet 192.168.190.100 netmask 255.255.255.0 broadcast 192.168.190.255
[rootlocalhost opt]# ifconfig ens33| sed -n 2p | awk {print $2}
192.168.190.100
[rootlocalhost opt]# ifconfig ens33 | awk /netmask/{print $2}
192.168.190.100
#找到第二行第二列
3.5 常见的内置变量
awk提供了一些内置变量用于方便地处理文本数据。
FS :指定每行文本的字段分隔符缺省默认为空格或制表符tab。与 “-F”作用相同 -v FS:OFS输出时的分隔符NF当前处理的行的字段个数NR当前处理的行的行号序数$0当前处理的行的整行内容$n当前处理行的第n个字段第n列FILENAME:被处理的文件名RS行分隔符。awk从文件上读取资料时将根据RS的定义就把资料切割成许多条记录而awk一次仅读入一条记录进行处理。预设值是\n 示例FS
[rootlocalhost opt]# awk -F: {print} file.txt
1:a
2:b
[rootlocalhost opt]# awk -F: {print $1} file.txt
1
2
[rootlocalhost opt]# awk -v FS: {print $1} file.txt
1
2
[rootlocalhost opt]# awk -v FS: {print $1FS$2} file.txt #调用变量名FS不需要$
1:a
2:b
[rootlocalhost opt]# fs:
[rootlocalhost opt]# awk -v FS$fs {print $1FS$2} file.txt
1:a #支持定义变量传给FS
2:b示例OFS
[rootlocalhost opt]# cat file.txt
1:a
2:b
[rootlocalhost opt]# awk -v FS: -v OFS {print $1,$2} file.txt
1a
2b
示例RS默认是已 /n 换行符为一条记录的分隔符
[rootlocalhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[rootlocalhost ~]# echo $PATH | awk -v RS: {print $1} #以为换行符
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin[rootlocalhost opt]# echo $PATH | sed -rn s#/(.*)#\1#p | awk -v RS/ {print $1}| tr -d :
usr
local
sbin
usr
local
bin
usr
sbin
usr
bin
root
bin
#以/为分隔符
echo $PATH | sed -rn s#/(.*)#\1#p | awk -v RS/|:/ {print $1}
这样也可以实现示例NF代表字段的个数
[rootlocalhost opt]# cat file.txt
1:a
2:b
[rootlocalhost opt]# awk -F: {print NF} file.txt
2
2
应用过滤磁盘占用百分比
[rootlocalhost opt]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 52403200 3625008 48778192 7% /
devtmpfs 917604 0 917604 0% /dev
tmpfs 933524 0 933524 0% /dev/shm
tmpfs 933524 9216 924308 1% /run
tmpfs 933524 0 933524 0% /sys/fs/cgroup
/dev/sda1 5232640 182372 5050268 4% /boot
tmpfs 186708 12 186696 1% /run/user/42
tmpfs 186708 0 186708 0% /run/user/0
[rootlocalhost opt]# df | awk {print $(NF-1)} | tr -d % | tail -n 2
7 #$NF表示最后一个字段
0
0
1
0
4
1
0
示例NR行号类似于wc -l
[rootlocalhost opt]# cat file.txt
a:aa
b:bb
3:33
[rootlocalhost opt]# awk -F: {print NR} file.txt
1
2
3
应用打印出当前系统普通用户同时按倒序排列
[rootlocalhost ~]# awk -F: $31000{print $3,$1} /etc/passwd | sed -nr s/(.*) (.*)/\2 \1/p
nfsnobody 65534
fql 1000[rootlocalhost ~]# cat /etc/passwd | sort -t: -k3 -n | tail -n1
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
#可以找打uid最大的用户-t也是指定分隔符-k3代表第三列
示例FNR把两个文件分开重新计数
[rootlocalhost opt]# cat file1.txt
123
456
[rootlocalhost opt]# cat file2.txt
abc
[rootlocalhost opt]# awk {print NR} file1.txt file2.txt #NR会合并计数
1
2
3
[rootlocalhost opt]# awk {print FNR} file1.txt file2.txt #FNR分开计数
1
2
1
3.6 自定义变量
[rootlocalhost ~]# awk -v testhello BEGIN{print test}
hello
printf了解
%s显示字符串%d, %i显示十进制整数%f显示为浮点数%e, %E显示科学计数法数值 %c显示字符的ASCII码%g, %G以科学计数法或浮点形式显示数值%u无符号整数%%显示%自身
[rootlocalhost opt]# cat file1.txt
123:a
456:b
[rootlocalhost opt]# awk -F: {printf %s\n,$1} file1.txt
123
456
#printf虽然功能强大但是不自动换行需要\n换行
3.7 模式PATTERN
awk 模式{处理动作}PATTERN:根据pattern条件过滤匹配的行再做处理。
3.7.1 模式为空 如果模式为空表示每一行都匹配成功相当于没有额外条件
[rootlocalhost opt]# cat file1.txt
123:a
456:b
[rootlocalhost opt]# awk -F: {print $1,$2} file1.txt
123 a
456 b
3.7.2 正则匹配
/regular expression/仅处理能够模式匹配到的行需要用/ /括起来
[rootlocalhost opt]# cat file1.txt
123:a 000
456:b 789
[rootlocalhost opt]# awk /^4/{print $1} file1.txt
456:b
#匹配以4开头的行的第一列3.7.3 line ranges行范围
不支持使用行号但是可以使用变量NR间接指定行号加上比较操作符或者逻辑关系
算术操作符
xy, x-y, x*y, x/y, x^y, x%y-x转换为负数x将字符串转换为数值
比较操作符
, !, , , , #####逻辑与并且关系或||或者关系非!取反
[rootlocalhost opt]# cat file1.txt
a:1 4
b:2 5
c:3 6
[rootlocalhost opt]# awk NR1{print} file1.txt
a:1 4
[rootlocalhost opt]# awk NR1,NR3{print} file1.txt #打印出1到3行
a:1 4
b:2 5
c:3 6
3.7.4 /pat1/,/pat2/ 案例找到10:00到11:00之间的日志
sed -nr /10/,/11/p 文件名 #sed参考2.4.1相关内容介绍
awk /10/,/11/ 文件名
[rootlocalhost log]# awk /Jan 30 21:34:24/,/Jan 30 21:34:26/ messages
Jan 30 21:34:24 localhost avahi-daemon[685]: Registering new address record for fe80::e743:cb44:9825:6230 on ens33.*.
Jan 30 21:34:26 localhost setroubleshoot: SELinux is preventing /usr/sbin/ip from read access on the file /run/vmware-active-nics. For complete SELinux messages run: sealert -l 3c1805c2-5564-44bb-ab25-c32fb01e593a
#找到an 30 21:34:24到Jan 30 21:34:26日志3.7.5 关系表达式
在awk中关系表达式用于比较两个值并返回一个布尔值真或假。这些表达式通常用于控制流程和过滤数据关系表达式结果为“真”才会被处理。
真结果为非0值非空字符串
假结果为空字符串或0值
[rootlocalhost ~]# seq 5 | awk n
2
3
4
5
#结果为第一行不打印
第一行n0awk 0为假则第一行不打印
第二行n1awk 1为真则打印第二行
第三行n2awk 2为真则打印第三行
第四行n3awk 3为真则打印第四行
第五行n4awk 4为真则打印第五行
[rootlocalhost ~]# seq 5 | awk !n #取反只打印第一行
1
[rootlocalhost ~]# seq 5 | awk !0 #都打印
1
2
3
4
5
[rootlocalhost ~]# seq 5 | awk i!i #打印奇数行
1
3
5
第一行i未赋值为假!i取反为真打印第一行
第二行i为真!i取反为假第二行不打印
第三行i为假!i取反为真打印第三行
第四行i为真!i取反为假第四行不打印
第五行i为假!i取反为真打印第五行
[rootlocalhost ~]# seq 5 | awk !(i!i) #打印偶数行
2
4
seq 5 |awk -v i1 i!i也可实现打印偶数行3.8 条件判断
在awk中条件判断通常用于控制程序的流程以便根据特定条件执行不同的操作。条件判断通常与if语句结合使用。
格式awk 选项 模式 {actions}条件判断写在 actions里
if语句awk的if语句也分为单分支、双分支和多分支 单分支为if(判断条件){执行语句} 双分支为if(判断条件){执行语句}else{执行语句} 多分支为if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句}else if(判断条件){执行语句
示例
[rootlocalhost opt]# awk {if($210){print $1,$2}else{print $1}} file.txt
a
b
c 10
d 20
#以空格为分隔符如果第二列大于等于10打印第一列和第二列否则只打印第一列
3.9 循环for | while
在awk中可以使用循环语句来重复执行一组操作直到满足特定条件为止。awk支持for循环和while循环。
格式condition:条件statement:语句
for(expr1;expr2;expr3) {statement;…} for(variable assignment;condition;iteration process) {for-body} for(var in array) {for-body}
示例1-100求和
[rootlocalhost ~]# awk BEGIN{sum0;for(i1;i100;i){sumi};print sum}
5050
3.10 数组
在awk中数组是一种非常有用的数据结构用于存储和操作数据。awk中的数组是关联数组也就是说它们可以使用字符串作为索引。
awk数组特性
(1)awk的数组是关联数组(即key/value方式的hash数据结构)索引下标可为数值(甚至是负数、小数等)也可为字符串
① 在内部awk数组的索引全都是字符串即使是数值索引在使用时内部也会转换成字符串
② awk的数组元素的顺序和元素插入时的顺序很可能是不相同的
(2) awk数组支持数组的数组
3.10.1 访问、赋值数组元素
可以使用数组的索引来访问和修改数组元素的值
[rootlocalhost ~]# awk BEGIN{name[a]zhangsan;name[b]lisi;name[c]wangwu;for(i in name)print name[i]}
zhangsan
lisi
wangwu
3.10.2 数组长度
awk提供了 length() 函数来获取数组的元素个数它也可以用于获取字符串的字符数量。还可以获取数值转换成字符串后的字符数量。
示例
[rootlocalhost ~]# awk BEGIN{a[1]zhangsan;print a[1];print length(a)}
zhangsan
1
3.10.3 遍历数组
使用for循环来迭代数组中的元素
格式for(var in array) {for-body}
示例
[rootlocalhost ~]# ss -natp | awk NR!1{print $1} | sort |uniq -c1 ESTAB11 LISTEN
[rootlocalhost ~]# ss -natp | awk NR!1{a[$1]}END{for(i in a)print i,a[i]}
LISTEN 11
ESTAB 1
3.10.4 实际案例
去除重复行
[rootlocalhost opt]# cat file.txt
a
a
b
b
c
[rootlocalhost opt]# awk !line[$0] file.txt
a
b
c
#line数组$0将整行作为参数写入
第一行a一开始未赋值为假取反为真打印a1依然为真
第二行a真取反为假不打印1为真即下次在遇到a一直不打印
第三行b一开始未赋值为假取反为真打印b1依然为真
下面同理
3.11 awk脚本 将awk程序写成脚本直接调用或执行
示例
#!/bin/awk -f
{if($31000){print $1,$3}}[rootlocalhost opt]# awk -F: -f passwd.awk /etc/passwd
nfsnobody 65534
fql 1000