文本三剑客awk:命令讲解

news2024/11/28 13:41:55

awk-命令讲解:

一、awk:

1.定义:

(1)在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔。并按模式或者条件执行编辑命令。AMK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理。

(2)可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell脚本,完成各种自动化配置任务。

(3)总结:按命令找到指定行然后打印,awk默认操作是打印。

2.格式:

awk ‘(操作符) (怎么做)’ (处理对象)

3.工作过程:

(1)执行BEGIN{action;…}语句块中的语句。

(2)从文件或标准输入(stdin)中读取一行,然后执行{action;…}语句块,逐行扫描文件,从第一行到最后一行重复执行,直到文件全部读取完成。

(3)当读至输入流末尾时,执行END{action;…}语句块,BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

(4)总结:先看BEGIN{action},这个模块读取操作,读文件的所有行,所有读取完毕后,一次执行。END{action}打印输出结果,对前面的结果作条件判断,还可用代码操作。

4.工作原理:

sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

5.常用选项:

(1)常用:

选项作用
-F “分隔符”指明输入时用到的字段分隔符,默认是若干个连续的空白符
-v变量赋值

(2)常用符号:

选项作用
‘’‘模式或条件{操作}’,{}外指定条件,{}内指定条件
,指定连续的行
||指定不连续的行
&&表示且

(3)内置变量(不能用双引号,否则会被系统识别成字符串):

选项作用
$0打印当前处理行的所有内容
$n对当前处理行的第n个字段(第n列)
NR当前处理行的行号(序数)
NF当前处理行的n个字段
FS列分隔符,指定每行文本的字段分隔符,输入内容的分隔符,默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用=“”
OFS输出内容的列分隔符
RS行分隔符。awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是"\n"
Fillname被处理的文件名

(4)基本打印用法:

1.[root@test1 opt]# awk '0{print}' test.txt  # 0和1放置{ }前,能够起到限制打印内容的作用(默认为"1"),如果为0,就不打印内容
[root@test1 opt]# awk '1{print}' test.txt 
bk
pp
chanyeol
baekhyun
2. [root@test1 opt]# awk '{print $0}' test.txt #$0,代表整行内容;awk是逐行读取处理,配合$0,就是打印所有内容
$1只取第一列,可以对行切片,输出列
bk
pp
chanyeol
baekhyun
[root@test1 opt]# awk '{print NR}' test.txt #打印行号
1
2
3
4
[root@test1 opt]# awk '{print NR,$0}' test.txt #打印行号和内容
1 bk
2 pp
3 chanyeol
4 baekhyun
3. [root@test1 opt]# awk 'NR==3{print}' test.txt #指定打印第三行
chanyeol
[root@test1 opt]# awk 'NR==2,NR==4{print}' test.txt #指定打印2-4行
pp
chanyeol
baekhyun
[root@test1 opt]# awk 'NR==2;NR==4{print}' test.txt #指定打印第二行,第四行
pp
baekhyun
[root@test1 opt]# awk '(NR>=2)&&(NR<=4){print}' test.txt #用正则表达式打印2-4行
pp
chanyeol
baekhyun

(2)奇偶行打印:

[root@test1 opt]# awk 'NR%2==0{print}' test.txt #偶数行打印
pp
baekhyun
[root@test1 opt]# awk 'NR%2==1{print}' test.txt #奇数行打印
bk
chanyeol

(3)运算:

[root@test1 ~]# awk 'BEGIN{print 100+200}'
300
[root@test1 ~]# awk 'BEGIN{print 10.2*5.5}'
56.1
[root@test1 ~]# awk 'BEGIN{print 10.2/5.5}'
1.85455
[root@test1 ~]# awk 'BEGIN{print 2^5}'
32

二、内置函数:

1.getline的工作过程:

(1)当getline左右无重定向符号(“<”,“>”)或者管道符号(“|”)时,awk首先读取的是第一行,而getline获取的是光标跳转至下一行的内容(也就是第二行)。

(2)当getline左右有管道符号或重定向符时,getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入。

2.打印:

(1)基本运用:

[root@test1 opt]# awk '{print $0;getline}' test.txt #打印奇数行
bk
chanyeol
[root@test1 opt]# awk '{getline;print $0}' test.txt #打印偶数行
pp
baekhyun

(2)总结:

  • getline是awk的内置函数。
  • 没有重定向,管道符,就打印奇偶行。
  • 重定向从指定文件获取内容,管道符相当于赋值变量。

3.文件内容匹配过滤打印:

(1)基础打印:

1.[root@test1 opt]# awk '/^root/{print}' /etc/passwd #只匹配以root开头的行
root:x:0:0:root:/root:/bin/bash
2.[root@test1 opt]# awk '/root/{print}' /etc/passwd #只匹配包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
3.[root@test1 opt]# awk '/bash$/{print}' /etc/passwd #只匹配以bash结尾的行
root:x:0:0:root:/root:/bin/bash
wang:x:1000:1000:wang:/home/wang:/bin/bash
billkin:x:1001:1001::/home/billkin:/bin/bash
pp:x:1002:1002::/home/pp:/bin/bash
chanyeol:x:1003:1003::/home/chanyeol:/bin/bash
baekhyun:x:1004:1004::/home/baekhyun:/bin/bash
chanbaek:x:1005:1005::/home/chanbaek:/bin/bash
suho:x:1006:1006::/home/suho:/bin/bash

4.BEGIN,END模式:

(1)BEGIN打印模式:

  • 格式:awk ‘BEGIN{…};{…};END{…}’ 文件
  • 处理过程:在awk处理指定的文本之前,需要先执行BEGIN{…}模式里的命令操作。中间的{…} 是真正用于处理文件的命令操作,在awk处理完文件后才会执行END{…}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。
  • 固定格式:awk ‘BEGIN{X=1}(初始条件);{x++}(命令操作);END{print x}(打印结果)’ 文件名

(2)运用:

1. [root@test1 opt]# awk 'BEGIN{x=1};{x++};END{print x}' test1.txt
5
2.[root@test1 opt]# head -n5 /etc/passwd |awk  -F: '{print $1}' #以冒号为分割,打印第一列
root
root
bin
daemon
adm
lp

(3)-v 变量赋值:

1. [root@test1 opt]# fs=":";awk -v FS=$fs -v OFS="+" '{print $1,$3}' /etc/passwd 
root+0 # fs的列分隔符是:,然后使用-v给FS赋值=:,输入的时候FS是:,-v给OFS赋值输出的时候变量为+,然后打印第一列和第三列
bin+1
daemon+2
adm+3
lp+4
sync+5
shutdown+6
2. [root@test1 opt]# echo $PATH | awk -v RS=':' '{print $1}' #换行输出
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

5.条件判断打印:

(1)指定区间打印:

[root@test1 opt]# awk -F : '$3>500{print $0}' /etc/passwd #uid大于500的
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin

(2)取反打印:

[root@test1 opt]# awk -F : '!$3<=10{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

(3)用if做条件判断来打印:

[root@test1 opt]# awk -F : '{if($3>10){print $0}}' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin #使用了if语句,内部条件(),外部条件{},整个加{}作为一条语句执行,相当于嵌套语法

三、awk的三元表达式:

1.格式:

(1)awk ‘(条件表达式)?(A表达式或者值):(B表达式或者值)’

(2)运用:

[root@test1 opt]# awk -F: '{max=($3>=$4)?$3:$4;{print max,$0}}' /etc/passwd|sed -n '1,6p'

在这里插入图片描述

2.awk的精确筛选:

(1)常用选项:

选项作用
$n(> < ==)用于对比数值
$n~“字符串”代表第n个字段包含某个字符串
$n!~“字符串”代表第n个字段不包含某个字符串
$n==“字符串”代表第n个字段为某个字符串
$n!=“字符串”代表第n个字段不为某个字符串
$NF代表最后一个字段

(2)基础运用:

1. [root@test1 opt]# awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd 
root /bin/bash # 输出第七个字段包含“bash”所在行的第一个字段和最后一个字段
wang /bin/bash
billkin /bin/bash
pp /bin/bash
chanyeol /bin/bash
baekhyun /bin/bash
chanbaek /bin/bash
suho /bin/bash
2.[root@test1 opt]# awk -F: '$7!~"nologin" {print $1,$NF}' /etc/passwd
root /bin/bash # 输出第七个字段不包含“nologin”所在行的第一个字段和最后一个字段
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
wang /bin/bash
billkin /bin/bash
pp /bin/bash
chanyeol /bin/bash
baekhyun /bin/bash
chanbaek /bin/bash
suho /bin/bash
3.[root@test1 opt]# awk -F: '($6=="/home/wang")&&($7=="/bin/bash"){print $1,$NF}' /etc/passwd
wang /bin/bash指定第六个字段为/home/wang,第七个字段为/bin/bash,输出满足这些条件所在行的第一个和最后一个字段

3.数组:

(1)基础运用:

1.[root@test1 opt]# awk 'BEGIN{a[0]=1;a[1]=2;a[2]=3;print a[1]}' 
2
2.[root@test1 opt]# awk 'BEGIN{a[0]=10 ; a[1]=20 ; a[2]=30;for(i in a)print i,a[i]}' #数组遍历
0 10
1 20
2 30

(2)去重:

[root@test1 opt]# awk '{a[$1]++};END{for(i in a){print i,a[i]}}' test1.txt  
baekhyun 1
chanyeol 1
pp 3
bk 3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

006-从零搭建微服务-注册中心(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 核心依赖 需要注册配置中心的服务引入下面 …

步进电机基本原理及驱动方式详解

步进电机基本原理及驱动方式详解 步进电机相关概念基本原理类型和结构转子结构定子结构 励磁方式ATD9800 驱动使用实例 参考文献 步进电机相关概念 步进电机是一种常用于控制和定位应用的电动机&#xff0c;其独特的工作方式使其在许多领域中都具有广泛的应用。步进电机以其 精…

正态总体下常见的抽样分布

1.正态总体下常见的抽样分布 本人博客&#xff1a;总体分布、样本分布、抽样分布的区别 本人博客&#xff1a;三大抽样分布 正态总体下常见的抽样分布意思是&#xff1a;样本来自服从正态分布的总体中&#xff0c;从样本中抽样后得到的分布 1.1 单个正态总体下的抽样分布&…

【高危】GitLab CE/EE 存在存储型XSS漏洞

漏洞描述 GitLab 是一款基于Git的代码托管、版本控制、协作开发平台。 在 GitLab CE/EE 15.11 至 15.11.6 版本以及 16.0 至 16.0.1 版本中&#xff0c;当GitLab导入GitHub仓库时&#xff0c;如果GitHub仓库中包含由用户构造的恶意JavaScript代码的标签颜色&#xff0c;解析这…

为什么说程序员和产品经理一定要学一学PMP

要回答为什么说程序员和产品经理一定要学一学PMP&#xff1f;我们得先看一下PMP包含的学习内容。PMP新版考纲备考参考资料绝大多数涉及IT项目的敏捷管理理念。主要来源于PMI推荐的10本参考书&#xff1a; 《敏捷实践指南&#xff08;Agile Practice Guide&#xff09;》 《项目…

Java匿名内部类、invoke方法、动态代理

一、匿名内部类 匿名内部类一般作为方法的参数&#xff0c;这个方法的形参为接口&#xff0c;而实参为匿名内部类&#xff08;可以理解为接口的对象&#xff09;并且重写了接口中的方法。 例如&#xff1a; 定义了一个接口Star&#xff1a; 类型为Star的引用数据类型作为方法s…

关于docker中Nacos启动成功访问不了的情况

书接上回&#xff0c;这段时间在忙学成在线的微服务项目&#xff0c;上次出现了IP修改的问题&#xff0c;有了一定的解决方案&#xff0c;复制别人的虚拟机后如何修改IP_SSSEdward的博客-CSDN博客。 这次docker正常启动了&#xff0c;但是出现了访问不了的情况&#xff0c;但是…

短视频矩阵系统源码打包附赠分享

矩阵系统源码主要有三种框架&#xff1a;Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架&#xff0c;提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架&#xff0c;用于将数据模型、Web应用程序的用户界面和控制器逻…

【备战秋招】Java异常处理

Java程序在执行过程中所发生的异常事件可分为两类&#xff1a; Error&#xff1a;Java虚拟机无法解决的严重问题。如&#xff1a;JVM系统内部错误、资源 耗尽等严重情况。 比如&#xff1a;StackOverflowError和OOM。一般不编写针对性的代码进行处理。 Exception: 其它因编程错…

使用pytorch进行FFT和STFT

首先&#xff0c;我们定义一个波形&#xff0c;幅值分别为20和38&#xff0c;频率为2和13&#xff1a; y 20 sin ⁡ ( 2 π 2 x ) 38 sin ⁡ ( 2 π 13 x ) y20 \sin (2\pi \times 2x)38\sin (2\pi \times 13x) y20sin(2π2x)38sin(2π13x) 采样频率为200Hz&#xff0c;采…

十四届蓝桥杯省赛CB

hinhin可否不要老&#xff0c;令创新高 A 日期统计B 01 串的熵C 冶炼金属D: 飞机降落E: 接龙数列F: 岛屿个数G: 子串简写H: 整数删除I: 景区导游J: 砍树 A 日期统计 #include <bits/stdc.h> using namespace std; #define int long long int #define pii pair<int,int…

VR云探校:解锁不一样的视角,“沉浸式”打卡校园

仲夏六月&#xff0c;又是一年高考时&#xff0c; 高考首战已经正式拉开帷幕&#xff0c; 超千万考生赴考&#xff0c;更有千万考生家长花式赴考。 少年的你披星戴月走过的路&#xff0c;终将会繁华遍地&#xff0c;今天VR全景就为千万考生和家长解锁不一样的视角&#xff0…

java观察者模式例子

观察者模式&#xff1a; 是一种常用的设计模式&#xff0c;它定义了一种一对多的关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象状态发生变化时&#xff0c;它的所有观察者都会收到通知并且自动更新。 在观察者模式中&#xff0c;主题对象通…

Minicap编译及简单使用

什么是MiniCap 官方说法&#xff1a;Minicap提供了一个套接字接口&#xff0c;用于从Android设备流式传输实时屏幕捕获数据。它旨在用作更大程序中的组件&#xff0c;因此仅凭其本身并不是非常有用。例如&#xff0c;它在STF中用于远程控制。 个人理解&#xff1a;Minicap是用…

如何检查 Android 设备是否支持 Widevine DRM

想知道您的 Android 设备是否可以流式传输来自 Netflix 和 Amazon Prime Video 的高清视频&#xff1f;这是检查 Widevine DRM 支持的方法&#xff01; 许多流媒体服务&#xff0c;如 Netflix、Disney、Hulu 等&#xff0c;使用各种类型的数字版权管理 (DRM) 来保护其内容不被…

VulnHub项目:Hogwarts dobby

靶机地址&#xff1a;Hogwarts: Dobby ~ VulnHub 哈利波特也是初中时候最喜欢的电影~Dobby多比是马尔福加的奴隶精灵&#xff0c;出现在第二部密室中&#xff0c;后来被哈利波特的袜子所拯救&#xff0c;成为了一只快乐自由的小精灵&#xff0c;最后它在死亡圣器中&#xff0c…

keil从非0x08000000地址调试STM32单片机程序方法

在使用stm32单片机的串口IAP升级功能时&#xff0c;需要调试bootloader程序和app程序&#xff0c;一般bootloader的程序都是从0x08000000地址开始运行的&#xff0c;使用keil软件可以直接进行仿真&#xff0c;但是如果调试app程序的话&#xff0c;由于它不是从0x08000000地址开…

Java程序判断是否是回文

1 问题 利用java程序判断是否是回文。 2 方法 利用函数库&#xff0c;将输入的字符串倒置&#xff0c;看倒置后的字符串和原来的字符串是否一样&#xff0c;然后得出结论。 package practice; import java.util.Scanner; public class Huiwen { public static void main(St…

【MySQL数据库 | 第五篇】DDl操作数据库

目录 &#x1f914;DDL介绍&#xff1a; &#x1f914;语法详解&#xff1a; 1.查询&#xff1a; 1.查询所有数据库&#xff1a; 示例&#xff1a;查询自带数据库 2.查询当前数据库&#xff1a; 2.创建&#xff1a; 示例&#xff1a;创建一个名字叫做itcast的数据库&…

第一期丨INTERSPEECH 2023 论文预讲会

INTERSPEECH 2023 论文预讲会是由CCF语音对话与听觉专委会、语音之家主办&#xff0c;旨在为学者们提供更多的交流机会&#xff0c;更方便、快捷地了解领域前沿。活动将邀请 INTERSPEECH 2023 录用论文的作者进行报告交流。 INTERSPEECH 2023 论文预讲会第一期邀请到清华大学和…