linux之awk

目录

1.输出设置

2.指定分隔符

3.匹配代码块


之前的文章介绍了字符,字符串处理 的“函数”,如grep,sed egrep等,现在介绍一个好用的数据处理工具,就是awk,awk 通常将一行分成若干个字段进行处理,这里有别于grep 和sed处理按行进行处理。

 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。简单来说awk就是把文件逐行读入,(**空格**,**制表符**)为默认分隔符将每行切片,切开的部分再进行各种分析处理
awk命令格式如下:
 

[root @localhost tmp]#awk '条件类型 1{动作1} 条件类型2 {动作2}...' filename
awk [选项参数] 'script' var=value file(s)
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:

-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value
赋值一个用户定义变量。
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。
-mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
-W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。
-W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。
-W lint or --lint
打印不能向传统unix平台移植的结构的警告。
-W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。
-W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
-W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
-W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。
-W version or --version
打印bug报告信息的版本。

1.输出设置

awk 可以处理后续的文件,也可以处理前一个命令的standardoutput,主要处理每一行字段内的数据,默认的字段分割符号是空格将或者tab键

对比发现,使用awk指定显示了第1列和第3列,指定账号和IP之间以tab键隔开,也发现了一个规律:$1表示第1列,$3表示第3列,是的,每一行的每个字段都是有变量名称的,那就是$1,$2,$3等等,而 $0 则表示一整行的数据,第一行就是$0 ,即是root 192.168.1.109,所以awk的处理流程为:

 a.  读入第1行,并将第1行的数据填入到变量$0,$1,$2,$3...中

 b.  根据条件类型的限制,判断是否进行后续的动作

 c.  做完所有的工作和条件类型

 d.  若还有后续的“行”的数据,则重复执行步骤a-c,直到处理完所有数据

awk 以行为一次操作的单元,而以字段为最小处理的单位,默认字段的分割符号是空格或者tab键

疑惑:awk 如何得知数据有多少行多少列呢,此时 awk 的内置变量就发挥作用了

NF   每一行 $0 拥有字段总数

NR   目前awk所处理的是第几行的数据

FS    目前的分割符号是什么,默认的是空格

显示出查找数据所在的行数和列数

[root @localhost tmp]#last -n 5 | awk '{print $1 "\t lines:" NR "\t columes: " NF }'

此外 awk 中还有一些常见的运算符

> ,>=       大于,大于等于

< ,<=       小于,小于等于

==            等于

!=             不等于

/etc/passwd中以 : 为分割符号,其中第一个字段是账号,第三个字段是UID,想要查找第三列小于10以下的数据,并且列出第一列和第三列

[root @localhost ~]# cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t" $3 } '

发现第一行显示的不正确,因为在处理第一行的时候,$1,$2默认的还是以空格为分隔符的,因此虽然加了FS=:,还是从第二行开始生效的,怎么办?

利用关键字 BEGIN 

[root @localhost ~]#cat /etc/passwd | awk 'BEGIN { FS=":"} $3 < 10 {print $1 "\t" $3 }'

此外,awk 还可以有计算功能,,有如下的数据,如果计算每个人的Total总和呢?

[root @localhost ~]#cat pay.txt |
 awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
NR>=2{total=$2+$3+$4 printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'

 这里对比下cat命令和awk命令输出

awk '{print}' /proc/meminfo

2.指定分隔符

这里再详细介绍下所谓指定分隔符的用法

[root@iv-yblfbjnlokl8j1o22bl7 ~]# awk  '{print}'  /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin


输出如上所示.指定分割符后输出

awk  -F ":" '{print $1,$3}'  /etc/passwd
root 0
bin 1
daemon 2

3.匹配代码块

awk '/MemFree/{print}' /proc/meminfo
MemFree:          142320 kB
awk '/MemFree/{printf "%d\n", $2}' /proc/meminfo
142272

//纯字符匹配   !//纯字符不匹配   ~//字段值匹配    !~//字段值不匹配   ~/a1|a2/字段值匹配a1或a2

测试系统资源的时候,常用的一个使用awk的命令

stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.95;}' < /proc/meminfo)k --vm-keep -m 1

使用系统压测工具stress,压测系统内存95%被占用的情况

参考:
https://www.cnblogs.com/sunshine-long/p/9295913.html
https://blog.csdn.net/guoer9973/article/details/44650729

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值