awk -f 分隔符 命令_Linux四剑客之awk

  • awk由三个人写的一个软件,Aho Wwinberger Kernighan 也可以说awk是一个编程语言,在awk里边有自己的变量,有if判断,有while判断,有fro循环,支持基本正则,扩展正则,支持数组等功能。
  • awk主要的核心作用是用来做数据过滤,数据处理,数据统计,awk处理流程是逐行处理。
  • awk命令格式:

格式1:前置命令 | awk 选项 ‘条件{指令}’

格式2:awk 选项 ‘条件{指令}’ 文件.. ..

格式3:awk 选项 ‘BEGIN{指令} {指令} END{指令}’ 文件

  • BEGIN{} 做行前处理,读取文件内容前执行,指令执行1次
  • {} 做逐行处理,读取文件过程中执行,指令执行n次
  • END{} 做行后处理,读取文件结束后执行,指令执行1次
  • 在awk里边所有的指令都必须要用{}括起来,在学习awk时,学的最多的并不是指令,而是选项和条件,它主要的作用时用来过滤数据的,所以指令用的最多的就是print打印指令,awk在过滤数据时可以实现对文件中的某一列进行过滤,比如我们在查看系统内存信息的时候,我们关心的是剩余多少内存,那如果用awk过滤的时候,我们就可以指定获取内存剩余的列
  • 查看内存剩余情况:通过正则匹配内存信息,打印剩余内存的列

[root@test ~]# free | awk '/Mem/{print $4}'

663612

  • 查看系统根分区剩余情况:通过正则匹配以根结尾的行,打印可用信息列

[root@test ~]# df | awk '//$/{print $4}'

13704824

  • 创建素材

[root@test opt]# vim test.txt

hello the woman

welcome to china

  • 打印test.txt文件中第一列和第三列

[root@test opt]# awk '{print $1,$3}' test.txt

hello woman

welcome china

解释:现在这种过滤方式没有指定选项,也没有指定条件,只指定了打印的列数,当没有条件时,默认时逐行处理

  • awk命令格式解析:

awk有一个最常用的选项 -F ,-F可以指定分隔符,也就是文件中用来分隔没一列的分隔符,当我们不指定文件内列与列之间的分隔符,那awk默认会以空格和tab键作为文件内的默认分隔符,例如/etc/passwd这个文件就是一个最好的例子

62cdc4ba68cfa59111f44553ba02b3c8.png

当我向要把文件中的第一列打印出来时,按照我们的理解应该是用户名字段,可是它却把所有的内容都打印出来了,由于awk默认情况下是以空格和tab键作为列之间的分隔符,那它去匹配的时候发现这个文件从头到尾都没有发现一个空格和tab键,所以它会认为一行就是一列,而我们系统里边有的文件不可能都是那么规整 不可能全都用空格隔开的,有的文件它可能是用逗号分隔,有的是用其他的符号分隔的,他就是没用空格隔开!那这个时候用awk是没有办法过滤到我们想要的信息的,那这个时候怎么办?这个时候就要用到一个选项来指定分隔符,-F ,-F是awk最常用的选项,它可以指定任何分隔符,在-F后边写什么,那它就会认为什么是分隔符,可以指定分隔符以后在来过滤这个文件的话就好办了

4a78ccdae5c0957a0c6cadfe9b4b6c64.png

指定以冒号为分隔符,打印出来的就是文件内的第一列

  • 打印第一列与第七列

f805223471e661f28c3753dda3da1ea7.png

打印出来的就是用户名和解释器字段,这个文件如果指定以冒号为分隔符还是比较好过滤的,但是有的文件它不一定全都是用这一种符号位分隔符的,就比如有的文件是这样

hello,the,woman

welcome,to,china

2020-06-06

像这样的格式逗号是分隔符,- 号也是分隔符,那像这样的能不能过滤?也可以,可以通过正则表达式里的集合[]去帮我们匹配任意单个字符

d1ec47fed96e5bcb7b9190ba80dbdf8f.png
  • awk内置变量:

$1 文件第一列

$2 文件第二列

$3 文件第三列,依此类推

NR 文件当前的行号

NF 文件当前行的列数

  • 通过内置变量打印文件的每一行每一列

9eba6943c5a022a0aae95a1d6fa257ab.png
  • 显示每一行每一列并把最后一列内容打印出来

e6a237f3c5412a035d7876dce5fa8827.png
  • awk除了可以打印变量以外,还可以打印常量,但是通过awk打印常量必须用双引括起来

850a220e4fee5008c8965d0e296594d5.png
  • 通过awk编写一个监控网卡流量的脚本

[root@test opt]# vim while_liuliang.sh

#!/bin/bash

while :

do

clear

ifconfig ens160 | awk '/inet /{print "IP:",$2}'

ifconfig ens160 | awk '/RX p/{print "入口流量信息:",$5}'

ifconfig ens160 | awk '/TX p/{print "出口流量信息:",$5}'

sleep 0.2

done

  • 通过awk编写获取根分区剩余空间和内存剩余空间脚本

[root@test opt]# vim df_free.sh

#!/bni/bash

df -h | awk '//$/{print "根分区剩余:",$4}'

free -h | awk '/Mem/{print "内存剩余:",$4}'

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值