awk工具

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

1. awk常见用法

  • awk 所使用的命令格式如下所示,单引号加上大括号“{}”用于设置对数据进行的处理动作。awk 可以直接处理目标文件,也可以通过“-f”读取脚本对目标文件进行处理。

awk 选项 '模式或条件 {编辑指令}' 文件1 文件2 //过滤并输出文件符条件的内容

awk -f 脚本文件 文件1 文件2 //从脚本中调用编辑指令,过滤并输出内容

  • sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或者 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。在使用 awk 命令的过程中,可以使用逻辑操作符“&&”,表示“与”, “||”表示“或”,“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别 表示加、减、乘、除、取余和乘方。
  • 在 Linux 系统中/etc/passwd 是一个非常典型的格式化文件,各字段间使用“:”作为分隔符隔开,Linux 系统中的大部分日志文件也是格式化文件,从这些文件中提取相关信息是运维的日常工作内容之一。若需要查找出/etc/passwd 的用户名、用户 ID、组 ID 等列, 执行以下 awk 命令即可。

[root@localhost ~]# awk -F ':' '{print $1,$3,$4}' /etc/passwd

root 0 0

bin 1 1

daemon 2 2

adm 3 4

...//省略部分内容...

//awk从输入文件或者标准输入中读入信息,与 sed 一样,信息的读入也是逐行读取的。不同的是awk将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。为了操作这些不同的字段,awk借用shell中类似于位置变量的方法, 用$1、$2、$3„顺序地表示行(记录)中的不同字段。另外awk用$0表示整个行(记录)。不同的字段之间是通过指定的字符分隔。awk默认的分隔符是空格。awk允许在命令行中用“-F分隔符”的形式来指定分隔符。

  • awk 包含几个特殊的内建变量(可直接用)如下所示

2.用法示例

1)按行输出文本

[root@localhost opt]# awk '{print}' bbb.txt //输出所有内容,等同于 cat bbb.txt

this is

the wood

wood

wod

the wood

this is test

[root@localhost opt]# awk '{print $0}' bbb.txt //输出所有内容,等同于 cat bbb.txt

this is

the wood

wood

wod

the wood

this is tes

[root@localhost opt]# awk 'NR==1,NR==3{print}' bbb.txt //输出第 1~3 行内容

this is

the wood

wood

[root@localhost opt]# awk '(NR>=1)&&(NR<=3){print}' bbb.txt //输出第 1~3 行内容

this is

the wood

wood

[root@localhost opt]# awk 'NR==1||NR==3{print}' bbb.txt //输出第 1 行、第 3 行内容

this is

wood

[root@localhost opt]# awk '(NR%2)==1{print}' bbb.txt //输出所有奇数行的内容

this is

wood

the wood

[root@localhost opt]# awk '(NR%2)==0{print}' bbb.txt //输出所有偶数行的内容

the wood

wod

this is test

[root@localhost opt]# awk '/^the/{print}' bbb.txt //输出所有以the开头的行

the wood

the wood

[root@localhost opt]# awk '/wood$/{print}' bbb.txt //输出所有以wood结尾的行

the wood

wood

the wood

[root@localhost opt]# awk 'BEGIN {x=0};//bin/bash$/{x++};END {print x}' /etc/passwd

2 //统计以/bin/bash 结尾的行数,等同于 grep -c "/bin/bash$" /etc/passwd

[root@localhost opt]# awk 'BEGIN {RS=""};END{print NR}' httpd.txt //统计以空行分隔的文本段落数

38

2)按字段输出文本

[root@localhost opt]# vim bbb.txt //编辑文本内容

this is txt

the wood aaa

wood is bbb //编辑添加内容

wod is ccc

the wood AAA

this is test

~

~

:wq //保存退出

[root@localhost opt]# awk '{print $3}' bbb.txt //输出每行中(以空格或制表位分隔)的第 3 个字段

txt

aaa

bbb

ccc

AAA

test

[root@localhost opt]# awk '{print $1,$3}' bbb.txt //输出每行中的第 1、3 个字段

this txt

the aaa

wood bbb

wod ccc

the AAA

this test

[root@localhost opt]# awk -F ":" '$2=="*"{print}' /etc/shadow //输出密码为“*”的用户的shadow记录

bin:*:17110:0:99999:7:::

daemon:*:17110:0:99999:7:::

adm:*:17110:0:99999:7:::

lp:*:17110:0:99999:7:::

sync:*:17110:0:99999:7:::

shutdown:*:17110:0:99999:7:::

halt:*:17110:0:99999:7:::

mail:*:17110:0:99999:7:::

operator:*:17110:0:99999:7:::

games:*:17110:0:99999:7:::

ftp:*:17110:0:99999:7:::

nobody:*:17110:0:99999:7:::

[root@localhost opt]# awk 'BEGIN{FS=":"};$2=="*";END{print}' /etc/shadow

bin:*:17110:0:99999:7::: //输出密码为“*”的用户的shadow记录

daemon:*:17110:0:99999:7:::

adm:*:17110:0:99999:7:::

lp:*:17110:0:99999:7:::

sync:*:17110:0:99999:7:::

shutdown:*:17110:0:99999:7:::

halt:*:17110:0:99999:7:::

mail:*:17110:0:99999:7:::

operator:*:17110:0:99999:7:::

games:*:17110:0:99999:7:::

ftp:*:17110:0:99999:7:::

nobody:*:17110:0:99999:7:::

named:!!:18178::::::

[root@localhost opt]# awk -F ":" '$7~"/bash"{print $1}' /etc/passwd

root //输出以冒号分隔且第 7 个字段中包含/bash 的行的第 1 个字段

sun

[root@localhost opt]# awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services

nfs 2049/tcp //输出包含 8 个字段且第 1 个字段中包含 nfs 的行的第 1、2 个字段

nfs 2049/udp

nfs 2049/sctp

netconfsoaphttp 832/tcp

netconfsoaphttp 832/udp

netconfsoapbeep 833/tcp

netconfsoapbeep 833/udp

[root@localhost opt]# awk -F ":" '($7!="/bin/bash")&&($7!="/sbin/nologin"){print}' /etc/passwd

sync:x:5:0:sync:/sbin:/bin/sync //输出第 7 个字段既不为/bin/bash 也不为/sbin/nologin 的所有行

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

3)通过管道、双引号调用 Shell 命令

[root@localhost opt]# awk -F : '/bash/{print | "wc -l"}' /etc/passwd

2 //调用wc -l 命令统计使用bash 的用户个数,等同于 grep -c "bash$" /etc/passwd

[root@localhost opt]# awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'

1 //调用w 命令,并用来统计在线用户数,使用while循环匹配w 命令输出行数,getline为只显示行数,n-2为减去前两行

[root@localhost opt]# awk 'BEGIN { "hostname" | getline ; print $0}'

localhost.localdomain //调用hostname,并输出当前的主机名

写在最后:

本专栏所有文章均为南京课工场学员投稿,如有问题欢迎指出讨论,未经允许,禁止转载!

shell 倒数第n列_【零基础学云计算】Shell编程之正则表达式(三)相关推荐

  1. pandas打印某一列_零基础学Python--不得不说的Pandas小技巧

    在前面的文章里,我介绍了如何使用Pandas去读写一个CSV文件,其实Pandas的功能还不仅仅限于此,它还可以读写Excel.Hdf.html.Json等多种文件格式.除此以外,Pandas还拥有众 ...

  2. 零基础学Java语言---编程题

    零基础学Java语言-编程题 注意:没有上机实际测过,代码仅供参考 1.温度转换 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示 ...

  3. 零基础学Java需要先具备的三项技能

    随着互联网的发展,许多公司都在招Java工程师,很多零基础的Java小白看中了Java的高薪资,也都想转行做Java,但是零基础学Java需要先具备哪些技能呢?本文小千整理了零基础学Java需要先具备 ...

  4. 【零基础学Java】—List集合(三十九)

    [零基础学Java]-List集合(三十九) java.util.list接口 extends Collection接口 list接口的特点: 1.有序的集合,存储元素和取出元素的顺序是一致的(存储1 ...

  5. 【零基础学Java】—System类(三十五)

    [零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...

  6. 【零基础学Java】—Calendar类(三十四)

    [零基础学Java]-Calendar类(三十四) java.util.Calendar日历类 Calendar类是一个抽象类,里面提供了很多操作日历字段的方法 Calendar类无法直接创建对象,里 ...

  7. 【零基础学Java】—this关键字的三种用法+Java继承的三个特点(二十一)

    [零基础学Java]-this关键字的三种用法+Java继承的三个特点(二十一) 一.this关键字的三种用法 在本类的成员方法中,访问本类的成员变量 在本类的成员方法中,访问本类的另一个成员方法 在 ...

  8. 不要说零基础学不好UG编程,看完你就有方向了

    零基础怎么学UG编程,看完你就懂了 不要说零基础学不好UG编程,看完你就有方向了 众所周知UG编程师是一份工资待遇很不错的工作,而且还特别轻松 怎么样才能成为UG编程师呢? 打个比方,以前有很多人都在 ...

  9. keil debug如何在watch直接修改变量值_零基础学VBA:什么是VBA?如何编写和运行VBA代码?...

    HI,大家好,我是星光,今天咱们来继续学习VBA.在上一章咱们讲了为什么要学习VBA~VBA还值不值得学~学了还有没有用~零基础学VBA编程01:VBA还能不能学?学了还有没有用? 这一章咱们再来简单 ...

  10. python 智能造句_[零基础学Python]正规地说一句话

    小孩子刚刚开始学说话的时候,常常是一个字一个字地开始学,比如学说"饺子",对他/她来讲,似乎有点难度,大人也聪明,于是就简化了,用"饺饺"来代替,其实就是让孩子 ...

最新文章

  1. 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?
  2. perl 计算多维数组的行数,以及每行的元素数
  3. 冬奥会测试赛,助理裁判竟然是个AI!
  4. python装饰器实例-python 装饰器(三):装饰器实例(一)
  5. Docker selenium自动化 - 修改/dev/shm路径大小实例演示,“session deleted because of page crash“问题解决
  6. Python IDLE无法显示行号、Python IDLE shell里运行py文件
  7. 系统上线后关键用户的工作建议
  8. JAVA数据库访问设置的实验_实验十一 连接数据库实验(V2.0)
  9. 安卓APP_ 控件(7)——Toolbar栏目样式
  10. paip.前端加载时间分析之道优化最佳实践
  11. ipq4029 高通 芯片 openwrt 资料收集
  12. 电商大促作战指南之全链路压测
  13. intel服务器最新主板芯片组,Intel C200芯片组:入门级、发烧友至爱_Intel服务器主板_服务器评测与技术-中关村在线...
  14. 联想电脑(xx%电量可用已连接适配器,未充电)解决方法
  15. caxa自动保存的文件在哪里_CAXA CAD教程之软件临时文件的清理
  16. 给即将步入大学的学子们的一封信
  17. 多个jdk配置环境变量
  18. C# 后台处理 webp图片
  19. 短信验证码是什么?短信验证码是什么意思
  20. 数据库基础(面试常见题)

热门文章

  1. Vue深入学习4—指令和生命周期
  2. Android doc |Getting Started|部分 转载 --管理Activity生命周期
  3. 2021-07-07IF神经元模型
  4. python接收易语言dll消息_易语言[项目开发]-插件信息提取程序源码,易语言获取DLL文件信息...
  5. memchache的数据类型_memcache详解
  6. 跟小廖一起学习Python正则表达式!
  7. php yii框架连接数据库,【PHP开发框架】yii框架怎样衔接数据库
  8. evoc服务器长鸣报警显示正常,研祥工业服务器出大事了!
  9. 未来的计算机作文 800字,未来科技作文800字
  10. java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章