当前位置: 首页 > java >正文

Linux三剑客grep-sed-awk

linux三剑客-grep、sed、awk

文章目录

        • linux三剑客-grep、sed、awk
          • 1.正则表达式
            • 1.1正则表达式?
            • 1.2应用场景?-谁可以用?
            • 1.3正则注意事项(避免90%以上的坑)
            • 1.4正则符号
            • 1.5正则VS通配符
          • 2.基础正则
            • 2.1 ^ 以...开头的行
            • 2.2 $ 以...结尾的行
            • 2.3 ^$ 空行
            • 2.4 . (点) 任意一个字符
            • 2.5 \ 转义字符 -脱掉马甲打回原形,去除原有特殊含义
            • 2.6 * 前一个字符连续出现0次或者0次以上
            • 2.7 .* 所有内容、任何内容、任意内容
            • 2.8 灵异的2* 8*
            • 2.9 [] [abc] 1次匹配任何一个字符(a或b或c)
            • 2.10 [^] \[^abc] 取反,排除 排除a或b或c .匹配a或b或c以外的内容
          • 基础正则小结
          • 3.扩展正则
            • 3.1 + 前一个字符连续出现1次或者1次以上
          • 4.三剑客sed
            • 4.1 特点及格式
            • 4.2 sed命令执行过程
            • 4.3 sed核心应用
            • sed -增加 cai
            • sed - 替换 s
            • sed-后向引用(反向引用)
          • 5. awk
            • awk特点与应用场景
            • awk执行过程
            • awk中的行与列
            • 1)取行
            • 2)awk取列
            • 小结
            • awk的内置变量
            • awk模式匹配
            • 1)比较表达式-参考上边取行部分
            • 2)正则
            • 3)表示范围
            • 4)特殊模式BEGIN{} 和END{}
            • awk数组
            • awk数组

1.正则表达式
1.1正则表达式?
- 匹配有规律的东西:手机号、身份证号、匹配日志
- 正则表达式就出来了,regular expression(RE)
- 使用一些符号表达重复出现、大小写、开头/结尾含义
1.2应用场景?-谁可以用?
正则表达式linux三剑客使用,开发语言(Python,Java,golang)
应用场景过滤有规律的内容,尤其是日志
1.3正则注意事项(避免90%以上的坑)
  • 所有的符号都是英文符号

  • 学习正则通过grep命令学习,grep加上单引号

  • 给grep egrep加上颜色 ‘alias grep =‘grep --color=auto’’

  • 注意系统的字符集:en_US.UTF-8(大部分情况没问题),如果出现问题修改字符集为C:export LANG=C

  • 快速掌握正则:配合grep -o 参数学习

    1.4正则符号
基础正则^ $ ^$ . * .* [a-z] [^abc](取反,匹配任何不在方括号内指定的单个字符)
扩展正则+ | () {} ?
1.5正则VS通配符
分类诞生目标(用途)支持的命令
正则三剑客、高级语言、进行过滤(匹配字符)三剑客grep,sed,awk,find,rename(ubuntu)
通配符(pathname extension 或者globa)匹配文件(文件名)*.txt *.log {1…10}linux下面大部分命令都可以支持
2.基础正则
环境准备:
[root@oldboyedu oldboy]# cat oldboy.txt 
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
2.1 ^ 以…开头的行
案例:以my开头的行
[root@oldboyedu oldboy]# grep '^my' oldboy.txt    
my blog is http: blog.51cto.com 
my qq num is 593528156 

在这里插入图片描述

2.2 $ 以…结尾的行
案例:以156结尾的行
[root@oldboyedu oldboy]# grep '156$' oldboy.txt 
my qq num is 593528156

在这里插入图片描述

cat -A file 	#显示文件中隐藏的标记
[root@oldboyedu oldboy]# cat -A oldboy.txt 
I am lizhenya teacher!$
I teach linux.$
test$
$
I like badminton ball ,billiard ball and chinese chess!$
my blog is http: blog.51cto.com $
our site is http:www.lizhenya.com $
our site is http:www.lizhenua.com $
my qq num is 593528156$
$
aaaa,$
not 572891888887.$
^^^^^^^^66$$$$$$$^^^$$$
lizhenyalizhenyalizhenya$

在这里插入图片描述

案例:显示以m 结尾的行
[root@oldboyedu oldboy]# grep 'm $' oldboy.txt 
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 

在这里插入图片描述

2.3 ^$ 空行
  • 空行 这一行没有任何内容
案例:过滤出空行
[root@oldboyedu oldboy]# grep -n '^$' oldboy.txt 
4:
10:
  • 企业中案例:
排除空行
[root@oldboyedu oldboy]# grep -v '^$' oldboy.txt 
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
2.4 . (点) 任意一个字符
  • 注意 . 不匹配空行
[root@oldboyedu oldboy]# grep '.' oldboy.txt 
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya

在这里插入图片描述

2.5 \ 转义字符 -脱掉马甲打回原形,去除原有特殊含义
  • 匹配出以 . 结尾的行
[root@oldboyedu oldboy]# grep '\.$' oldboy.txt 
I teach linux.
not 572891888887.

在这里插入图片描述

  • 转义字符序列
    • \n 回车键
    • \t tab键
2.6 * 前一个字符连续出现0次或者0次以上
案例:8连续出现0次或者0次以上
[root@oldboyedu oldboy]# grep '8*' oldboy.txt 
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya

在这里插入图片描述

[root@oldboyedu oldboy]# grep '\^*' oldboy.txt 
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$

在这里插入图片描述

2.7 .* 所有内容、任何内容、任意内容
  • 整体记忆 . 表示所有*
  • 理解:.表示任意一个字符 * 表示前一个字符连续出现0次或者0次以上
匹配全部内容
[root@oldboyedu oldboy]# grep '.*' oldboy.txt 
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya

在这里插入图片描述

案例:
[root@oldboyedu oldboy]# grep '^.*t' oldboy.txt 
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
not 572891888887.

在这里插入图片描述

案例:任意开头到第一个o结束的行
  • 正则表达式特色:正则表达式的贪婪性。*表示所有或者*连续出现的时候表现出尽可能贪婪匹配
2.8 灵异的2* 8*
  • 为什么多匹配了内容?
[root@oldboyedu oldboy]# grep '8*' oldboy.txt 
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya## 8* 表示数字8出现了0次或者是0次以上。出现0次意思是什么都没有,这时候会把所有内容显示出来
2.9 [] [abc] 1次匹配任何一个字符(a或b或c)
[root@oldboyedu oldboy]# grep '[abc]' oldboy.txt 
I am lizhenya teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
aaaa,
lizhenyalizhenyalizhenya[a-z]	#所有小写字母
[A-Z]	#大写字母
[0-9]	#数字
[a-Z0-9] #所有大小写字母和数字
grep -i [a-z0-9] #所有大小写字母和数字
案例:匹配文件中的大小写字母和数字
[root@oldboyedu oldboy]# grep '[a-zA-Z0-9]' oldboy.txt 
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
  • [a-z|A-Z|0-9] 匹配大小写字母和数字和|
2.10 [^] [^abc] 取反,排除 排除a或b或c .匹配a或b或c以外的内容
案例:除了a或b或c以外的内容
[root@oldboyedu oldboy]# grep '[^abc]' oldboy.txt 
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com 
our site is http:www.lizhenya.com 
our site is http:www.lizhenua.com 
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya

在这里插入图片描述

基础正则小结
基础正则含义搭配
^以…开头
$以…结尾
^$空行固定搭配^$
.任意字符
*前一个字符连续出现0次或者0次以上
.*所有内容固定搭配 .*
\转义字符 \n \t
[]匹配[]内任意单个字符[abc](a或b或c)[]与+搭配
[^]取反。 ^ 符号在方括号 [] 内时表示取反。匹配任何不在方括号内指定的字符集合中的单个字符
正则贪婪性正则表达式的特点 .* 或连续出现
3.扩展正则
符号
+
|
()
{}
3.1 + 前一个字符连续出现1次或者1次以上

4.三剑客sed
4.1 特点及格式
  • sed stream editor 流编辑器,sed把处理的内容(文件),当做是水源源不断地进行处理,直到文件末尾
  • sed格式
命令选项(参数)(s)替换 sed命令功能(g)修饰符文件
sed-r‘s#oldboy#oldgirl#g’oldboy.txt
  • sed命令的核心功能
功能
s替换substitute sub
p显示 print
d删除DELETE
cai增加c/a/i
4.2 sed命令执行过程

找谁,干啥

  • 找谁:哪一行
  • 干啥:增删改查
4.3 sed核心应用

sed-查找 p

查找格式
‘2p’指定行查找
‘1,5p’指定行号范围进行查找
‘/lidao/p’类似于grep过滤,//里面可以写正则
‘//,//p’表示范围的过滤。找日志用
  • 指定行号
#指定行号查找 
[root@oldboyedu ~]# sed -n '3p' oldboy.txt 
103,李导996,COO#sed -n 取消默认输出
[root@oldboyedu ~]# sed -n '3p' oldboy.txt 
103,李导996,COO
[root@oldboyedu ~]# sed '3p' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO#sed 指定行号范围
[root@oldboyedu ~]# sed -n '1,3p' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO[root@oldboyedu ~]# sed -n '3,6p' oldboy.txt 
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO#sed 从第4行到最后一行
[root@oldboyedu ~]# sed -n '4,$p' oldboy.txt 
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
  • 过滤
#过滤包含oldboy
[root@oldboyedu ~]# sed -n '/oldboy/p' oldboy.txt 
101,oldboy,CEO#过滤包含10
[root@oldboyedu ~]# sed -n '/10/p' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO#过滤包含4或5
[root@oldboyedu ~]# sed -n '/[45]/p' oldboy.txt 
104,yy,CFO
105,feixue,CIO#表示范围过滤。包含102到105的行
[root@oldboyedu opt]# sed -n '/102/,/105/p' oldboy.txt 
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
  • 实际生产环境日志统计
禁用cat/vim
使用head/tail/less/more/sed/grep

sed 删除d delete

删除格式
‘2d’指定行删除
‘1,5d’指定行号范围删除
‘/lidao/d’过滤删除
‘/11:00/,/12:00/d’过滤区间范围删除
#常见删除
#1.指定行删除:
[root@oldboyedu ~]# cat 1.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#删除第2行
[root@oldboyedu ~]# sed '3d' 1.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#删第3行
[root@oldboyedu ~]# sed '2d' 1.txt 
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#指定范围删除 
[root@oldboyedu ~]# sed '2,3d' 1.txt 
1 root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin#过滤删除包含xx的行。整行删除
[root@oldboyedu opt]# cat oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO[root@oldboyedu opt]# sed '/lidao/d' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
sed -增加 cai
命令含义
creplace 替代这行的内容
aappend 向指定的行或每一行追加内容 相当于>> (行的后面)
iinsert 插入 向执行的行或者是每行插入内容 (这一行的前面)
[root@oldboyedu ~]# cat oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@oldboyedu ~]# 
[root@oldboyedu ~]# 
[root@oldboyedu ~]# 
[root@oldboyedu ~]# sed '3a 996,lidao996,UFO' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
996,lidao996,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO[root@oldboyedu ~]# sed '3i 996,lidao996,UFO' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
996,lidao996,UFO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@oldboyedu ~]# sed '3c 996,lidao996,UFO' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
996,lidao996,UFO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
  • 企业案例:向文件中追加多行内容
向sshd_config 里面追加
UseDNS no
GSSAPIAURCARION no
PermintRootLogin no#方法一:
cat  >>config<<'EOF'
UseDNS no
GSSAPIAURCARION no
PermintRootLogin no
EOF#方法二:sed
sed '$a UseDNS no\nGSSAPIAURCARION no\nPermintRootLogin no' config
#在config文件的最后一行增加
UseDNS no
GSSAPIAURCARION no
PermintRootLogin no
#这三行内容 \n 是换行
sed - 替换 s
  • s–> sub substitute 代替 替换
  • g—> global 全局替换,sed去替换所有匹配的内容,不带g的话sed默认只替换每行第一个匹配的内容
替换格式
s###g 第一个和第二个#之间支持正则
s@@@g
s///g
[root@oldboyedu ~]# cat oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
[root@oldboyedu ~]# 
[root@oldboyedu ~]# sed 's#[0-9]##g' oldboy.txt
,oldboy,CEO
,zhangyao,CTO
,李导,COO
,yy,CFO
,feixue,CIO
,lidao,COCO[root@oldboyedu ~]# sed 's#[0-9]##' oldboy.txt
01,oldboy,CEO
02,zhangyao,CTO
03,李导996,COO
04,yy,CFO
05,feixue,CIO
10,lidao,COCO
sed-后向引用(反向引用)
  • 口诀:先保护,再使用
[root@oldboyedu ~]# echo 123456 |sed -r 's#(.*)#<\1>#g'
<123456>                                   先保护,再使用sed -r 支持扩展正则
\1 代表前边()括起来的内容
案例2:
[root@oldboyedu ~]# echo oldboy_lidao |sed -r 's#(^.*)_(.*)#\1_\2#g'
oldboy_lidao
[root@oldboyedu ~]# echo oldboy_lidao |sed -r 's#(^.*)_(.*)#\2_\1#g'
lidao_oldboy
案例:取网卡的IP地址
ip a s eth0  # ip addr show eth0[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@oldboyedu ~]# 
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p' |sed -r s#(^.*t )(.*)(/.*$)#\1#g
-bash: syntax error near unexpected token `('
[root@oldboyedu ~]# 
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p' |sed -r s#(^.*t )(.*)(/.*$)#\1#g
-bash: syntax error near unexpected token `('
[root@oldboyedu ~]# 
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@oldboyedu ~]# 
#取出第一组里的
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\1#g'inet 
#取出第二组里的
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\2#g'
10.0.0.200#取出第三组里的
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\3#g'
/24 brd 10.0.0.255 scope global eth0#精简命令取出IP地址:
[root@oldboyedu ~]# ip a s eth0 |sed -rn '3s#^.*t (.*)/.*$#\1#gp'
10.0.0.200
#案例:取权限
[root@oldboyedu ~]# stat /etc/hostsFile: ‘/etc/hosts’Size: 182       	Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d	Inode: 16814892    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2024-05-19 20:21:54.018999440 +0800
Modify: 2024-03-12 21:33:41.216339940 +0800
Change: 2024-03-12 21:33:41.216339940 +0800Birth: -[root@oldboyedu ~]# stat /etc/hosts |sed -n 4p
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)[root@oldboyedu ~]# stat /etc/hosts |sed -n 4p |sed -r 's#^.*\(0(.*)(/-.*$)#\1#g'
644# 精简命令:
[root@oldboyedu ~]# stat /etc/hosts |sed -rn '4s#^.*\(0(.*)(/-.*$)#\1#gp'
644
5. awk
awk特点与应用场景
awk
一门语言,类似C语言
过滤,统计,计算
过滤,统计日志
awk执行过程
awk -F , 'BEGIN{print "name"}{print $2}{print "end of file"}' oldboy.txt

在这里插入图片描述

[root@sanjk tmp]# awk -F , 'BEGIN{print "name"}{print $2}{print "end of file"}' oldboy.txt
name
oldboy
end of file
zhangyao
end of file
李导996
end of file
yy
end of file
feixue
end of file
lidao
end of file
awk中的行与列
名词awk中叫法一些说明
记录record每一行默认通过回车分隔的
字段,域 field每一列默认通过空格分隔的
awk中的行和列结束标记都是可以修改的。
1)取行
awk
NR==1取出一行
NR>=1&&NR<=5取出1到5行
/oldboy/过滤
/101/,/105/范围
符号> < >= <= == !=
[root@sanjk tmp]# awk 'NR==1' oldboy.txt 
#找谁{干啥}
101,oldboy,CEO
[root@sanjk tmp]# awk 'NR>=1 && NR<=5' oldboy.txt
#找谁{干啥}
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
[root@sanjk tmp]# awk '/oldboy/' oldboy.txt 
101,oldboy,CEO
[root@sanjk tmp]# awk '/101/,/105/' oldboy.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
2)awk取列
  • -F 指定分隔符。指定每一列结束标记(默认是空格,连续的空格,tab键)
  • 数字表示取出某一列,注意在awk中数字 表示取出某一列,注意在awk中数字表示取出某一列,注意在awk内容就一个意思:表示取出某一列
  • $0 表示整行的内容,
  • {print xxx}
  • $NF 表示最后一列
[root@sanjk tmp]# ls -l
total 8
-rwxr-xr-x 1 root root  2 Jun  3 19:13 config
-rw-r--r-- 1 root root 91 Apr  6 17:33 oldboy.txt
drwx------ 2 root root  6 Jun  3 17:21 vmware-root_766-2990744190
drwx------ 2 root root  6 Jun  3 17:18 vmware-root_793-4248746047
[root@sanjk tmp]# 
[root@sanjk tmp]# ls -l |awk '{print $5}'2
91
6
6
[root@sanjk tmp]# ls -l |awk '{print $5,$9}' |column -t
2   config
91  oldboy.txt
6   vmware-root_766-2990744190
6   vmware-root_793-4248746047
[root@sanjk tmp]# ls -l |awk '{print $5,$NF}'8
2 config
91 oldboy.txt
6 vmware-root_766-2990744190
6 vmware-root_793-4248746047
[root@sanjk tmp]# #取出passwd 第一列和最后一列
[root@sanjk tmp]# head -1 /etc/passwd |awk -F : '{print $1,$NF}'
root /bin/bash
[root@sanjk tmp]# head -5 /etc/passwd |awk -F : -vOFS=: '{print $NF,$5,$4,$3,$2,$1}'
/bin/bash:root:0:0:x:root
/sbin/nologin:bin:1:1:x:bin
/sbin/nologin:daemon:2:2:x:daemon
/sbin/nologin:adm:4:3:x:adm
/sbin/nologin:lp:7:4:x:lp
小结
  • 行与列 名称
  • awk 取行与取列,指哪打哪
  • 取出网卡IP地址
[root@sanjk tmp]# ip a s eth0|awk 'NR==3'inet 10.0.0.129/24 brd 10.0.0.255 scope global eth0
[root@sanjk tmp]# ip a s eth0|awk 'NR==3'|awk -F"[ /]+" '{print $3}'
10.0.0.129
[root@sanjk tmp]# ip a s eth0|awk -F"[ /]+" 'NR==3{print $3}'
10.0.0.129
awk的内置变量
内置变量
NRNumber of Record 记录号,行号
NFNumber of Field 每行有多个字段(列)$NF表示最后一列的内容
FS-F: === -v FS=: Field Separator 字段分隔符,每个字段结束标记
OFSOutput Field Separator 输出字段分隔符(awk显示每一列的时候每一列之间通过什么分隔,默认是空格)
awk模式匹配
  • awk -F"[ /]+" ‘NR==3{print $2}’
awk-F"[ /]"‘NR==3{print $2}’
命令选项‘条件{动作}’
‘找谁{干啥}’
‘模式{动作}’
‘pattern{action}’

1)比较符号: > < >= <= == !=

2)正则:

3)范围:表达式//,//

4)特殊条件:BEGIN和END

1)比较表达式-参考上边取行部分
2)正则
  • // 支持扩展正则
  • awk 可以精确到某一列,某一列中包含或者不包含…内容
  • ~ 包含
  • !~ 不包含
正则awk正则
^表示以…开头的行某一列的开头$3~/oldboy/
$表示以…结尾的行某一列的结尾$4~/lidao/
^$ 表示空行某一列是空的
#第三行是以1开头的行
[root@sanjk tmp]# head -5 /etc/passwd|awk -F : '$3~/^1/'
bin:x:1:1:bin:/bin:/sbin/nologin#找出第3列以2开头的行,并显示第1列,第3列和最后一列
[root@sanjk tmp]# awk -F: '$3~/^2/{print $1,$3,$NF}' /etc/passwd
daemon 2 /sbin/nologin#找出第3列以1或者2开头的行,并显示第1列,第3列和最后一列
[root@sanjk tmp]# awk -F: '$3~/^[12]/{print $1,$3,$NF}' /etc/passwd
bin 1 /sbin/nologin
daemon 2 /sbin/nologin
operator 11 /sbin/nologin
games 12 /sbin/nologin
ftp 14 /sbin/nologin
systemd-network 192 /sbin/nologin
abrt 173 /sbin/nologin
test01 1000 /bin/bash
test02 1001 /bin/bash
oldboy 1002 /bin/bash
test05 1006 /sbin/nologin
oldboy02 1007 /bin/bash
oldboy1 1008 /bin/bash
3)表示范围
  • /哪里开始/,/哪里结束/ =常用=
  • NR1,NR5 从第一行开始到第5行结束 类似于‘sed -n ‘1,5p’’
#显示一定时间内的日志
[root@sanjk tmp]# awk '/21:44:03/,/21:44:12/' /var/log/secure |wc -l
4
[root@sanjk tmp]# awk '/21:44:03/,/21:44:12/{print $1}' /var/log/secure
Jun
Jun
Jun
Jun
4)特殊模式BEGIN{} 和END{}
模式含义应用场景
BEGIN{}里面的内容会在awk读取文件之前执行1)进行简单统计,计算,不涉及读取文件(常见)
2)处理文件之前
3)用来定义一些awk变量(很少用)
END{}里面的内容会在awk读取文件之后执行1)awk进行统计,一般过程:先进行计算,最后END里面输出结果(常见)
2)awk使用数组,用来输出属组结果(常见)
  • END统计计算
  • 统计方法:i++ i=i+1
统计方法简写应用场景
i++i=i+1计数,统计次数
sum =sum+?sum+=?求和累加
注意i,sum都是变量
#统计/etc/services里面有多少个空行
[root@sanjk tmp]# awk '/^$/{i++}END{print i}' /etc/services 
17
##seq 100 求和1+2+3...+100 awk实现
[root@sanjk tmp]# seq 100|awk '{sum=sum+$1}END{print sum}'
5050
##如果想查看过程怎么办?
[root@sanjk tmp]# seq 100|awk '{sum=sum+$1;print sum}END{print sum}'
awk数组
  • 统计次数:统计日志:类似于统计每个IP出现的次数,统计每种状态码出现的次数,统计系统中用户被攻击的次数。统计攻击者IP出现的次数。
  • 累加求和:统计日志中每个IP消耗的流量。。。。
shell数组awk数组
形式array[0]=oldboy array[1]=lidaoarray[0]=oldboy array[1]=lidao
使用echoarray[0]echoarray[0] echoarray[0]echoarray[1]print array[0] printarray[1]
         |
  • END统计计算
  • 统计方法:i++ i=i+1
统计方法简写应用场景
i++i=i+1计数,统计次数
sum =sum+?sum+=?求和累加
注意i,sum都是变量
#统计/etc/services里面有多少个空行
[root@sanjk tmp]# awk '/^$/{i++}END{print i}' /etc/services 
17
##seq 100 求和1+2+3...+100 awk实现
[root@sanjk tmp]# seq 100|awk '{sum=sum+$1}END{print sum}'
5050
##如果想查看过程怎么办?
[root@sanjk tmp]# seq 100|awk '{sum=sum+$1;print sum}END{print sum}'
awk数组
  • 统计次数:统计日志:类似于统计每个IP出现的次数,统计每种状态码出现的次数,统计系统中用户被攻击的次数。统计攻击者IP出现的次数。
  • 累加求和:统计日志中每个IP消耗的流量。。。。
shell数组awk数组
形式array[0]=oldboy array[1]=lidaoarray[0]=oldboy array[1]=lidao
使用echoarray[0]echoarray[0] echoarray[0]echoarray[1]print array[0] printarray[1]
http://www.xdnf.cn/news/19312.html

相关文章:

  • 为什么vue3会移除过滤器filter
  • 北斗导航 | RAIM算法改进方案及性能对比分析报告
  • 深度学习:洞察发展趋势,展望未来蓝图
  • 计算机网络面试集合
  • 【AI工具】在 VSCode中安装使用Excalidraw
  • Java全栈开发面试实战:从基础到微服务的深度解析
  • 小迪安全v2023学习笔记(七十四讲)—— 验证机制篇验证码绕过思路SRC挖掘演示
  • Coze源码分析-API授权-获取令牌列表-前端源码
  • LeetCode刷题记录----51.N皇后(Hard)
  • OpenCV安装及其开发环境配置(Windows系统Visual Studio 2022)
  • ros1ros2区别和相同之处
  • 软考 系统架构设计师系列知识点之杂项集萃(136)
  • 【LeetCode - 每日1题】有效的数独
  • Java基础知识(十)
  • plantsimulation知识点 多条RGV驮一台工件图标显示顺序问题
  • C语言类型转换踩坑解决过程
  • 重叠IO模型
  • 深入理解 Linux 驱动中的 file_operations:从 C 语言函数指针到类比 C++ 虚函数表
  • 学习Python中Selenium模块的基本用法(11:弹窗处理)
  • Day18_【机器学习—交叉验证与网格搜索】
  • 【ROS2】ROS2 基础学习教程 、movelt学习
  • PostgreSQL 数据库灾备要点与举例说明**
  • Spring Data Redis 的使用方法
  • 电子战:多功能雷达工作模式识别
  • [光学原理与应用-339]:ZEMAX - Spot Diagram(点列图)是评估光学系统成像质量的核心工具,它通过几何光线追迹直观展示像差对成像的影响。
  • 模拟实现STL中的list容器
  • 行内元素块元素
  • Coze源码分析-API授权-添加新令牌-后端源码
  • mysql权限user表赋权操作修改
  • 【大语言模型 30】指令微调数据工程:高质量数据集构建