awk - 4 常见处理案例

前3篇回顾
awk - 简介 Linux 制表好工具
awk-2 Regex搭配浅谈
awk-3 运算符与函数

awk 常见处理案例

  1. 计算目前文件夹下档案所占用的大小
    https://ithelp.ithome.com.tw/upload/images/20210913/20104930yitxcjQfkm.png
    透过ls -l看到当前目录下所有档案跟大小, 档案大小在第5个栏位
    想办法将这行数字给累加後输出
# BEGIN区块宣告size变数
# COMMAND区括做累加
# END区块做输出
ls -l | awk 'BEGIN{size=0}{size+=$5} END{print "size:" size}'
> size:219312120

# 计算成MB
ls -l | awk 'BEGIN{size=0}{size+=$5} END{print "size:" size/1024/1024 "M"}'
> size:209.152M
  1. 计算/etc/passwd的帐户总数, 以及除存UID>100的帐户名称, 并做显示
    https://ithelp.ithome.com.tw/upload/images/20210913/201049304170wjSbKz.png
# for in loop
awk -F ':' 'BEGIN{count=0}{if ($3 > 100) name[count++]=$1} END{for (idx in name) print idx, name[idx] }' /etc/passwd
> 3 messagebus
> 10 usbmux
> 27 systemd-coredump
> 8 tcpdump
> 6 tss

# for condition loop
awk -F ':' 'BEGIN{count=0}{if ($3 > 100) name[count++]=$1} END{for (idx=0; idx<count;idx++) print idx, name[idx] }' /etc/passwd
> 0 nobody
> 1 systemd-resolve
> 2 systemd-timesync
> 3 messagebus
> 4 syslog
  1. 统计netstat下状态为LISTEN和CONNECTED的数量
    https://ithelp.ithome.com.tw/upload/images/20210913/20104930NkAqB26xYS.png
    netstat -anp下的输出, 榨看下LISTEN和CONNECTED是在$5,
    但其实中间的[ ]也有个空格, 所以其实在$6
    搭配awk-2提到的REGEX做match即可
netstat -anp | awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (idx in sum) print idx, sum[idx]}'
> LISTEN 12
> CONNECTED 1121
  1. 找出ifconfig中, 是ipv4格式的ip
    我的思路是用space做分隔符号, 找出每行的$2, 搭配之前的grep+Regex做查找显示
    https://ithelp.ithome.com.tw/upload/images/20210914/20104930H9el5wHCrG.png
ifconfig | awk '{print $2}' | grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
> 172.29.0.1
> 172.31.0.1
> 127.0.0.1

会发现这里有127.0.0.1, 但这ip, 每台电脑必有, 没参考价值, 因此找个方法忽略它
把```lo```开头的行给忽略就好
```RS```是awk的内建变数, 用来指定行的分隔符号, 预设是```\n```换行符号, 遇到\n为一行
这里把RS设置为空字串, 表示要遇到一行空字串才做换行输出; 可以看上图, 2个网卡中间会个空行
这样子就能把多行资料, 一直当成同一行读取, 直到RS指定的行分隔符号
ifconfig | awk 'BEGIN{RS=""}!/lo/{print $6}' | grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}"
> 172.29.0.1
> 172.31.0.1
  1. 去除重复资料後输出
# 准备假资料
cat > bb.txt <<EOF
heredoc> UID=1
heredoc> UID=2
heredoc> UID=4
heredoc> UID=3
heredoc> UID=2
heredoc> UID=3
heredoc> EOF

awk -F "=" '!arr[$2]++ {print}' bb.txt
> UID=1
> UID=2
> UID=4
> UID=3

本日小结

awk是个简单的动态程序语言, 可以处理复杂的文字处理,
若只是查找其实前篇的grep足以, 但awk能把资料做转换然後输出.

但awk执行效率不是很好,
所以还是比较多人选择用Python、Perl进行大型文件的处理.
但若是内容没几MB, awk就是把精致的小刀, 很方便使用, 其他语言要写好几行, awk可能只需要一行.

提供一篇文章, 快速地把awk给说明演示一次
Awk in 20 Minutes


<<:  D21: 工程师太师了: 第11话

>>:  DAY11: Node基础总整理

【Day6】[资料结构]-堆叠Stack-实作

堆叠(Stack)建立的方法 push: 新增元素 pop: 从顶端移除元素 peek: 查看顶端(...

Day 2:Kotlin 程序设计基础入门 (1)

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...

DAY 30 好用的套件

推荐扩充套件 Color Highlight 这边跟大家推荐 Color Highlight 这个扩...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 16 - 如何选取下拉式选单的值

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 在 E2E 测试中,不仅有选取元素...

DAY 2 HTML 的基本语法

HTML是什麽 首先关於 HTML 是网页三兄弟中最容易也是最基础的一种标记语言(markup la...