shell学习总结2

本文详细介绍了正则表达式的各种元字符及其功能,包括基本元字符如^、$、.、*等,以及扩展元字符如+、?、|等,并通过实例展示了它们在匹配和查找字符串中的应用。同时,文章还涵盖了Shell中grep命令的用法,如行首行尾定位、贪婪与非贪婪匹配、字符范围选择等,以及sed和awk的使用,包括内容替换、分隔符设置、循环和条件判断等操作。这些知识对于日常文本处理和数据筛选至关重要。
摘要由CSDN通过智能技术生成

正则表达式

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 ~]# num1=1 
1、运用正则,判断需要[[ ]] 
[root@cosion ~]# [[ $num1 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
[root@cosion ~]# num3=1b1 
[root@cosion ~]# [[ $num3 =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
no
[root@cosion ~]# [[ $num =~ ^[0-9]+\.[0-9]+$ || $num =~ ^[0-9]+$ ]] && echo "yes" || echo "no"       //输入的只能是数字(包括小数)

2、* 0或多个
[root@cosion ~]# useradd abrt 
[root@cosion ~]# grep 'abc*' /etc/passwd 
abrt:x:1041:1041::/home/abrt:/bin/bash

3、\< 词首定位符号 \>词尾定位符号 
[root@cosion ~]# grep '\<jack' a.txt 
jack
[root@cosion ~]# grep '123\>' a.txt 
dskjfaklas123

4、^以什么开头
[root@cosion ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

5、$以什么结尾
[root@cosion ~]# grep 'bash$' /etc/passwd
Confluence:/home/confluence:/bin/bash 
to:x:1003:1003::/home/to:/bin/bash

6、. 匹配单个字符
[root@cosion ~]# grep 'r..t' /etc/passwd 
dockerroot:x:998:995:Docker 
[root@cosion ~]# grep 'r.t' /etc/passwd 
operator:x:11:0:operator:/root:/sbin/nologin 
sshd:x:74:74:Privilege-separated 

7、.* 任意多个字符
[root@cosion ~]# grep 'r.*t' /etc/passwd 
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 ~]# grep 'Root' /etc/passwd
[root@cosion ~]# grep '[Rr]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 

9、[ - ] 匹配指定范围内的一个字符
[root@cosion ~]# grep [a-z]oot /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 

10、[^] 匹配不在指定组内的字符,取反得意思
[root@cosion ~]# grep '[^0-9]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin

[root@cosion ~]# grep '[^0-9A-Z]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
[root@cosion ~]# grep '[^0-9A-Za-z]oot' /etc/passwd
[root@cosion ~]#
[root@cosion ~]# useradd Root
[root@cosion ~]# grep '[a-z]oot' /etc/passwd      
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker 
[root@cosion ~]# grep '^[rc]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
^在[]内表示取反,^在[]外表示以什么开头

11、\(\)匹配后的标签
[root@cosion ~]# cat file1.txt 
IPADDR=192.168.1.123 
GATEWAY=192.168.1.1 
NETMASK=255.255.255.0 
DNS=114.114.114.114
:% s#\(192.168.1.\)123#\12#
:% s#\(192.\)\(168.\)\(1.\)2#\1\2\35#
:% s\(192.\)\(168.\)\(1.\)\(5\)#\1\26.\4#

11、+ 匹配一个或多个前导字符
[root@cosion ~]# egrep 'ro+t' /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
12、? 匹配零个或一个前导字符
[root@cosion ~]# egrep 'ro?t' /etc/passwd 
abrt:x:1041:1041::/home/abrt:/bin/bash

13、a|b    匹配a或b
[root@cosion ~]# netstat -anlp|egrep ':80|:22'
[root@cosion ~]# egrep 'root|alice' 
/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 ~]# cat a.txt
love
love.
loove
looooove 
[root@cosion ~]# egrep 'o{2}' a.txt
loove
looooove 
[root@cosion ~]# egrep 'o{2,}' a.txt
loove
looooove 
[root@cosion ~]# egrep 'o{6,7}' a.txt

shell中的sed

s/MA/Massachusetts/ 
#前面两个斜杠中是要匹配的内容,可以使用正则,后面两个斜杠中间,是要替换的内容,是纯文本

1. sed可以从stdin中读取内容
cat filename | sed 's/pattern/replace_string/' 
[root@cosion ~]# cat test.txt | sed 's/root/ROOT/'
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 ~]# echo "thisthisthisthis" | sed 's/this/THIS/2g'
   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  # 在匹配到开头为bin的行下一行插入内容
sed '/^bin/i\hello nihao/' passwd  # 在匹配到开头为bin的行上一行插入内容

shell中的awk

awk 'BEGIN{FS=":"} {print $1}' /etc/passwd 	#FS(输入字段分隔符)     

awk 'BEGIN{FS=":";OFS=".."} {print $1,$2}' 	/etc/passwd 	#OFS(输出字段分隔符)   

awk -F: '{print NR,$0}' a.txt file1.txt 
#NR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号

awk -F: '{print FNR,$0}' a.txt file1.txt
#FNR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号(不同文件分开) 

awk -F: 'BEGIN{RS="bash"} {print $0}' passwd	#RS(输入记录分隔符)

awk -F: 'BEGIN{ORS=" "} {print $0}' passwd	#ORS(输出记录分隔符)

awk 'BEGIN{ORS="" } {print $0}' /etc/passwd		#将文件合并为一行

awk 'BEGIN{RS=":"} {print $0}' d.txt 	把一行内容分为多行


1. 打印一个文件中的第2列和第3列 
awk '{ print $2, $3}' filename`
[root@cosion ~]# awk '{ print $2,$3 }' gz.txt 
李梅 女
陈霞 女
程亮 男
刘辉 男

2. 打印指定行指定列的某个字符
awk -F":" 'NR==3{ print $7 }' /etc/passwd`
[root@cosion ~]# awk -F":" 'NR==3{print $7}' /etc/passwd
/sbin/nologin

3. 统计一个文件的行数
awk '{ print NR}' filename` | wc -l
[root@cosion ~]# awk '{print NR}' /etc/passwd |wc -l
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 ~]# awk -F: '{for(i=1;i<=2;i++) {print $0}}' passwd 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
分别打印每行每列
[root@cosion ~]# awk -F: '{ for(i=1;i<=NF;i++) {print $i}}' passwd
 
8. 在awk中使用if条件判断 
显示管理员用户名
[root@cosion ~]# awk -F: '{if($3==0) {print $1 " is administrator."}}' /etc/passwd
统计系统用户
[root@cosion ~]# awk -F":" '{if($3>0 && $3<1000){i++}} END{print i}' /etc/passwd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cionsi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值