shell正则表达式
- 正则表达式是用来匹配文本的内容,命令的输出结果也属于文本内容。也可以使用正则表达式
- 通配符用来匹配文件名和目录名。
一. 正则表达式的格式
按照一定的格式和符号来匹配文件内容(命令输出的结果)
1.1 基本正则表达式
使用正则表达式,匹配内容最好是用引号引起来。
grep
用来过滤文本内容,以匹配要查询的结果。
- grep -m 数字:匹配几次后停止
- grep -m 1 root /etc/passwd #查找包含root的行
- -v 取反
- -i 忽略字符的大小写,默认的,可以不加
- -n 显示匹配行号
- -c 统计匹配的行数
- -o 仅显示匹配到的字符串
- -q 静默模式
- -A 数字:after 包含匹配到的行,以及后几行。
- -B 数字:包含匹配到的行,以及前几行
- -C 数字:包含匹配到的行,以及前后各几行
- -w 匹配整个单词
- -E 使用扩展正则表达式 egrep=grep -E
- -f 匹配两个文件中的相同内容,以第一个文件的内容为准
- -r 递归目录,查找文件内容,软连接的内容不包含
- -R 递归目录,查找文件内容,软连接的内容包含
元字符
- . :任意单个字符
- \ :表示转义符,
- [a-z]:匹配文件内容的任意单个小写字母
- [A-Z]:匹配文件内容的任意单个大写字母
- [0-9]:匹配文件内容的任意单个数字
- [[:black:]] 空白字符,空格
表示次数
-
- 任意字符,表示匹配前面的任意字符,0次,尽可能多的匹配
- .* 匹配任意长度的字符,最少要有一次。也就是匹配所有
- ? 匹配前面的字符0次或者1次,可有可无
- + 匹配前面的字符,最少出现1次有且 >=1
- {n} 匹配前面的字符等于多少次{m,n} 匹配前面的字符至少m次,至多n次
- {,n}匹配前面的字符最多n次,<=n
- {n,}匹配前面的字符最少n次,>=n
root@u3:/opt# ifconfig ens33 | grep "inet" | grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
inet 192.168.246.8 netmask 255.255.255.0 broadcast 192.168.246.25
位置锚定
已什么开始 ^
已什么结尾 $
空行 ^$
匹配整个单词,且这一行只有这个单词 ^root$
词首锚定 \b
词尾锚定 \b
分组
()
root@u3:/opt# echo abcabcabc | grep "\(abc\)\{3\}"
abcabcabc
逻辑条件
或:|
root@u3:/opt# echo 1abc2abc | grep "\(1\|2\)abc"
1abc2abc
1.2 扩展正则表达式
grep -E=egrep
sed -r
表示次数
-
- 任意字符,表示匹配前面的任意字符,0次,尽可能多的匹配
- .* 匹配任意长度的字符,最少要有一次。也就是匹配所有
- ? 匹配前面的字符0次或者1次,可有可无
-
- 匹配前面的字符,最少出现1次有且 >=1
- {n} 匹配前面的字符等于多少次{m,n} 匹配前面的字符至少m次,至多n次
- {,n}匹配前面的字符最多n次,<=n
- {n,}匹配前面的字符最少n次,>=n
二. 其它文本处理工具
sort
按行对文件的内容进行排序,也可以根据不同的数据类型进行排序
sort 选项 文件名
cat 文件名 | sort 选项
-f:忽略大小写
-b:忽略每行前面的空格
-n:按照数字进行排序
-u:去重,相同的数据仅显示一行
-o:输出的文件名:把sort排序后的结果,输出到指定的文件
uniq
去重,用于统计或者忽略文件中连续出现的重复行,一般和sort结合使用
uniq 选项 文件名
cat 文件名 | uniq 选项
-c 统计连续重复的行的次数。并且合并重复的行
-u 显示仅出现一次的行(包括不连续的重复行)
-d 仅显示重复出现的行(必须是连续的重复行)
root@u3:/opt# vim 1.txt
123
456
456
789
000
000
123
root@u3:/opt# uniq -c 1.txt
1 123
2 456
1 789
2 000
1 123
root@u3:/opt# uniq -u 1.txt
123
789
123
root@u3:/opt# uniq -d 1.txt
456
000
tr
用来对标准输入的字符串进行替换,压缩和删除
tr 选项 参数
echo “字符串” | tr 选项
-c 保留字符集1的字符,用其他字符来替换字符集2
-d 删除属于字符集1的字符
-s 将重复出现的字符串压缩成一个,用字符集2 替换 字符集1
-t 替换字符集 可以不加
root@u3:/opt# echo 123456 | tr -c '1234' '9'
1234999
root@u3:/opt# echo 123456 | tr -d '123'
456
root@u3:/opt# vim 1.txt
123
456
456
789
000
000
123
root@u3:/opt# cat 1.txt | tr -s '\n'
123
456
456
789
000
000
123
root@u3:/opt# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
root@u3:/opt# echo $PATH | tr -s ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
cut
截取,对字段进行截取和裁剪
cut 选项 参数
cat 文件名 | cut 选项
-d 指定分隔符(默认分隔符是tab)
-f 指定要截取的字段
-b 指定要截取的字段
-c 以字符的单位进行截取
-complement 排除指定的字段
-output-delimiter 更改输入内容的分隔符
root@u3:/opt# cut -d ':' -f 1-3 /etc/passwd #1-3表示1到3列;1,3表示第一列和第三列
root:x:0
daemon:x:1
bin:x:2
sys:x:3
sync:x:4
games:x:5
man:x:6
lp:x:7
mail:x:8
root@u3:/opt# head -n 2 /etc/passwd | cut -d ':' --complement -f 2
root:0:0:root:/root:/bin/bash
daemon:1:1:daemon:/usr/sbin:/usr/sbin/nologin
root@u3:/opt# head -n 2 /etc/passwd | cut -d ':' -f 1-5 --output-delimiter='@'
root@x@0@0@root
daemon@x@1@1@daemon
文件合并的方法
- cat 1 2 > 3 上下合并
- paste 1 2 > 4 左右合并
root@u3:/opt# cat 1.txt 2.txt > 3.txt
root@u3:/opt# cat 3.txt
123
456
789
000
000
000
root@u3:/opt# paste 1.txt 2.txt > 4.txt
root@u3:/opt# cat 4.txt
123 000
456 000
789 000
分件拆分
split
-l 按行分割
-b 按文件大小分割
统计当前主机的连接状态
- netstat -antp
- ss -antp
root@u3:/opt# ss -antp | grep -v '^State' |cut -d ' ' -f 1 | sort | uniq -c
1 ESTAB
33 LISTEN
统计nginx的访问日志当中多次出现的ip地址
cat /var/log/nginx/access.log | cut -d " " -f 1 | sort | uniq -c