目录
正则表达式
sh
# 支持扩展正则表达式,即o{3}表示匹配3个字母"o"。
grep -E "o{3}" /etc/passwd
# 指定使用Perl兼容的正则表达式,即\s表示匹配一个空格。
grep -P "\s" /etc/passwd
# \d表示匹配一个数字字符
grep -P "\d" /etc/passwd
================================================================================
#格式
grep {^{内容}} {文件路径}
# 基本元字符
================================================================================
# 行首定位符
^{内容}
# 行尾定位符
{内容}$
# 点可以表示一个字符
{a.b} 可以匹配到 abc
# 前导字符 零到多次 这里是就是匹配a 零次 或者多次
{a*b} 可以匹配到 abc
# 中间任意字符
{a.*b}
# 按照范围去匹配
[afl]o ao fo lo
# 匹配到一个字符 这个字符是小写字母 或者 数字
[a-z0-9]
# 匹配到多个字符 这个字母是大写字符
[A-Z]
# 匹配到五个大写字母
[A-Z]{5}
# 尖号 在这里是取反的意思
[^afl]o
# 词首定位符
\<
\<love
# 词尾定位符
\>
love\>
拓展元字符
sh
grep -E | egrep 两个命令都支持扩展元字符
# 匹配一个任意字符
.
# 匹配 零个或多个前导字符
*
# 匹配多个任意字符
.*
egrep r.*t /etc/passwd
# 匹配一个 或者多个签到多个
?
egrep va? /etc/passwd
# 匹配两个关键词
|
egrep 'root|bash' /etc/passwd
# 过滤组合
egrep a(b|c|d)
只能过滤出来 ab ac ad
# 过滤某个字符串重复 次数
egrep o{2} /etc/passwd
# 过滤某个字符串重复 次数
x{m,n} 字符x重复m到n次
# 字符次数控制
x{m} 字符x重复m次
o{5}
o{,3} 字符最多出现3次
x{m,} 字符x重复至少m次
o{5,} 字符最少出现5次
# -v可以取反
grep -v "\<[A-Z]" a.tx
正则判断数据类型
shell
= {等于} != {不等于} =~ {匹配}
注意 在脚本中判断某个便令的样式哈
read -p"请输入:" get_var
if [[ $get_var =~ ^[0-9]+$ ]]; then
echo "变量是数字"
else
echo "变量不是数字"
fi
# 判断一个数字
^[0-9]+$
# 判断一个浮点数
^[0-9]+\.[0-9]+$
# 匹配数字个数 为11位
^[0-9]{11}$
# 匹配一个域名
^[a-z0-9]+$\.[a-z]$
====================================================================================
# 判断一个数字是不是11位
num=1234567890
if [[ $num =~ ^[0-9]{11}$ ]]; then
echo "变量是手机号码"
else
echo "变量不是手机号码"
fi
====================================================================================
# 判断是不是一个域名
num=123dfs45.con:155
if [[ $num =~ ^[a-z0-9]+\.[a-z]+:[0-9]+$ ]]; then
echo "yes"
else
echo "no"
fi
递归查找文件内容
sh
# -r 选项表示递归搜索 可以返回 文件路径和内容
grep -r 'root' /etc/
# -o 选项表示只输出匹配行的内容,即不包含文件名和行号
grep -r -o 'root' /etc/
# 把正则符号当作 字符串查询
grep -F '.*' /etc/
## ps 查找进程的 取消grep 取反
## 这样的作用是 在使用grep 查询某个进程的时候 可以 不看到grep 这个进程
ps aux | grep ssh | grep -v "grep"
sed 的使用
在工作环境中不要对 passwd 文件进行操作
此处仅仅作为一个演示
sh
# -i可以对文件直接替换(-i 一定会替换)
sed -i "s/root/ROOT/g" /etc/passwd
# -r 是扩展元字符
sed -r "s/root/p" /etc/passwd
# -n 加上之后,只显示 查找的内容
sed -n "/root/p" /etc/passwd
# 对root 进行替换
sed "s/root/ROOT/g" /etc/passwd
# /root/d 删除带有root 的行
sed '/root/d' /etc/passwd
# 把带有root 的行 复制打印
sed '/root/p' /etc/passwd
# -n 会只输出 带有root 的行
sed -n '/root/p' /etc/passwd
# 对内容继续替换
sed "s/root/ROOT/g" /etc/passwd
================================================================================
# 对文件进行替换
## 永久关闭selinux
sed -r -i 's/^SELINUX=[a-z]+/SELINUX=disabled/' /etc/selinux/config
===============================================================================
'5d' 删除某行
'5p' 复制某行 带上参数 -n 可以只打印某几行
'^' 可以替换为一个内容 后边加上一个/n 就可以作为一个第一个行来用了
passwd 是一个复制过来的文件
# 删除 某行
## 删除 第五行
sed "5d" passwd
# 删除 一到五行
sed "1,5d" passwd
# 删除 1 3 5 行
sed "1d;3d;5d" passwd
# 删除奇数行
sed "1~2d" passwd
# 删除偶数数行
sed "2~2d" passwd
===============================================================================
## 在某个内容 追加
i 是在上边插入 a 是在 后边追加
sed "/\[mysqld\]/a\innodb_buffer-pol_size = 128 M" /etc/my.cnf
\[mysqld\] 在[mysqld] 内容后追加
/a 是在下边追加
# 在某行下边添加
sed '8a hahaha' passwd
# 在某行上边添加
sed '10i lalala' passwd
# 删除 注释和空行
sed -r '/#/d ; /^$/d' {文件路径}
# 把10行以后的末尾加上cloud:
sed '10,$ s/$/cloud/' passwd
## 10,$ 表示 10行到最后
## s/$/cloud/ 表示把行尾替换为 cloud
# 显示包含oo字符串的行到包含gin字符串的行:
sed -n '/oo/,/gin/p' passwd
# 在文件第一行添加 11111 1s表示对第一行 进行操作。
sed '1s/^/11111\n/' passwd
# 删除10到20行最后一个字符:
sed -i '10,20s/.$//' passwd
# 打印第10 行到结尾
sed -i '10,$p' passwd