linux三剑客
文章目录
大纲
- 正则表达式
- 是什么?应用场景
- 正则注意事项
- 规则
- 三剑客grep
- 三剑客sed
- 三剑客awk
1.正则表达式
1.1什么是正则表达式
- 匹配有规律的东西:手机号、身份证、匹配日志
- 正则表达式,regular expression(RE)
- 使用一些符号表达重复出现、大小写、开头/结尾含义
1.2应用场景
正则表达式 | Linux三剑客支持,开发语言(python,Golang等) |
---|---|
应用场景 | 过滤有规律的内容,尤其是日志 |
1.3正则表达式注意事项
- 所有的符号都是英文
- 学习正则,通过grep命令学习,给grep加上单引号
- 给grep,egrep加上颜色
alisa grep='grep --color=auto'
alias egrep='egrep --color=auto'
- 注意系统的字符集:en_US.UTF-8(大部分情况),如果出现问题修改字符集为
export LANG=C
- 快速掌握正则:配合grep -o参数学习
1.4正则表达式符号
分类 | 具体符号 |
---|---|
基础正则 | ^ $ ^$ . * .* [a-z] [^abc] |
扩展正则 | + | {} ? |
1.5正则VS通配符
分类 | 诞生目标(用途) | 支持的命令 |
---|---|---|
正则 | 三剑客,高级语言,进行过滤(匹配字符) | 三剑客grep,sed,awk,find,rename(ubuntu).expr |
通配符(pathname extension或glob) | 匹配文件(文件名) *.txt *.log | linux下大部分命令都支持 |
1.6基础正则
1.6.1 ^以…开头的行
grep '^wangc.com' wangc.txt
1.6.2 $ 以…结尾的行
-
grep 'wangc.com$' wangc.txt
-
cat -A
可以显示文件中隐藏的字符
1.6.3 ^$ 空行
- 这一行中没有任何内容(空格也是内容)
grep -v
排除grep -n
显示行号grep -o
可以显示过程grep -nv '^$' wangc.txt
1.6.4 .(点)表示任意一个字符
- 注意:.(点)不匹配空行
grep '.' wangc.txt
1.6.5 \ 转义字符
- \n 回车换行
- \t tab键
- 特殊符号需要使用转义字符
1.6.6 * 前一个字符连续出现0次或0次以上
- 连续出现:0(0出现一次) 00(0出现2次) 00000(0出现5次) wangc(字母出现了5次)
[root@nas01 ~]# grep 's*' backup.sh
#!/bin/bash
ftpserver="ip_address"
user="user"
passwd="passwd"
Wpath="path"
ftp -n -v $ftpserver << EOF
user $user $passwd
bin
put /opt/1.txt $Wpath/1.txt
bye
EOF
1.6.7 .*所有内容,任何内容,任意内容
grep '.*' backup.sh
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-or5JrApM-1660053582282)(C:\Users\16664\AppData\Roaming\Typora\typora-user-images\image-20210925213802993.png)]
grep '^.*t' backup.sh
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKnUuqq8-1660053582283)(C:\Users\16664\AppData\Roaming\Typora\typora-user-images\image-20210925213938536.png)]
- 正则表达式的贪婪性:表示所有或连续出现的时候,表现尽可能的贪婪匹配
1.6.8 [] [abc] 1次匹配一个字符,匹配任何一个字符(a或b或c)
grep -o
可以显示匹配过程grep -i
不区分大小写
[root@nas01 ~]# grep '[awc]' backup.sh
[root@nas01 ~]# grep -o '[awc]' backup.sh
[root@nas01 ~]# grep '[A-Z]' backup.sh
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRj0hS0G-1660053582283)(C:\Users\16664\AppData\Roaming\Typora\typora-user-images\image-20210925215433963.png)]
-
匹配文件中的大小写字母和数字
[root@nas01 ~]# grep '[a-Z0-9]' backup.sh
-
[]中的内容会被去掉特殊含义
1.6.9 [^abc] 取反,排除 排除a或b或c的内容,匹配a或b或c以外的内容
1.7 总结
基础正则 Basic RE (BRE) | 含义 | 搭配 |
---|---|---|
^ | 以…开头的行 ^wangc | |
$ | 以…结尾的行 wangc$ | |
^$ | 空行 | 搭配^$ |
. | 任意一个字符 | |
* | 前一个字符连续出现(重复)0次或者0次以上 | |
.* | 所有内容 | 搭配.* |
\ | 转移字符 \n \t | |
[] | 一个整体,匹配任意一个符号[abc],a或b或c | []与 +搭配 |
[^] | 取反排除 | |
贪婪性 | .*或连续出现 |
1.8 扩展正则
扩展正则需要egrep
或者grep -E
符号 | |
---|---|
+ | 前一个字符连续出现了1次或1次以上 |
| | 或者 |
() | 一个整体.sed反向引用 |
{} | 连续出现 o(n,m)前一个字母o至少连续出现n次,至多连续出现m次 |
? | 连续出现 前一个字符出现0次或者1次 |
1.8.1 + 前一个字符连续出现了1次或1次以上
[root@nas01 ~]# grep 'c+' backup.sh
[root@nas01 ~]# grep -E 'c+' backup.sh
user="wc"
[root@nas01 ~]# egrep 'c+' backup.sh
user="wc"
[root@nas01 ~]#
1.8.2 | 或者
[root@nas01 ~]# egrep 'ft|us' backup.sh
ftpserver="192.168.1.2"
user="wc"
ftp -n -v $ftpserver << EOF
user $user $passwd
[root@nas01 ~]#
1.8.3 () 被括起来的内容,表示一个整体(一个字符)反向引用(反向引用sed)
[root@nas01 ~]# egrep 'pa(s|th)' backup.sh
passwd="123456"
Wpath="test"
user $user $passwd
put /opt/1.txt $Wpath/1.txt
1.8.4 {}连续出现 o(n,m)前一个字母o至少连续出现n次,至多连续出现m次
符号 | 含义 | |
---|---|---|
o(n,m) | 前一个字母o至少连续出现n次,至多连续出现m次 | >=n <=m |
o(n) | 前一个字母o连续出现n次 | ==n |
o(n,) | 前一个字母o至少连续出现n次 | >=n |
o(,m) | 前一个字母o最多连续出现m次 | <=m |
1.8.4 ? 连续出现 前一个字符出现0次或者1次
[root@nas01 ~]# cat wc.txt
goooood
good
god
gd
gooood
[root@nas01 ~]# egrep 'go?d' wc.txt
god
gd
[root@nas01 ~]#
2.三剑客
2.1 三剑客特点及应用场景
命令 | 特点 | 场景 |
---|---|---|
grep | 过滤 | grep命令过滤速度是最快的 |
sed | 替换,修改文件内容,取行 | 进行替换,修改文件 取出某个范围的内容(从早上1:00到2:00) |
awk | 取列,统计计算 | 取列 对比,比较 >= <= != < > 统计,计算(awk数组) |
2.2 三剑客之grep
选项 | 含义 |
---|---|
-E | == egrep 支持拓展正则 |
-A | after -A5 匹配你要的内容并且显示接下来的5行 |
-B | before -B5 匹配你要的内容并且显示上面的5行 |
-C | context 上下 -C5 匹配你要的内容并且上下的5行 |
-c | 统计出现了多少行 类似于wc -l |
-v | 取反,排除 |
-w | 精确匹配,加上\b**b\或者\<**\>可以表示边界 |
#特殊写法
[root@nas01 ~]# ps -ef | grep -c '[s]shd'
2
#此方式可以过滤掉grep执行时产生的进程
#执行时为grep '[s]shd'
#匹配的是sshd,故可过滤自身
2.3三剑客之sed
-
sed stream editor 流编辑器,sed把处理的内容或文件当作是水,源源不断的进行处理,知道文件末尾
-
sed格式
命令 参数/选项 功能 sed -r(支持拓展正则) ‘spd#’ -
sed命令核心功能:增删改查
功能 s 替换substitute sub p 显示print d 删除delete cai 增加c/a/i -
sed命令的执行过程
- “找谁干啥”
-
sed核心应用
1)sed-查找p
查找格式 | ||
---|---|---|
‘2p’ | 精确查找 | |
‘1,5p’ | 指定行号范围 | |
‘/内容/p’ | 类似于grep过滤,//里面可以写正则 | |
‘/10:00/,/11:00/p’ | 表示范围的过滤 |
2)sed删除d
查找格式 | ||
---|---|---|
‘2d’ | 删除第三行 | |
‘1,5d’ | 删除指定行号范围 |
案例:删除文件中的空行和包含#好的行
egrep -v '^$|#' /etc/ssh/sshd_config
sed -r '/^$|#/d' /etc/ssh/sshd_config
#!的妙用
[root@nas01 ~]# sed -nr '/^$|#/!p' /etc/ssh/sshd_config
#遇到空行或者#开头的行不显示
3)sed增加cai
命令 | ||
---|---|---|
c | replace替换这一行的内容 | |
a | append追加,向指定的行或每一行最佳内容 | |
i | insert插入,向指定的行或每一行插入内容(行前) |
案例:向config文件追加
UserDNS no
GSSAPIAUTCATION no
PermitRootLogin no
#方法一
cat >>config<<'EOF'
UserDNS no
GSSAPIAUTCATION no
PermitRootLogin no
EOF
#方法二:sed
sed '$a UserDNS no\nGSSAPIAUTCATION no\nPermitRootLogin no' config
4)sed替换s
s–>sub substitute
g–>global全局替换,sed默认替换每行第一个匹配到的内容
替换格式(sg三个无特殊含义的相同字符) |
---|
s###g(例如s#1234#1232#g的含义为将1234替换为1232) |
s@@@g |
s///g |
后向引用.反向引用:先保护(使用小括号保护起来),后引用\n (\n为第几个小括号)
[root@nas01 ~]# echo 123456 |sed -r 's#(.*)#<\1>#g'
<123456>
[root@nas01 ~]# echo 123456 |sed -r 's#([1])#<\1>#g'
<1>23456
[root@nas01 ~]# echo 12a3c45gg6 |sed -r 's#([0-9])#<\1>#g'
<1><2>a<3>c<4><5>gg<6>
2.4 三剑客之awk
- 特点及应用场景
awk | |
---|---|
一门语言 | |
过滤,统计,计算 | |
过滤,统计日志 |
- 执行过程
awk -F,'BEGIN{print "name"}{print $2}END{print "end of file"}' test.txt
- 行与列
名词 | awk中叫法 | 说明 |
---|---|---|
行 | 记录record | 每一行默认通过回车分割 |
列 | 字段.域 field | 每一列通过空格分割 |
awk中行和列结束标记都是可以修改的 |
- 取行
awk | ||
---|---|---|
NR==1 | 取出某一行 | |
NR>=1&&NR<=5 | 取出1到5行 | |
符号 | > < >= <= == != | |
/wangc/ | 匹配关键字的行 | |
/wc/,/LL/ | 从/wc/行到/LL/行 |
- 取列
-F | 指定分隔符 | 指定每一列的结束标记(默认是空格/tab和连续空格) |
---|---|---|
$数字 | 取出某一列 | 注意在awk中$内容 |
$0 | 取整行 | |
{print xxx} | ||
$NF | 表示最后一列 |
[root@nas01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d2f8cf02d19 nginx "/docker-entrypoint.…" 6 days ago Up 6 days 80/tcp determined_moore
[root@nas01 ~]# docker ps -a | awk '{print $1}'
CONTAINER
7d2f8cf02d19
[root@nas01 ~]# docker ps -a |grep 'nginx' | awk '{print $1}'
7d2f8cf02d19
[root@nas01 ~]# docker ps -a | awk '{print $1,$2}' | column -t
CONTAINER ID
7d2f8cf02d19 nginx
column -t 将文本对齐
- 内置变量
NR | Number of Record | 行号 |
---|---|---|
NF | Number of Field | |
FS | -F: === -v FS=: Field Separator字段分隔符,每个字段结束标记 | |
OFS | Output Field Separator 输出字段分隔符 |
[root@nas01 ~]# awk -F: '{print $NF,$2,$3,$1}' /etc/passwd
/bin/bash x 0 root
/sbin/nologin x 1 bin
/sbin/nologin x 2 daemon
/sbin/nologin x 3 adm
/sbin/nologin x 4 lp
/bin/sync x 5 sync
/sbin/shutdown x 6 shutdown
/sbin/halt x 7 halt
/sbin/nologin x 8 mail
/sbin/nologin x 11 operator
/sbin/nologin x 12 games
/sbin/nologin x 14 ftp
/sbin/nologin x 99 nobody
/sbin/nologin x 192 systemd-network
/sbin/nologin x 81 dbus
/sbin/nologin x 999 polkitd
/sbin/nologin x 74 sshd
/sbin/nologin x 89 postfix
/sbin/nologin x 25 named
/sbin/nologin x 38 ntp
[root@nas01 ~]# awk -F: -vOFS=:'{print $NF,$2,$3,$1}' /etc/passwd
^C
[root@nas01 ~]# awk -F: -vOFS=: '{print $NF,$2,$3,$1}' /etc/passwd
/bin/bash:x:0:root
/sbin/nologin:x:1:bin
/sbin/nologin:x:2:daemon
/sbin/nologin:x:3:adm
/sbin/nologin:x:4:lp
/bin/sync:x:5:sync
/sbin/shutdown:x:6:shutdown
/sbin/halt:x:7:halt
/sbin/nologin:x:8:mail
/sbin/nologin:x:11:operator
/sbin/nologin:x:12:games
/sbin/nologin:x:14:ftp
/sbin/nologin:x:99:nobody
/sbin/nologin:x:192:systemd-network
/sbin/nologin:x:81:dbus
/sbin/nologin:x:999:polkitd
/sbin/nologin:x:74:sshd
/sbin/nologin:x:89:postfix
/sbin/nologin:x:25:named
/sbin/nologin:x:38:ntp
- awk模式匹配
- 比较符号:
- 正则
- 范围 表达式
- 特殊条件:BEGAN和END
awk | -F"[ /]+" | 'NR==3{print $3} |
---|---|---|
命令 | 选项 | ‘条件(动作)’ |
‘找谁(干啥)’ | ||
‘模式(动作)’ | ||
‘pattern(action)’ |
正则 | awk正则 |
---|---|
^ 表示以…开头的行 | 某一列的开头 $3~/^wc/ |
$ 表示以…结尾的行 | 某一列的结尾 2 / w c L L 2~/wcLL 2 /wcLL/ |
^$ 表示空行 | 某一列是空的 |
[root@nas01 ~]# cat wc.txt
http://www.wangc.com/index.html
http://dns.wangc.com/i1.html
http://servers.wangc.com/dns.html
http://dns.wangc.com/2.html
http://www.wangc.com/error.html
http://www.wangc.com/i505.html
[root@nas01 ~]# awk -F'[/.]+' '{array[$2]++}END{for(i in array)print i,array[i]}' wc.txt
servers 1
www 3
dns 2
[root@nas01 ~]# awk -F'[/.]+' '{array[$2]++}END{for(i in array)print "域名",i,"次数",array[i]}' wc.txt
域名 servers 次数 1
域名 www 次数 3
域名 dns 次数 2
[root@nas01 ~]# awk -F'[/.]+' '{array[$2]++}END{for(i in array)print "域名",i,"次数",array[i]}' wc.txt | sort -snk4
域名 servers 次数 1
域名 dns 次数 2
域名 www 次数 3
- awk使用多个条件的时候,第一个条件一般使用’条件{动作}',其他条件则使用if语句
awk [options] [BEGIN]{program}[END] [file]
常用命令
-F fs 指定秒回一行数据字段的文件分隔符 默认为空格
-f file
内置变量
$0 表示整行
$1 表示文本行的第一个数据字段
$2 表示第二个数据字段
$N 表示第N个数据字段
$NF 表示文本的最后一个数据字段
NR 指定行号
NR==1