正则表达式
1、基本元字符
基本正则表达式元字符
元字符
示例 功能
^love ^ :行首定位符
love$ $ :行尾定位符
l..e . : 匹配单个字符
ab*love * : 匹配前导符0到多次
[lL]ove [] : 匹配方括号中任意一个字符
[a-z0-9]ove [ - ] :匹配指定范围内的一个字符
[^a-z0-9]ove [^] : 匹配不在指定组里的字符
love\. \ : 用来转义元字符
\<love \< :词首定位符
love\> \> : 词尾定位符
\(\) 匹配后的标签
ro.* .* :匹配任意多个字符 (贪婪匹配
to.*? .*? :非贪婪匹配
2、扩展元字符
= 等于 != 不等于 =~ 匹配
扩展正则表达式元字符
[a-z]+ove + :匹配一个或多个前导字符
lo?ve ? :匹配零个或一个前导字符
love|hate a|b :匹配a或b
love(able|rs) () :组字符loveable|rs
(love)able\1er (..)(..)\1\2 标签匹配字符
x{m} 字符x重复m次
o{5}
x{m,} 字符x重复至少m次
o{5,}
x{m,n} 字符x重复m到n次
o{5,10}
shell中grep
[root@cosion ~]
1、运用正则,判断需要[[ ]]
[root@cosion ~]
yes
[root@cosion ~]
[root@cosion ~]
no
[root@cosion ~]
2、* 0或多个
[root@cosion ~]
[root@cosion ~]
abrt:x:1041:1041::/home/abrt:/bin/bash
3、\< 词首定位符号 \>词尾定位符号
[root@cosion ~]
jack
[root@cosion ~]
dskjfaklas123
4、^以什么开头
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
5、$以什么结尾
[root@cosion ~]
Confluence:/home/confluence:/bin/bash
to:x:1003:1003::/home/to:/bin/bash
6、. 匹配单个字符
[root@cosion ~]
dockerroot:x:998:995:Docker
[root@cosion ~]
operator:x:11:0:operator:/root:/sbin/nologin
sshd:x:74:74:Privilege-separated
7、.* 任意多个字符
[root@cosion ~]
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network
sshd:x:74:74:Privilege-separated
8、[] 匹配方括号中的任意一个字符
[root@cosion ~]
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
9、[ - ] 匹配指定范围内的一个字符
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
10、[^] 匹配不在指定组内的字符,取反得意思
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@cosion ~]
[root@cosion ~]
[root@cosion ~]
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
^在[]内表示取反,^在[]外表示以什么开头
11、\(\)匹配后的标签
[root@cosion ~]
IPADDR=192.168.1.123
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
DNS=114.114.114.114
:% s
:% s
:% s\(192.\)\(168.\)\(1.\)\(5\)
11、+ 匹配一个或多个前导字符
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
12、? 匹配零个或一个前导字符
[root@cosion ~]
abrt:x:1041:1041::/home/abrt:/bin/bash
13、a|b 匹配a或b
[root@cosion ~]
[root@cosion ~]
/etc/passwd root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
14、x{m} 字符x重复m次
[root@cosion ~]
love
love.
loove
looooove
[root@cosion ~]
loove
looooove
[root@cosion ~]
loove
looooove
[root@cosion ~]
shell中的sed
s/MA/Massachusetts/
1. sed可以从stdin中读取内容
cat filename | sed 's/pattern/replace_string/'
[root@cosion ~]
ROOT:x:0:0:root:/root:/bin/bash
2. 选项 -i 会使得sed用修改后的数据替换原文件
sed -i 's/pattern/replace_string/' filename
3. g标记可以使sed执行全局替换
sed s/pattern/replace_string/g filename
sed s/pattern/replace_string/g -i filename //忽略大小写替换
4. g标记可以使sed匹配第N次以后的字符被替换
echo "thisthisthisthis" | sed 's/this/THIS/2g'
[root@cosion ~]
thisTHISTHISTHIS
5. sed中的分隔符可以替换成别的字符, 因为s标识会认为后面的字符为分隔符
sed 's:text:replace_text:
sed 's|text|replace_text|
6. sed可以利用指令来删除文件中的空行
sed '/^$/d' filename
7. 由于在使用 -i 参数时比较危险, 所以我们在使用i参数时在后面加上.bak就会产生一个备份的文件,以防后悔
sed -i.bak 's/pattern/replace_string/' filename
8. sed如果在脚本中使用的话, 不可避免的要调用变量, 所以以下这种方式可以用来调用变量即' '换成了" "
text=hello
echo "hello world" | sed "s/$text/HELLO/"
9. 在文件中匹配到的部分前后加上一行
sed '/^bin/a\hello nihao/' passwd
sed '/^bin/i\hello nihao/' passwd
shell中的awk
awk 'BEGIN{FS=":"} {print $1}' /etc/passwd
awk 'BEGIN{FS=":";OFS=".."} {print $1,$2}' /etc/passwd
awk -F: '{print NR,$0}' a.txt file1.txt
awk -F: '{print FNR,$0}' a.txt file1.txt
awk -F: 'BEGIN{RS="bash"} {print $0}' passwd
awk -F: 'BEGIN{ORS=" "} {print $0}' passwd
awk 'BEGIN{ORS="" } {print $0}' /etc/passwd
awk 'BEGIN{RS=":"} {print $0}' d.txt 把一行内容分为多行
1. 打印一个文件中的第2列和第3列
awk '{ print $2, $3}' filename`
[root@cosion ~]
李梅 女
陈霞 女
程亮 男
刘辉 男
2. 打印指定行指定列的某个字符
awk -F":" 'NR==3{ print $7 }' /etc/passwd`
[root@cosion ~]
/sbin/nologin
3. 统计一个文件的行数
awk '{ print NR}' filename` | wc -l
[root@cosion ~]
19
4. 在脚本中, 传递变量到awk中
$ var=1000
$ echo | awk -v VARIABLE=$var '{ print VARIABLE }'
6. 指定字段分隔符-F或在BEGIN{ FS=":" }
awk -F: '{ print $2, $3 }' filename
awk 'BEGIN{ FS=":" }{ print $2, $3 }' filename
7. 在awk中使用for循环
每行打印两次
[root@cosion ~]
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
分别打印每行每列
[root@cosion ~]
8. 在awk中使用if条件判断
显示管理员用户名
[root@cosion ~]
统计系统用户
[root@cosion ~]