shell 倒数第n列_【零基础学云计算】Shell编程之正则表达式(三)
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编程之正则表达式(三)相关推荐
- pandas打印某一列_零基础学Python--不得不说的Pandas小技巧
在前面的文章里,我介绍了如何使用Pandas去读写一个CSV文件,其实Pandas的功能还不仅仅限于此,它还可以读写Excel.Hdf.html.Json等多种文件格式.除此以外,Pandas还拥有众 ...
- 零基础学Java语言---编程题
零基础学Java语言-编程题 注意:没有上机实际测过,代码仅供参考 1.温度转换 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示 ...
- 零基础学Java需要先具备的三项技能
随着互联网的发展,许多公司都在招Java工程师,很多零基础的Java小白看中了Java的高薪资,也都想转行做Java,但是零基础学Java需要先具备哪些技能呢?本文小千整理了零基础学Java需要先具备 ...
- 【零基础学Java】—List集合(三十九)
[零基础学Java]-List集合(三十九) java.util.list接口 extends Collection接口 list接口的特点: 1.有序的集合,存储元素和取出元素的顺序是一致的(存储1 ...
- 【零基础学Java】—System类(三十五)
[零基础学Java]-System类(三十五) java.lang.System 类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作 在System类的API文档中,常用的方法有: pub ...
- 【零基础学Java】—Calendar类(三十四)
[零基础学Java]-Calendar类(三十四) java.util.Calendar日历类 Calendar类是一个抽象类,里面提供了很多操作日历字段的方法 Calendar类无法直接创建对象,里 ...
- 【零基础学Java】—this关键字的三种用法+Java继承的三个特点(二十一)
[零基础学Java]-this关键字的三种用法+Java继承的三个特点(二十一) 一.this关键字的三种用法 在本类的成员方法中,访问本类的成员变量 在本类的成员方法中,访问本类的另一个成员方法 在 ...
- 不要说零基础学不好UG编程,看完你就有方向了
零基础怎么学UG编程,看完你就懂了 不要说零基础学不好UG编程,看完你就有方向了 众所周知UG编程师是一份工资待遇很不错的工作,而且还特别轻松 怎么样才能成为UG编程师呢? 打个比方,以前有很多人都在 ...
- keil debug如何在watch直接修改变量值_零基础学VBA:什么是VBA?如何编写和运行VBA代码?...
HI,大家好,我是星光,今天咱们来继续学习VBA.在上一章咱们讲了为什么要学习VBA~VBA还值不值得学~学了还有没有用~零基础学VBA编程01:VBA还能不能学?学了还有没有用? 这一章咱们再来简单 ...
- python 智能造句_[零基础学Python]正规地说一句话
小孩子刚刚开始学说话的时候,常常是一个字一个字地开始学,比如学说"饺子",对他/她来讲,似乎有点难度,大人也聪明,于是就简化了,用"饺饺"来代替,其实就是让孩子 ...
最新文章
- 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?
- perl 计算多维数组的行数,以及每行的元素数
- 冬奥会测试赛,助理裁判竟然是个AI!
- python装饰器实例-python 装饰器(三):装饰器实例(一)
- Docker selenium自动化 - 修改/dev/shm路径大小实例演示,“session deleted because of page crash“问题解决
- Python IDLE无法显示行号、Python IDLE shell里运行py文件
- 系统上线后关键用户的工作建议
- JAVA数据库访问设置的实验_实验十一 连接数据库实验(V2.0)
- 安卓APP_ 控件(7)——Toolbar栏目样式
- paip.前端加载时间分析之道优化最佳实践
- ipq4029 高通 芯片 openwrt 资料收集
- 电商大促作战指南之全链路压测
- intel服务器最新主板芯片组,Intel C200芯片组:入门级、发烧友至爱_Intel服务器主板_服务器评测与技术-中关村在线...
- 联想电脑(xx%电量可用已连接适配器,未充电)解决方法
- caxa自动保存的文件在哪里_CAXA CAD教程之软件临时文件的清理
- 给即将步入大学的学子们的一封信
- 多个jdk配置环境变量
- C# 后台处理 webp图片
- 短信验证码是什么?短信验证码是什么意思
- 数据库基础(面试常见题)
热门文章
- Vue深入学习4—指令和生命周期
- Android doc |Getting Started|部分 转载 --管理Activity生命周期
- 2021-07-07IF神经元模型
- python接收易语言dll消息_易语言[项目开发]-插件信息提取程序源码,易语言获取DLL文件信息...
- memchache的数据类型_memcache详解
- 跟小廖一起学习Python正则表达式!
- php yii框架连接数据库,【PHP开发框架】yii框架怎样衔接数据库
- evoc服务器长鸣报警显示正常,研祥工业服务器出大事了!
- 未来的计算机作文 800字,未来科技作文800字
- java eden区_(转)可能是把Java内存区域讲的最清楚的一篇文章