Linux 正则表达式

正则表达式(过滤内容)三剑客 sed,grep,awk与通配符(需注意中文与英文符号的区别EXECL里面与Linux命令行显示不一样)
'  '     #单引号,所见即所得
例如1:# echo 'redhat $LANG $(hostname) {1..5}'
redhat $LANG $(hostname) {1..5}

 

#不加引号,和双引号类似 支持通配符 {} *:通配符的作用方便于找出文件,大部分命令可以使用
"" #双引号,里面的特殊符号会被解析 运行
例如2:# echo "redhat $LANG $(hostname) {1..5}"
redhat zh_CN.UTF-8 libin3.com {1..5}

 

基础正则表达示式:^ $ . * [] [^]
(1)^ #以什么开头
# grep '^root' /etc/passwd
(2)$ #以什么结尾
# grep 'b$' /var/log/messages
(3)^$ #空行 什么符号都没有,cat -A

grep -n '^$' /tmp/rhcsa/redhat.txt #-n:显示行号
grep -vn '^$' /tmp/rhcsa/redhat.txt #-v:取反 -vn:取反空行

sed -n '/^$/!p' redhat.txt #p:显示,!p不显示;-n取消默认输出,与p一起使用
sed '/^$/d' redhat.txt #d:删除空行

awk '!/^$/' redhat.txt   #!:取反,不要空行显示内容


  (4). #任意一个字符,一次找一个,不会匹配空行
# grep -o '.' redhat.txt # -o:显示grep执行过程,显示每次匹配了什么
# grep -o '......' redhat.txt #......:表示一次匹配6个字符
(5)\ #\ :转义字符,恢复原型;表示只显示以.结尾的行
# grep '\.$' redhat.txt
(6)* #任何字符,包含空行
# grep '.*' redhat.txt #会把文件所有内容都显示
(7).* #.*:任何任一一个字符
# grep '^.*s' redhat.txt #以何任一一个字符开头并包含s的行
(8)!ls #表示最近以ls开头的命令
(9)[] # [abc]相当于是一个符号(每次匹配1个字符)找出包含a或者b或者c
# grep '[a-zA-Z]' /tmp/rhcsa/redhat
# grep '[a-Z]' /tmp/rhcsa/redhat.txt
# grep '[A-Z]' /tmp/rhcsa/redhat.txt
# grep '[0-9]' /tmp/rhcsa/redhat.txt
(10)[^] [^abc] #相当于是一个符号(每次匹配1个字符)找出除了a或者b或除了c
# grep '^[mn].*[!.]$' /tmp/rhcsa/redhat.txt #找出一个文件中以.' /tmp/rhcsa/redhat或.结尾的行
# sed -n '/^[mn].*[!.]&/p' /tmp/rhcsa/redhat.txt
# awk '/^[mn].*[!.]$/' /tmp/rhcsa/redhat.txt
(11)sort #排序
# sort -n # -n:对数字从小到大进行排序,并且能识别数字大小
# sort -nk1 #-k:根据某1列进行排序 ,k1表示第一列
# sort -rnk1 #-r:对数字从大到小进行排序

(12)uniq #合并相邻的 相同的行 去重先sort 再使用uniq
# uniq -c #-c:显示重复了几次

扩展正则表达式:| + () {} ?
(1)+ #前一个字符连续出现1次或1次以上,要配套 grep -E,也与[]一起使用
# grep -E 'r+' /tmp/rhcsa/redhat.txt #表示r连续出现的每一行
# egrep -o '[a-Z]+' /tmp/rhcsa/redhat.txt
# egrep -o '[a-Z]' /tmp/rhcsa/redhat.txt #加上+,表示一次出现一个单词,不加表示一次出现一个字母
# awk '/[a-zA-Z]+/' /tmp/rhcsa/redhat.txt #因为a-Z ,awk不能识别
# sed -nr '/[a-Z]+/p' /tmp/rhcsa/redhat.txt | sort -n

(2)| #排除文件中的#和空行
# egrep 'redhat|redhat' /tmp/rhcsa/redhat.txt
(3)() #小括号,表示一个整体 反向引用/后向引用

(4)[] #中括号,与+,前一个字符连续出现1次或1次以上

(5){} #大括号 花括号
# 0{n,m} 前一个字符至少连续出现n次,最多连续出现了m次
# a{n}前一个数字连续出现n次
# a{n,}前一个数字连续出现至少n次
# a{,m}前一个数字连续出现最多m次
# egrep -o '0{1,3}' /tmp/rhcsa/redhat.txt
# egrep '[0-9]{17}[0-9X]' /tmp/rhcsa/redhat.txt

(6)? #前一个字符连续出现0次或1次
# egrep 'r?t' /tmp/rhcsa/redhat.txt

(7)<<>>
# sed -r 's#(.*)#<<\1>>#g' libin.txt
# sed -r 's#(.)#<<\1>>#g' libin.txt
# sed -r 's#([0-9])#<<\1>>#g' libin.txt

grep:过滤
-c:统计行数
-n:显示行号
-o:显示每一步过程
-i:不区分大小写
-w:根据单词 进行过滤
-v:取反 # ps -ef | grep crond | grep -v grep | wc -l
-A:过滤出想要的内容及接下来的几行
-E(egrep):前一个字符连续出现1次或1次以上时

sed:过滤、取行、替换、修改文件内容
# -r:在脚本中使用扩展正则表达式
#ip a s eth0 | sed -n '3p' #-n:取出eth0网卡的第三行
# ip a s eth0 | awk 'NR==3'
#-i:修改文件的内容
#-i.bak:命令会先备份
# sed -r 's#(^.*)(:x.*:)(.*$)#\3\2\1#g' /etc/passwd #调换/etc/passwd 第1列和最后1列的内容(不修改文件内容)
# awk -F":" -v OFS=: '{ print $NF,$2,$3,$4,$5,$6,$1}' /etc/passwd
#OSF 控制每一列之间分隔符 默认 空格

awk:切割、过滤、取列、计算统计分析
-F(FS):以什么为切割
-v:修改awk内置变量
-NR,OFS:(NR 记录号,行号 ;OFS 输出分隔符,每一列通过什么分割)

# ip a s eth0 | awk 'NR==3' | awk -F"[ /]" '{print $6}' #把ip地址切割出来
# ip a s eth0 | awk 'NR==3' | awk -F"[ /]+" '{print $3}'#把ip地址切割出来,+表示将[ /]里面空行给叠加在一块
# ip a s eth0 |awk -F"[ /]+" 'NR==3{print $3}' #找出第三行的第三列,‘找谁{干啥}’‘条件{动作}’

# ls -l `which pwd` #查看一个命令的指向

`` :反引号
$():优先执行 先执行里面的命令 把结果留下
例如:
# ls -l $(which mkdir)                                #该命令分解相当于执行:# which mkdir ;# ls -l /usr/bin/mkdir
# touch redhat-$(date +%F).txt                        #该文件就为redhat-2022-03-07.txt
# tar zcf /tmp/rhce/etc-$(date +%F_%w).tar.gz /etc/   #在/tmp/rhce/下就会有etc-2022-03-07_1.tar.gz

  

 

posted @ 2022-07-14 22:57  LB_运维技术  阅读(78)  评论(0编辑  收藏  举报