21 liunx shell编程 简述awk命令; BEGIN命令, END命令,内建变量 NF NR FS;awk 的逻辑运算;print 和 printf 的区别

本文主要是介绍21 liunx shell编程 简述awk命令; BEGIN命令, END命令,内建变量 NF NR FS;awk 的逻辑运算;print 和 printf 的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简述awk命令,BEGIN命令, END命令, 内建变量 NF NR FS,

  • awk命令
  • print 和 printf 的区别
  • 获取sda1 已经第5列%前面的数字
  • awk 的内建变量 NF NR FS
    • awk的执行顺序
  • awk 中的BEGIN
  • awk 中的END
  • awk 的逻辑运算

在这里插入图片描述

awk 也是一个非常棒的数据处理工具。
awk 用来截取符合条件的列。
awk 的功能远比cut强大;甚至可以称之为awk编程。

awk命令

格式:

awk '条件1{动作1} 条件2{动作2} ...' filename

含义:

  • awk 后面接单引号,引号内会有多个条件和动作 条件{动作} 就像java中的if else一样,满足条件1执行动作1。
  • awk 可以处理后续接的文件,也可以读取来自前个命令的 standard output 。
  • awk 主要是处理『每一行的栏位内的数据』,而默认的『栏位的分隔符号为 “空白键” 或 “[tab]键” 』!
[userwin@MiWiFi-R3L-srv ~]$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   18G  2.0G   16G   12% /
devtmpfs                 479M     0  479M    0% /dev
tmpfs                    489M     0  489M    0% /dev/shm
tmpfs                    489M  6.7M  483M    2% /run
tmpfs                    489M     0  489M    0% /sys/fs/cgroup
/dev/sda1                497M  107M  391M   22% /boot
tmpfs                     98M     0   98M    0% /run/user/1000
# 想使用cut 命令获取上面内容的第二列内容;结果出乎意料了吧? 
[userwin@MiWiFi-R3L-srv ~]$ df -h | cut -d " " -f2# 文件系统后面列后面跟多个空格,cut命令无法识别。awk命令刚好解决这个问题。
[userwin@MiWiFi-R3L-srv ~]$ df -h | awk '{print $2}'
容量
18G
479M
489M
489M
489M
497M
98M

文件系统后面列后面跟多个空格,cut命令无法识别;如下图:
在这里插入图片描述

获取第二列和第六列 df -h | awk ‘{print $2 “\t” $6}’
点引号后面直接跟{print 此处省略了条件。默认为true。
awk 最常使用的动作!透过 print 的功能将栏位数据列出来!栏位的分隔则以空白键或 [tab] 按键来隔开

[userwin@MiWiFi-R3L-srv ~]$ df -h | awk '{print $2 "\t" $6}'
容量	挂载点
18G	/
479M	/dev
489M	/dev/shm
489M	/run
489M	/sys/fs/cgroup
497M	/boot
98M	/run/user/1000

print 和 printf 的区别

在awk语句中,printf 输出不会换行,需要手动加入\n
且看下面示例:

[userwin@MiWiFi-R3L-srv ~]$ df -h | awk '{print $2 "\t" $6}'
容量	挂载点
18G	/
479M	/dev
489M	/dev/shm
489M	/run
489M	/sys/fs/cgroup
497M	/boot
98M	/run/user/1000
[userwin@MiWiFi-R3L-srv ~]$ df -h | awk '{printf $2 "\t" $6}'
容量	挂载点18G	/479M	/dev489M	/dev/shm489M	/run489M	/sys/fs/cgroup497M	/boot
[userwin@MiWiFi-R3L-srv ~]$ df -h | awk '{printf $2 "\t" $6 "\n"}'
容量	挂载点
18G	/
479M	/dev
489M	/dev/shm
489M	/run
489M	/sys/fs/cgroup
497M	/boot
98M	/run/user/1000

获取sda1 已经第5列%前面的数字

# 查看
[userwin@MiWiFi-R3L-srv ~]$ df -h 
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   18G  2.0G   16G   12% /
devtmpfs                 479M     0  479M    0% /dev
tmpfs                    489M     0  489M    0% /dev/shm
tmpfs                    489M  6.7M  483M    2% /run
tmpfs                    489M     0  489M    0% /sys/fs/cgroup
/dev/sda1                497M  107M  391M   22% /boot
tmpfs                     98M     0   98M    0% /run/user/1000
# 获取sda1 行
[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" 
/dev/sda1                497M  107M  391M   22% /boot
# 获取第5列
[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" | awk '{print $5}'
22%
# 使用cut截取%前面的数值
[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" | awk '{print $5}' |cut -d '%' -f1
22

awk 的内建变量 NF NR FS

awk命令: 每一行的每个栏位都是有变量名称的,那就是 $1, $2… 等变量名称 每个栏位就对应的每一列。$1指第一列;
$0 代表『一整列数据』的意思

变量名称代表意义
NF每一行 ($0) 拥有的栏位总数
NR目前 awk 所处理的是『第几行』数据
FS目前的分隔字节,默认是空白键
# 查看passwd文件中包含/bin/bash 的内容
[userwin@MiWiFi-R3L-srv ~]$ cat /etc/passwd | grep "/bin/bash"  
root:x:0:0:root:/root:/bin/bash
userwin:x:1000:1000:userwin:/home/userwin:/bin/bash
# 使用awk自定义分隔符获取1,3两列
[userwin@MiWiFi-R3L-srv ~]$ cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {print $1 "\t" $3}'
root:x:0:0:root:/root:/bin/bash	
userwin	1000

第一个列为什么没有执行分割呢?

看一下awk的执行顺序,先读入第一行,读完才执行FS=:这个分隔符,故而出现如下图情况

在这里插入图片描述
需要使用BEGIN命令添加一个空行,如下

[userwin@MiWiFi-R3L-srv ~]$ cat /etc/passwd | grep "/bin/bash" |\awk 'BEGIN{FS=":"} {print $1 "\t" $3}'
root	0
userwin	1000

awk的执行顺序

  1. 先读入第一行,并将第一行的数据填入 $0, $1, $2… 等变量当中;
  2. 依据 “条件类型” 的限制,判断是否需要进行后面的 “动作”;
  3. 做完所有的动作与条件类型;
  4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。

awk 中的BEGIN

BEGIN 处理数据前加入内容

[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" | awk 'BEGIN{print "sda1的使用率为:"}{print $5}' 
sda1的使用率为:
22%
[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" | awk 'BEGIN{printf "sda1的使用率为:"}{print $5}' 
sda1的使用率为:22%

awk 中的END

BND 处理数据后加入内容

[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" | awk 'BEGIN{print "sda1的使用率为:"} END{print "命令执行完 毕!!"}{print $5}' 
sda1的使用率为:
22%
命令执行完毕!!

awk 的逻辑运算

运算单元代表意义
>大於
<小於
>=大於或等於
<=小於或等於
==等於
!=不等於
[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" | awk '{print $5}' | awk 'BEGIN{FS="%"} $1>=20{print "磁盘使 用率超过20%"}'
磁盘使用率超过20%
[userwin@MiWiFi-R3L-srv ~]$ df -h | grep "sda1" | awk '{print $5}' | awk 'BEGIN{FS="%"} $1>=80{print "磁盘使 用率超过80%"} $1<80{print "磁盘使用率未超过80%"}'
磁盘使用率未超过80%

这篇关于21 liunx shell编程 简述awk命令; BEGIN命令, END命令,内建变量 NF NR FS;awk 的逻辑运算;print 和 printf 的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699777

相关文章

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小