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基础到此为止,有不足的地方希望大家海涵!
感谢大家,点赞,收藏,关注,评论!
浙公网安备 33010602011771号