shell脚本——正则表达式,grep,awk

目录

正则表达式

1、元字符(字符匹配)

2、表示次数

3、位置锚定

4、分组或其他

grep

awk的用法

1、基础用法

2、awk常见的内置变量

FS        指定输出的每行文本的字段分隔符

OFS        输出时的分隔符

NF        当前处理的行的字段个数

NR:当前处理的行的行号

3、模式

4、条件判断


正则表达式

1、元字符(字符匹配)


.           匹配任意**单个字符**,可以是**汉字**
[ ]        匹配指定**范围内**的任意**单个字符**
[^]        匹配指定范围内**除外**的任意**单个字符**
[:alpha:]        代表任何英文大小写字符
[:alnum:]        代表字母和数字
[:lower:]        小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:]        大写字母,示例:[[:upper:]],相当于[A-Z]
[:balnk:]        空白字符(空格和制表符)
[:space:]         包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比**[:blank:]**包含的范围广
[:cntrl:]        不可打印的控制字符(退格、删除、警铃...)
[:digit:]         十进制数字
[:xdigit:]        十六进制数字
[:graph:]         可打印的非空白字符
[:print:]         可打印字符
[:punct:]        标点符号
\w         #匹配单词构成部分,等价于[_[:alnum:]]
\W         #匹配非单词构成部分,等价于[^_[:alnum:]]
\S             #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s             #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode         正则表达式会匹配全角空格符


元字符点(.

元字符"[ ]"

元字符"[^]" 

2、表示次数

*         #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.*        #任意长度的任意字符,不包括0次
\?         #匹配其前面的字符出现0次或1次,即:可有可无
\+         #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}         #匹配前面的字符n次
\{m,n\}         #匹配前面的字符至少m次,至多n次
\{,n\}          #匹配前面的字符至多n次,<=n
\{n,\}          #匹配前面的字符至少n次

* #匹配前面的字符任意次,包括0次

 .*        #任意长度的任意字符,不包括0次

 \?         #匹配其前面的字符出现0次或1次,即:可有可无

 \+         #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次

 \{n\}         #匹配前面的字符n次

\{m,n\}         #匹配前面的字符至少m次,至多n次
\{,n\}          #匹配前面的字符至多n次,<=n
\{n,\}          #匹配前面的字符至少n次

3、位置锚定

^         #行首锚定, 用于模式的最左侧
$         #行尾锚定,用于模式的最右侧
^PATTERN$         #用于模式匹配整行 (单独一行  只有root)
^$         #空行
^[[:space:]]*$ #  空白行
\< 或 \b        #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b        #词尾锚定,用于单词模式的右侧
\<PATTERN\>     #匹配整个单词

例1:列出/etc/fstab文件内不是#号开头的非空行

[root@heitui opt]#grep "^[^#]" /etc/fstab

例2:统计/etc/fstab文件内有多少正常的单词

[root@heitui opt]#grep -o '\b[[:alpha:]]\+\b' /etc/fstab |wc -l

4、分组或其他

分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名

方式为: \1, \2, \3, ...

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

 或者:|(\|)有些情况需要使用 \ 进行转义

例1:取出网卡的IP地址

[root@heitui ~]#ifconfig ens33|grep netmask|grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{3\}'|head -1

grep

grep [选项]… 查找条件 目标文件

  • -i:查找时忽略大小写

  • -v:反向查找,输出与查找条件不相符的行

  • -o 只显示匹配项

  • -f 对比两个文件的相同行

  • -c 匹配的行数([root@localhost ky15]# grep -c root passwd 2)

选项:
-color=auto 对匹配到的文本着色显示
-m  # 匹配#次后停止
grep -m 1 root /etc/passwd   #多个匹配只取第一个
-v 显示不被pattern匹配到的行,即取反
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
grep -c root /etc/passwd    #统计匹配到的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A    # after, 后#行 
grep -A3 root /etc/passwd   #匹配到的行后3行业显示出来
-B   # before, 前#行
-C   # context, 前后各#行
-e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行
grep -E root|bash  /etc/passwd
-w 匹配整个单词
grep -w root /etc/passwd
useradd rooter
-E 使用ERE,相当于egrep
-F 不支持正则表达式,相当于fgrep
-f   file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-r   递归目录,但不处理软链接
-R   递归目录,但处理软链接

-i:查找时忽略大小写
-o 只显示匹配项

 -v:反向查找,输出与查找条件不相符的行

-n 显示匹配的行号

-c 统计匹配的行数

 -A    n   ,after, 显示匹配的行与后n行

-B   n  , before, 显示匹配的行与前n行
-C   n , context, 前后各n行

awk的用法

1、基础用法

格式:awk   [选项]    '模式条件{操作}'

选项:

-F        指定分隔符

-v        自定义变量

-f        脚本

例一:打印

[root@heitui opt]#awk '{print "hello"}'   #如果print后面不加打印内容,你输入什么就打印什么
1
hello
2
hello
3
hello

 例二:使用awk过滤出剩余内存大小

[root@heitui opt]#free -h|awk '{print $4}'|tail -n +2

 例三:提取host.txt主机名

www.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com

[root@heitui opt]#cat host.txt |awk -F '.' '{print $1}'

 例四:查出/tmp的权限,以数字方式显示

[root@heitui opt]#stat /tmp|awk -F'[/(]' '/权限/{print $2}'

2、awk常见的内置变量

  • FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"

  • OFS:输出时的分隔符

  • NF:当前处理的行的字段个数

  • NR:当前处理的行的行号(序数)

  • $0:当前处理的行的整行内容

  • $n:当前处理行的第n个字段(第n列)

  • FILENAME:被处理的文件名

  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

FS        指定输出的每行文本的字段分隔符

[root@heitui ~]#awk -v FS=':' '{print $1FS$3}' /etc/passwd

OFS        输出时的分隔符

[root@heitui ~]#awk -v FS=':' -v OFS='==' '{print $1,$3}' /etc/passwd

NF        当前处理的行的字段个数

[root@heitui ~]#awk -F: '{print NF}' /etc/passwd

NR:当前处理的行的行号

[root@heitui ~]#awk 'NR==1,NR==3{print}' /etc/passwd

3、模式

wak     '模式{处理动作}'

不支持使用行号,但是可以使用变量NR 间接指定行号

[root@heitui ~]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd

 取奇数和偶数

[root@heitui ~]#seq 10 | awk 'NR%2==1'

[root@heitui ~]#seq 10 | awk 'NR%2==0'

4、条件判断

在awk中套用if条件判断

如:过滤出系统中uid号大于1000的用户名和uid号

[root@heitui ~]#awk -F: '{if($3>1000)print $1,$3}' /etc/passwd

 

面试题

1.统计/etc/fstab文件中每个文件系统类型出现的次数

[root@heitui ~]#cat /etc/fstab        #先查看/etc/fstab文件中需要取得内容有何特点

[root@heitui ~]#cat /etc/fstab |tail -4         # 要去的内容都在最后四行中

[root@heitui ~]#cat /etc/fstab |tail -4|awk '{print $3}'         #取出需要的内容

[root@heitui ~]#cat /etc/fstab |tail -4|awk '{print $3}'|uniq -c         #去重,列出每个文件系统出现的次数

2.统计/etc/fstab文件中每个单词出现的次数

[root@heitui ~]#cat /etc/fstab |grep -Eo '\b[[:alnum:]]+\b'|uniq -c

3.提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

方法一

[root@heitui ~]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" |grep -o "[0-9]"

方法二

[root@heitui ~]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw"|tr -cd "[0-9]\n"   

#使用\n换行,否则就会出现下图的情况

4.提取host.txt主机名并放入原文件

host.txt

www.kgc.com
mail.kgc.com
ftp.kgc.com
linux.kgc.com
blog.kgc.com


[root@heitui opt]#cat host.txt |awk -F'.' '{print $1}'>>host.txt

5.查出/tmp的权限,以数字方式显示

[root@heitui ~]#stat /tmp|awk -F'[(/]' '/权限/{print $2}'

6.查出用户UID最大值的用户名、UID及shell类型

[root@heitui ~]#cat /etc/passwd |sort -t: -k 3 -rn|awk -F':' '{print $1 $3 $7}'|head -1

#思路 :先观察格式,然后以“:”为分隔符,按照第三列排倒序,然后过滤出第一三七列,最后取第一个,就是UID最大的一个

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值