天天看点

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:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。

shell编程基础(awk、sort)

案列一

使用awk获取ifconfig中ens33下的ip地址

shell编程基础(awk、sort)

通过grep "netmask"我们筛选出以下这一段,不要急慢慢来~

shell编程基础(awk、sort)

筛选出来现在有三行,我们只要第一行的IP地址该怎么操作呢? | head -1

shell编程基础(awk、sort)

好咯,现在只有一行了,我们可以通过awk获取ip地址了 192.168.76.147属于这一行中的第二列使用$2(以空格为列)

最终命令:

#ifconfig | grep "netmask" | head -1 | awk '{print $2}'
           
shell编程基础(awk、sort)

案列二

假设我想知道文件系统Use大于50%怎么操作呢?

直接df -h?

nonono

我只想看Use大于50%怎么办呢?

shell编程基础(awk、sort)

因为Use%后面挂着%不好筛选判断,使用sed把%替换掉

sed使用方法可参考以下博客

https://blog.csdn.net/weixin_44057684/article/details/104850248

shell编程基础(awk、sort)

然后使用awk,这里需要用到关系运算符 >

最终命令↓

#df -h | sed 's/%//g' | awk '$5>50{print $0}'
           
shell编程基础(awk、sort)
  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(成绩)

shell编程基础(awk、sort)

案列一

现在有这些数据我需要按照分数进行从小到大排序

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

最终命令为

sort -t " " -nk 2 sort.txt
           
shell编程基础(awk、sort)

案列二

去重 -u

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

sort -t " " -uk 2 sort.txt
           

这里为什么要用 -t -k呢? 默认第全局去查重,-t指定分隔空格" " -k 指定第二列按照分数查重

shell编程基础(awk、sort)

(注:没有演示纯数字的了,会以上操作对于纯数字、字符也不难了)

扩展:

面试题

使用Linux命令算出sort.txt文件中成绩一栏的总和

cat sort.txt | awk -F " " ‘{sum+=$2} END {print sum}’ sort.txt

shell编程基础(awk、sort)
上一篇: awk 字段匹配
下一篇: awk的妙用

继续阅读