Cat-God-007

导航

Shell脚本编程学习笔记(十)---- 正则三剑客(下)

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

三剑客,准备返航!

awk(切割)

定义

awk是一种可以处理数据、产生格式化报表的语言。

awk 认为文件中的每一行是一条记录 记录与记录的分隔符为换行符,每一列是一个字段 字段与字段的分隔符默认是一个或多个空格或tab制表符

awk的工作方式是读取数据,将每一行数据视为一条记录(record)每条记录以字段分隔符分成若干字段,然后输出各个字段的值

awk的语法

awk [options] [BEGIN]{program} [END][file] awk # 执行命令 [options] # 选项 BEGIN]{program} # 动作和条件 [END] # 结尾代码块 [file] # 文件

常用命令选项

-F fs 指定描绘一行中数据字段的文件分隔符 默认为空格

-f file 指定读取程序的文件名

-v var=value 定义awk程序中使用的变量和默认值

注意:awk 程序脚本由左大括号和右大括号定义。脚本命令必须放置在两个大括号之间。由于awk命令行假定脚本是单文本字符串,所以必须将脚本包 括在单引号内。

awk程序运行优先级是:

1)BEGIN: 在开始处理数据流之前执行,可选项

2)program: 如何处理数据流,必选项

3)END: 处理完数据流后执行,可选项

例如

awk -v name='baism' 'BEGIN{print name}'          #定义了一个变量 name=baism,然后调用变量读出数据。

例子

awk '{print $2}' /etc/passwd                                           #打印passwd.txt 文件的第二列
awk -F "|" '{print $2}' /etc/passwd                                    #将分隔符由空格改为“|”
awk '{printf("%s\n", FILENAME)}' passwd.txt                            #打印文件名
awk '{printf("%d:%s\n", NR, FILENAME)}' passwd.txt                     #打印文件名,并显示行号(多合一)
awk '{printf("%d:%d:%s\n", FNR, FILENAME)}' passwd.txt p.txt           #打印文件名,并显示相对应文件的行号(一对一)
echo "good good study" | awk '{print NF}'                              #打印段数(默认以空格分割,例子为3段)
awk '{print NF}' passwd.txt                                            #打印文件中每行的段数(默认以空格分割)
awk -F "|" '{print FS}' passwd.txt                                     #打印文件中每行的段数(以“|”进行分割)
#条件式的program  
awk '{if(1<2) printf("%s\n", $2)}' passwd.txt                          #打印第2行
awk 'NR>=2 && NR<=4 {print $0}' passwd.txt                             #打印第2-4行
awk '/^C/' passwd.txt                                                  #输出以C开头的行
awk '/^(C|D)/' passwd.txt                                              #输出以C或D开头的行
awk '/t$/' passwd.txt                                                  #输出以t结尾的行
awk '/100/ && $4 >= 70' passwd.txt                                     #输出含100的字段并且第四端的值大于等70
案例
head -2 /proc/meminfo | awk 'NR==1{a=$2}NR==2{b=$2;print (a-b)*100/a "%"}'    #查看已经使用的内存

grep

全称为全局正则表达式检索工具,此命令使用频率较高

grep的语法格式

grep -option(参数) 检索内容 文件名

grep参数

n 显示符号要求的行,并显示行号
c 打印符合要求的行数
v 打印不符合要求的行,取反的意思
r 会把目录下的所有文件全部遍历;-r针对的是目录,如果不加-r只能针对文件
i 忽略大小写
A2 打印符合要求的行以及下面两行
B2 打印符合要求的行以及上面两行
C2 打印符合要求的行以及上下两行
w 匹配一个完整的单词
E 特殊符号脱意==egrep
l  只打印出含有匹配字符串的文件名,不输出具体匹配行的数据
--color显示颜色 (centos7中自带)
--include 包含

grep跟特殊符号的话,要用单引号

例子

grep -n 'root' passwd.txt                                           #过滤出包含root的行,并显示行号
grep -v 'root' passwd.txt                                           #过滤出不包含root的行
grep -i 'root' passwd.txt                                           #过滤出包含root的行(不区分大小写)
grep -nv '[0-9]' passwd.txt                                         #过滤出不包含数字的行
grep -v '^#' passwd.txt |grep -v '^$'                               #过滤出注释或者空行
grep -v '^[^a-zA-Z0-9]' passwd.txt                                  #过滤出不包含特殊符号的行
grep '^[^a-zA-Z]' passwd.txt                                          #过滤出不以字母开头的行

案例

grep "cat" /etc/passwd                                         #查找/etc/passwd文件中是否存在cat用户信息
ifconfig |grep -w inet                                         #ifconfig看到网卡信息,只查看IP地址所在行信息
grep -E -v  "^176" passwd.txt                                  #显示输出行首不是176的行
grep -E "[a-Z]w " passwd.txt                                   #匹配字母紧跟w的行
grep "w{2,}" passwd.txt                                      #打印字符w字符连续出现2次以上的行
grep -E -w --color "([0-9]{1,3}.){3}[0-9]{1,3}" passwd.txt    #匹配IPV4地址

awk,grep基础到此为止,有不足的地方希望大家海涵!

QQ图片20220316151627.jpg

感谢大家,点赞,收藏,关注,评论!

posted on 2022-06-07 07:55  CatGod007  阅读(0)  评论(0)    收藏  举报  来源