shell编程基础(awk、sort)

awk用法

语法
awk ‘条件1 {动作 1} 条件 2 {动作 2} …’ 文件名
awk [选项] ‘命令’ 文件

print 意思就是打印输出

条件类型 条 件 说 明
awk保留字 BEGIN 在 awk 程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次
awk保留字 END 在 awk 程序处理完所有数据,即将结束时执行?END 后的动作只在程序结束时执行一次
关系运算符 :
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”
!= 不等于
A~B 判断字符串 A 中是否包含能匹配 B 表达式的子字符串
A!~B 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
正则表达式 :
/正则/ 如果在“//”中可以写入字符,则也可以支持正则表达式

x>10:判断变量 x 是否大于10;
x == y:判断变量 x 是否等于变量 y;
A~B:判断字符串 A 中是否包含能匹配 B 表达式的子字符串;
A!~B:判断字符串 A 中是否不包含能匹配 B 表达式的子字符串;

NR:表示awk开始执行程序后所读取的数据行数。
FNR:awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。
NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。
在这里插入图片描述

案列一

使用awk获取ifconfig中ens33下的ip地址
在这里插入图片描述
通过grep "netmask"我们筛选出以下这一段,不要急慢慢来~
在这里插入图片描述
筛选出来现在有三行,我们只要第一行的IP地址该怎么操作呢? | head -1
在这里插入图片描述
好咯,现在只有一行了,我们可以通过awk获取ip地址了 192.168.76.147属于这一行中的第二列使用$2(以空格为列)
最终命令:

#ifconfig | grep "netmask" | head -1 | awk '{print $2}'

在这里插入图片描述

案列二

假设我想知道文件系统Use大于50%怎么操作呢?
直接df -h?
nonono
我只想看Use大于50%怎么办呢?
在这里插入图片描述
因为Use%后面挂着%不好筛选判断,使用sed把%替换掉
sed使用方法可参考以下博客
https://blog.csdn.net/weixin_44057684/article/details/104850248
在这里插入图片描述
然后使用awk,这里需要用到关系运算符 >
最终命令↓

#df -h | sed 's/%//g' | awk '$5>50{print $0}'

在这里插入图片描述

  1. sort

    串联排序所有指定文件并将结果写到标准输出

排序选项:
-b, --ignore-leading-blanks 忽略前导的空白区域
-d, --dictionary-order 只考虑空白区域和字母字符
-f, --ignore-case 忽略字母大小写
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 只排序可打印字符
-n, --numeric-sort 根据字符串数值比较
-r, --reverse 逆序输出排序结果

其他选项:
-c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操作
-k, --key=位置1[,位置2] 在位置1 开始一个key,在位置2 终止(默认为行尾)
-m, --merge 合并已排序的文件,不再进行排序
-o, --output=文件 将结果写入到文件而非标准输出
-t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换
-u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果

基础语法

sort [选项参数] [文件]

假设有个学生成绩表.有Name(姓名)有Results(成绩)
在这里插入图片描述

案列一

现在有这些数据我需要按照分数进行从小到大排序
需要用到 -t截取 -n逆向排序 -k指定列
最终命令为

sort -t " " -nk 2 sort.txt

在这里插入图片描述

案列二

去重 -u
需要用到 -t截取 -n逆向排序 -k指定列

sort -t " " -uk 2 sort.txt

这里为什么要用 -t -k呢? 默认第全局去查重,-t指定分隔空格" " -k 指定第二列按照分数查重
在这里插入图片描述
(注:没有演示纯数字的了,会以上操作对于纯数字、字符也不难了)

扩展:
面试题
使用Linux命令算出sort.txt文件中成绩一栏的总和
cat sort.txt | awk -F " " ‘{sum+=$2} END {print sum}’ sort.txt在这里插入图片描述

发布了11 篇原创文章 · 获赞 10 · 访问量 231

猜你喜欢

转载自blog.csdn.net/weixin_44057684/article/details/104857745