Linux通配符和正则表达式
Linux通配符和正则表达式是不一样的,通配符一般用于用户命令行bash环境,而正则表达式用于三剑客匹配
1、通配符知识:一般用户命令行bash环境,注意区别正则表达式中的含义
* --代表所有(0个或多个)字符 如:*.sh 匹配所有以 .sh 结尾的文件
? --任意一个字符
; --连续不同命令的分隔符
# --配置文件的注释
| --管道符
~ --当前用户的家目录
- --上一次所在路径
/ --路径分隔符,也是根的意思
` --反引号中间为命令会先执行,等价于 $()
“ --双引号具有变量置换功能,解析变量后输出,不加引号相当于双引号
‘ --单引号不具有变量置换功能,输出所见即所得(原样输出)
.. --代表上一级目录
2、正则表达式(*)
(1)什么是正则表达式?
为处理大量的字符串而定义的一套规则和方法
注:正则表达式一般以行为单位处理
(2)为什么要学会正则表达式
正则表达式是为了处理大量字符串而生的。Linux运维每天面临大量的配置文件和日志文件。正则表达式也会用到Python、Java、php等语言。
本笔记以grep(egrep)为例展开讨论:所以希望输出高亮显示
# alias grep='grep --color=auto'
注意字符集:可能带来问题
# export LC_ALL=C
(3)自动文件结尾
#cat >>file.txt << HAN 写一个文件,显式提示以HAN为文件结尾
I like linux!
My name is hanmenghao!
HAN
cat file.txt
(4)常用标识符及补充 (只要是字符串需双引号引起来)
^word: 以word开头的行
word$: 以word结尾的行
^$: 代表空行 如:过滤掉空行 grep -v "^$" filename
. :匹配任意一个字符
\ :转义字符,脱掉特殊字符的特殊含义
* :匹配所有字符,重复前面字符0次到多次
.*: 匹配所有字符
^.*: 匹配以任意多个字符开头的项
.*$:匹配以任意多个字符结尾的项
[abc] : 匹配abc任意一项
[^abc] : 匹配不包含abc任意一项的项
a\{m,n\} : 匹配a至少m次,最多n次
a\{m,\} : 匹配a至少m次
a\{m\} : 匹配a恰好m次
a\{\,m} : 匹配a最多m次
\< \>:单词定位符 \< 和 \> 用于匹配一个字词的开头和结尾
\<han :以han开头的单词 han\> :以han 结尾的单词 \<han\> : 精确匹配单词 han
(5)扩展正则表达式(了解即可) egrep或(grep -E)
+ : 重复前面的字符1次或多次
?: 重复前面的字符0次或1次
| : 表示同时过滤多个字符串 如: # egrep "3306|1521" /etc/services 匹配3306或1521
() : 分组过滤,或后项引用 如: # egrep "g(la|oo)d" filename
(han) :把han 当作一项,整串匹配
(6)元字符
\b : 单词边界 如: egrep "\bfile\b" filename //仅过滤file
\n : 换行符
\r : 回车、
\t : 一个tab键
(7)正则表达式结合三剑客企业案列
1、用正则表达式获取系统ip
[root@server ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.224.137 netmask 255.255.255.0 broadcast 192.168.224.255
inet6 fe80::c558:9c2b:4d2:1e04 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:da:24:fe txqueuelen 1000
法1:# ifconfig ens33|sed -n '2p'|sed 's#^.*et ##g'|sed 's# net.*$##g'
法2:# ifconfig ens33|sed -nr 's#[^1]+(.*) net.*$#\1#gp' p代表输出
法3:# ifconfig ens33|awk -F "[ ]+" 'NR==2 {print $3}'
法4:# grep IPADDR /etc/sysconfig/network-scripts/ifcfg-ens33|cut -d= -f2
2、取出/etc/hosts文件第4行的权限644
第4行内容:Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
# stat /etc/hosts|sed -nr '4s#^.*\(0(.*)\/-.*$#\1#gp'
3、将/etc/passwd中的第1列和最后一列进行对调
# sed -nr 's#([^:]+)(:.*:)(/.*$)#\3\2\1#gp' /etc/passwd
4、把一个文件的字母组合权限转换成数字权限
stat 用来查看文件属性
# touch /ettt
法1:# ls -l /ettt |cut -c2-10| tr "rwx-" "4210" |awk -F "" '{print $1+$2+$3""$4+$5+$6""$7+$8+$9}'
法2:stat /ettt|sed -nr 'S#^.*\(0(.*)/-.*$#\1#gp'
法3:stat /ettt|awk -F "[0/]" 'NR==4 {print $2}'
法4: stat -c %a /ettt
重要思想:
当命令的结果包含我们需要的内容时,我们要想到命令的参数是否有具体的参数能一步达到我们的需求,此时可以 man 命令 来寻找!
2个思路:
1、取行的惯用命令:通过 head、tail、sed、awk、grep定位到单行
2、取列的惯用命令:通过 cut、awk等设置分隔符取出需要的段内容
5、请给出默认情况ens33网卡配置文件的路径及客户端DNS路径
网卡配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33
DNS客户端路径:/etc/resolv.conf
(7)shell的特殊位置变量
$0 : 文件名及路径
$1,$2:给脚本传参用的,代表第一个,第二个参数
$* : 把所有参数集合成一项输出
$#: 一共传了几个脚本
$?:上一个脚本的返回值
$$ : 脚本的PID
$@:所有参数分行输出