linux三剑客-grep、sed、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.
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.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.
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

[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$$$$$$$^^^$$

2.7 .* 所有内容、任何内容、任意内容
- 整体记忆 . 表示所有*
- 理解:.表示任意一个字符 * 表示前一个字符连续出现0次或者0次以上
匹配全部内容
[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

案例:
[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.
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
## 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
| 命令 | 含义 | |
|---|---|---|
| c | replace 替代这行的内容 | |
| a | append 向指定的行或每一行追加内容 相当于>> (行的后面) | |
| i | insert 插入 向执行的行或者是每行插入内容 (这一行的前面) |
[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/hosts
File: ‘/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 +0800
Birth: -
[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键)
- 数字表示取出某一列,注意在 a w k 中 数字 表示取出某一列,注意在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的内置变量
| 内置变量 | |
|---|---|
| NR | Number of Record 记录号,行号 |
| NF | Number of Field 每行有多个字段(列)$NF表示最后一列的内容 |
| FS | -F: === -v FS=: Field Separator 字段分隔符,每个字段结束标记 |
| OFS | Output 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]=lidao | array[0]=oldboy array[1]=lidao |
| 使用 | echo a r r a y [ 0 ] e c h o array[0] echo array[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]=lidao | array[0]=oldboy array[1]=lidao |
| 使用 | echo a r r a y [ 0 ] e c h o array[0] echo array[0]echoarray[1] | print array[0] printarray[1] |
2491

被折叠的 条评论
为什么被折叠?



