0 随堂测验
# 1.查询etc目录下以ifcfg开头的文件
find /etc/ -name 'ifcfg*'
# 2.将/etc/yum.repos.d/目录下所有的.repo文件备份到/tmp下
find /etc/yum.repos.d/ -name '*.repo' -exec cp /tmp \;
# 3.将/etc/下所有的目录复制到/tmp下
find /etc/ -type d | xargs -I {} cp -r {} /tmp/
# 4.将/etc下所有的普通文件打包压缩到/tmp目录下
tar -zcvf /tmp/etc.tar.gz $(find /etc/ -type f | xargs)
# 5.find命令中的并且和或者
-a
-o
# 6.同上述第4题,将其打包压缩的文件解压至/mnt目录中
tar -xf /tmp/etc.tar.gz -C /mnt/
1 Linux三剑客之grep
# 1.grep命令的作用及使用场景
grep命令一般用来筛选我们需要的数据,过滤内容
# 格式:
grep [参数] [过滤规则] [路径]
标准输出 | grep [参数] [过滤规则]
# 2.grep命令的参数
参数:
-n:显示匹配行及行号 ***
-o:只输出匹配的内容
-q:静默输出 不输出匹配结果
# 一般用在shell脚本中,然后用 echo $? 查看命令执行结果 0:匹配到,非0:未匹配到
-i:忽略大小写 # 只适用于单字符
-c:显示匹配到的行数 # 注意不是匹配到次数
-v:反向查找 # 显示不包含匹配文本的所有行 *****
-w:匹配某个词 # 词:一连串字母和数字组成的字符串
-E:使用扩展正则 # 简写:egrep
-R:递归过滤 # 跟随符号链接 *****
-R, -r, --recursive 递归过滤
-l:只输出匹配到的文件名路径 # 如果匹配成功,只打印文件名 ***
通常-rl一起用,grep -rl 'root' /etc
-L:只输出未匹配到的文件名路径
-s:不显示 不存在或无匹配文本的错误信息
-e:指定匹配规则,可指定多次,实现 or 的效果,# 默认 基本正则模式
可通过在首个 -e 前指定 -E, -G, -F切换正则匹配模式
# grep -E -e "th.{2}" -e "th.{3}" roc.txt
# grep -F -e "^this" -e '^$this' roc.txt
-f: 指定一个文件,可指定多次,里面包含了匹配的规则,一行一个规则
# 相当于把 -e 指定的模式写入了文件
# 也可以指定 -E, -G, -F切换模式
扩展参数:
-A:显示匹配到的数据及后n行
-B:显示匹配到的数据及前n行
-C:显示匹配到的数据及前后n行
# 补充:
$?:代表上一次命令执行是否成功(0代表成功,非0代表失败)
wc-l:打印显示有多少行(统计行)
# 3.grep命令和正则表达式的结合
grep -n '/bin/bash' /etc/passwd
grep 案例
# 0.过滤相关的进程 ******
注:去掉grep color 进程的干扰 将 首字母加[] eg:[n]ginx
ps aux | grep "[n]ginx"
ps aux | grep "nginx" | grep -v grep
# 查看 和 ps aux | grep nginx 的区别,会带着 grep --color==auto nginx 的干扰
# 1.要求过滤出/etc/passwd中包含的root的行及其行号
grep -n "root" /etc/passwd
# 2.要求过滤出/etc/passwd中包含的root的行,只显示过滤到的内容
grep -o "root" /etc/passwd
# 3.要求过滤/etc/passwd中的Root,忽略大小写
grep -i "Root" /etc/passwd
# 4.要求匹配mail及其后两行
grep -n -A 2 "mail" /etc/passwd
# 5.要求匹配mail及其前两行
grep -n -B 2 "mail" /etc/passwd
# 6.要求匹配mail及其前后各两行
grep -n -C 2 "mail" /etc/passwd
# 7.要求显示包含root的行有多少行
grep -c "root" /etc/passwd
# 8.要求查询不包含root的行
grep -v "root" /etc/passwd
# 9.匹配tian这个词
cat 1.txt
befggfnb
vtiandsgrt
tiandfbx
tiantian
hetiantian
tiantianhe
2353475
546554
tian
grep -w "tian" 1.txt
tian
# 10.要求匹配出包含tian的行
grep "yang" 1.txt
或者
grep -E "(tian)+" 1.txt
vtiandsgrt
tiandfbx
tiantian
hetiantian
tiantianhe
tian
# 11.要求找出/etc目录下,那些文件中包含root
grep -R "root" /etc
# R:递归查询
# l:只打印文件路径
grep -Rl "root" /etc/
# 12.静默输出
grep -q "root" /etc/passwd
echo $?
# 13.计算/etc目录下包含root的文件有多少个?
grep -R -l "root" /etc | wc -l
# 14.查询/etc/passwd文件中包含/bin/bash的行并输出行号
grep -n "/bin/bash" /etc/passwd
# 15.过滤出当前主机包含的IP
ip a | grep -o -E "([0-9]{1,3}\.){3}([0-9]){1,3}"
127.0.0.1
192.168.15.110
192.168.15.255
172.22.0.110
172.22.15.255
2 正则表达式
# 正则表达式是通过包含特殊含义的一些字符去适配各种匹配场景,从而匹配出我们想要的结果。
# 正则表达式是为处理大量的字符串及文本而定义的一套规则和方法。
1.普通正则表达式
* 匹配前一个字符(连续出现)0或者1次以上
. 点号,表示匹配任意一个且只有一个字符 # 但是不能匹配换行符
^ 尖角号,用法为^oldboy.表示匹配以oldboy单词开头的行
$ 美元符,用法为oldboy$,表示匹配以oldboy单词结尾的行
\ 转义字符,让有特殊含义的字符脱掉马甲,现出原形,如\.只表示小数点
[] 或者(其中包含的所有的字符的或者)
[^] 取反
[A-Z] 匹配[]内任意一个字符,A-Z中的任意一个
[a-z] 匹配[]内任意一个字符,a-z中的任意一个
[0-9] 匹配[]内任意一个字符,0-9中的任意一个
[^abc] 匹配不包含^后的任意字符,这里的^表示对[abc]取反
# 组合:
.* 组合符,匹配所有的内容
^.* 组合符,匹配以任意多个字符开头的内容
^$ 组合符,表示空行,逻辑解释就是以^结尾的行,或以$开头的行
.*$ 组合符,以任意多个字符结尾的内容
普通正则案例
# 1.匹配包含22的行
grep "22.*" 1.txt
grep "222*" 1.txt
# 2.以3结尾的行
grep "3$" 1.txt
# 3.要求输出包含eth的行
grep "eth." 2.txt
/etc/sysconfig/network-scripts/ifcfg-eth1
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfgg-eth0
# 4.以1开头的行
grep "^1" 1.txt
1223344
1234
1222444
122222
12222446
# 5.要求打印出/etc/nginx/nginx.conf中的不是以#开头的行
grep "^[^#]" /etc/nginx/nginx.conf
# 不以#开头,且不以空格开头的行
grep '^[^# ]' /etc/nginx/nginx.conf
# 6.要求匹配出2后面有任意数量的任意字符
grep "2.*" 1.txt
# 7.要求匹配出本机中所有的普通用户
grep ":[0-9][0-9][0-9][0-9]" /etc/passwd
test04:x:1001:1001::/home/test04:/bin/bash
test:x:1002:1002::/home/test:/bin/bash
test01:x:1003:1003::/home/test01:/bin/bash
egrep ":[0-9]{4}" /etc/passwd
2.拓展正则表达式
# egrep 等价于 grep -E
+ 匹配前一个字符1次或1次以上
? 匹配前一个字符0次或1次
| 表示或者,即同时过滤多个字符串(竖线两边的字符的或者)
() 分组,组成一个整体,另外()的内容可以被后面的\n引用,n为数字,代表引用第几个括号的内容
\n n代表的是前面第几个分组 引用前面()分组里的模式,
{m,n} 匹配前一个字符最少m次,最多n次
{m} 匹配前一个字符m次
{m,} 匹配前一个字符最少m次
{,n} 匹配前一个字符最多n次
拓展正则案例
# 1.匹配一个或多个2
egrep "2+" 1.txt
egrep "22*" 1.txt
egrep "2{1,}" 1.txt
# 2.查询出3个2
egrep "2{3}" 1.txt
# 3.查询出包含 22 或者 33 的行
egrep "22|33" 1.txt
# 4.匹配出包含12341234的行
grep -E "(1234)\1" 1.txt
grep -E "(1234){2}" 1.txt
grep "12341234" 1.txt
egrep "(1234)(1234)" 1.txt
# 5.要求匹配出包含1234abcd1234abcd的行
grep "1234abcd1234abcd" 1.txt
grep -E "(1234)(abcd)\1\2" 1.txt
# 6.过滤出当前系统IP
ip a |grep -o -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
127.0.0.1
192.168.15.110
192.168.15.255
172.22.0.110
172.22.15.255
# 7.过滤出手机号
echo "15516134567" | grep -E "(155|187|136|166|177|138|137|188)[0-9]{8}$"
15516134567
egrep '^1[0-9]{10}$' 1.txt
# 8.过滤出邮箱
echo "12345@qq.com" | grep -E "[0-9a-zA-Z]+@[0-9a-z]+(\.com|\.com\.cn|\.edu|\.edu\.cn|\.top)"
12345@qq.com