Linux 三剑客命令之 awk 详解

news2024/11/19 0:38:11

目录

一、Awk 实战讲解

1.1 awk 的原理

1.2 BEGIN 和 END 模块

1.3 运算符

1.4 常用 awk 内置变量

1.5 awk 正则

1.6 awk 常用字符串函数


一、Awk 实战讲解

        awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk 将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。

1.1 awk 的原理

通过一个简短的命令,我们来了解其工作原理:

$ awk '{print $0}' /etc/passwd
$ echo hhh | awk '{print "hello,world"}'
$ awk '{ print "hiya" }' /etc/passwd

        你将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与执行 cat /etc/passwd 完全相同。

        现在,解释 { print } 代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。

再次说明,awk 对输入文件中的每一行都执行这个脚本。

$ awk -F":" '{ print $1 }' /etc/passwd
$ awk -F":" '{ print $1 $3 }' /etc/passwd
$ awk -F":" '{ print $1 " " $3 }' /etc/passwd
$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd

1.2 BEGIN 和 END 模块

        通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,
可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许
您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开始处理输入文
件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它
在程序中以后会引用的全局变量的极佳位置。

        awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行
这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

1.3 运算符

  • awk 赋值运算符

a+5;等价于: a=a+5; 其他同类

[root@master1-admin ~]# awk 'BEGIN{a=5;a+=5;print a}'
10
  • awk 逻辑运算符
[root@master1-admin ~]# awk 'BEGIN{a=1;b=2;print(a>2&&b>1,a=1||b>1)}'
0 1
  • awk 正则运算符 
[root@master1-admin ~]# awk 'BEGIN{a="100testaaa";if(a~/100/){print "ok"}}'
ok

[root@master1-admin ~]# echo | awk 'BEGIN{a="100testaaa"}a~/100/{print "ok"}'
ok
  • 关系运算符

        如:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照 ascii 码顺序比较。 

[root@master1-admin ~]# awk 'BEGIN{a="11";if(a>=9){print "ok"}}'
[root@master1-admin ~]# awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
ok
[root@master1-admin ~]# awk 'BEGIN{a;if(a>=b){print "ok"}}'
ok
  • awk 算术运算符

说明,所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为 0。

[root@master1-admin ~]# awk 'BEGIN{a="b";print a++,++a}'
0 2

[root@master1-admin ~]# awk 'BEGIN{a="20b4";print a++,++a}'
20 22

1.4 常用 awk 内置变量

  • 字段分隔符 FS

FS="\t" 一个或多个 Tab 分隔

[root@master1-admin ~]# vim tab.txt
ww	CC	IDD

[root@master1-admin ~]# awk 'BEGIN{FS="\t+"}{print $1,$2,$3}' tab.txt
ww CC IDD 

FS="[[:space:]+]" 一个或多个空白空格,默认的

[root@master1-admin ~]# vim space.txt
we are    studing awk now!

[root@master1-admin ~]# awk -F [[:space:]+] '{print $1,$2,$3,$4,$5}' space.txt
we are 

[root@master1-admin ~]# awk -F [[:space:]+] '{print $1,$2}' space.txt
we are

FS="[" ":]+" 以一个或多个空格或:分隔

[root@master1-admin ~]# vim hello.txt
root:x:0:0:root: /root:/bin/bash

[root@master1-admin ~]# awk -F [" ":]+ '{print $1,$2,$3}' hello.txt
root x 0
  • 字段数量 NF

[root@master1-admin ~]# vim hello.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin:888

[root@master1-admin ~]# awk -F ":" 'NF==8{print $0}' hello.txt
bin:x:1:1:bin:/bin:/sbin/nologin:888
  • 记录数量 NR
[root@master1-admin ~]# ifconfig ens32
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.78.135  netmask 255.255.255.0  broadcast 192.168.78.255
        inet6 fe80::20c:29ff:fe2e:bef7  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:2e:be:f7  txqueuelen 1000  (Ethernet)
        RX packets 3553  bytes 295498 (288.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13802  bytes 1002340 (978.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@master1-admin ~]# ifconfig ens32 | awk -F [" ":]+ 'NR==2{print $3}'
192.168.78.135
  • RS 记录分隔符变量

        将 FS 设置成 "\n" 告诉 awk 每个字段都占据一行。通过将 RS 设置成 "",还会告诉 awk
每个地址记录都由空白行分隔。 

[root@master1-admin ~]# vim recode.txt
Jimmy the Weasel
100 Pleasant Drive
San Francisco, CA 12345

Big Tony
200 Incognito Ave.
Suburbia, WA 67890

[root@master1-admin ~]# vim awk.txt
#!/bin/awk
BEGIN {
    FS="\n"
    RS=""
}
{
    print $1 ", " $2 ", " $3
}

[root@master1-admin ~]# awk -f awk.txt recode.txt
Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345
Big Tony, 200 Incognito Ave., Suburbia, WA 67890
  • OFS 输出字段分隔符

[root@master1-admin ~]# awk 'BEGIN{FS=":"}{print $1","$2","$3}' hello.txt
root,x,0
bin,x,1
[root@master1-admin ~]# awk 'BEGIN{FS=":";OFS="#"}{print $1,$2,$3}' hello.txt
root#x#0
bin#x#1
  •  ORS 输出记录分隔符

[root@master1-admin ~]# vim awk.txt
#!/bin/awk
BEGIN {
    FS="\n"
    RS=""
    ORS="\n\n"
}
{
    print $1 ", " $2 ", " $3
}

[root@master1-admin ~]# awk -f awk.txt recode.txt
Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345

Big Tony, 200 Incognito Ave., Suburbia, WA 67890

1.5 awk 正则

  • 规则表达式

        awk '/REG/{action} ' file,/REG/ 为正则表达式,可以将 $0 中,满足条件的记录送入到:
action 进行处理 

[root@master1-admin ~]# awk '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@master1-admin ~]# awk -F : '$5~/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

# 取出 ip
[root@master1-admin ~]# ifconfig ens32 | awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $3}'
192.168.78.135
  • 布尔表达式

awk '布尔表达式{action}' file 仅当对前面的布尔表达式求值为真时,awk 才执行代码块。

[root@master1-admin ~]# awk -F: '$1=="root"{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

[root@master1-admin ~]# awk -F: '($1=="root")&&($5=="root"){print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

1.6 awk 常用字符串函数

  • 替换

        在 info 中查找满足正则表达式,/[0-9]+/ 用 ”!” 替换,并且替换后的值,赋值给 info 未给 info 值,默认是 $0 

[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}'
this is a test!test!
  • 查找
# 未找到,返回 0
[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
ok
  • 匹配查找 

如果查找到数字则匹配成功返回 ok,否则失败,返回未找到 

[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'
ok
  • 截取
# 从第 4 个 字符开始,截取 10 个长度字符串
[root@master1-admin ~]# awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes
  • 分割
# 分割 info,动态创建数组 tA,awk for ...in 循环,是一个无序的循环。并不是从数组下标 1...n 开始
[root@master1-admin ~]# awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}'
4
4 test
1 this
2 is
3 a

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

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

相关文章

Fisco Bcos区块链五(后端区块链应用开发框架及流程)

文章目录项目框架&#xff1a;开发流程&#xff1a;1、创建一个Java工程2、引入FISCO BCOS Java SDK3、配置SDK证书4、业务逻辑开发第一步.将3编译好的Java合约引入项目中第二步.开发业务逻辑5. 运行应用项目框架&#xff1a; |-- build.gradle // gradle配置文件 |-- gradle …

element-ui组件的使用,导航菜单(NavMenu)组件、分页组件的使用

一、ElementUI 1、简介&#xff1a;是饿了么公司推出的基于Vue2的组件库 2、使用方法&#xff1a;具体可见官网https://element.eleme.cn/#/zh-CN/component/installation ​ &#xff08;1&#xff09;在vue项目中安装&#xff1a;npm install element-ui ​ &#xff08;…

win10 在线、离线安装microsoft store 版 WSL

实验环境&#xff1a; 操作系统&#xff1a;windows版本 10.0.19045.2486 WSL版本&#xff1a;Microsoft.WSL_1.0.3.0_x64_ARM64.msixbundle 离线安装 获取WSL安装包&#xff1a; 在此页面获取发布网址&#xff1a; Microsoft Store 中适用于 Linux 的 Windows 子系统的发行…

深度卷积对抗神经网络 基础 第七部分 StyleGAN

深度卷积对抗神经网络 基础 第七部分 StyleGAN 深度卷积神经网络模型已经应用在非常多的领域&#xff0c;但是其总包含了很多潜在的问题&#xff0c;比如说训练速度过慢&#xff0c;生成器与判别器的进化程度不平衡等等。那么&#xff0c;随着各种方法和算法的普及和进化&…

就业秘籍!这些软件测试的面试话术你要知道

近些年&#xff0c;各行各业找工作都不太容易&#xff0c;虽然身处技术岗位的软件测试因企业需求大&#xff0c;要比之其他行业容易&#xff0c;但&#xff0c;稍有不慎&#xff0c;也会让求职者与自己心仪的offer失之交臂&#xff0c;因此&#xff0c;大家在准备前面前&#x…

关键点匹配——商汤LoFTR源码详解

源码地址见文末 1.项目与参数配置解读 首先,进入目录,使用pip install -r requirements.txt配置环境。 首先,对于demo的运行,首先需要准备好需要用于关键点匹配的数据,提供的代码中置于了image文件夹下,然后是训练的权重,代码中下载了室内场景和室外场景的训练权重。 …

抓包展示vlan报文(8021Q)

VLAN数据帧格式要使交换机能够分辨不同VLAN的报文&#xff0c;需要在报文中添加标识VLAN信息的字段。IEEE 802.1Q协议规定&#xff0c;在以太网数据帧的目的MAC地址和源MAC地址字段之后、协议类型字段之前加入4个字节的VLAN标签&#xff08;又称VLAN Tag&#xff0c;简称Tag&am…

什么护眼台灯比较专业?2023央视推荐的护眼灯

台灯作为最常见的照明工具&#xff0c;也是因为有许多孩子都有近视的现象&#xff0c;从儿童青少年的近视人数可以看出&#xff0c;我国的近视人数是全国第一的&#xff0c;所以选择一款好的护眼台灯是很关键的&#xff0c;有哪些专业的护眼台灯呢&#xff1f;挑选台灯最主要是…

vue 使用 wangeditor 富文本编辑器

wangeditor 是一个轻量级 web 富文本编辑器&#xff0c;配置方便&#xff0c;使用简单。 1&#xff09;安装 wangeditor 终端安装 wangeditor 库&#xff1a; yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save2&#xff09;页面绑定 创建一个 xxx.…

unity 关于UV坐标算点 和 PerlinNoise(柏林噪声)

生成相关效果代码如下&#xff1a; public int w 100;public int h 100;public Texture2D texture;public Image image;public Color tu Color.yellow;public Color cao Color.green;// Start is called before the first frame updatevoid Start(){texture new Texture2D…

剑指 Offer II 007. 数组中和为 0 的三个数

题目链接 剑指 Offer II 007. 数组中和为 0 的三个数 mid 题目描述 给你一个整数数组 nums&#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]]满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0。 请你返回所有和为 0 且不重复的三…

软件测试岗位会消失么

只要互联网还在发展&#xff0c;软件测试岗位就一直被需要&#xff01; 软件测试已经不再只是点点点了&#xff0c;如果只停留在点点点&#xff0c;那么有可能会消失&#xff0c;但是现在测试已经向自动化测试方向发展了 人生如逆水行舟&#xff0c;不进则退。于其浪费时间的…

Golang GC垃圾回收机制理解记录

一、概念对不再使用的是内存资源进行自动回收的功能就叫垃圾回收&#xff08;GC: Garbage Collection&#xff09;二、为什么要有垃圾回收&#xff1f;编程语言需要对内存手动释放&#xff0c;操作繁琐&#xff0c;处理不好会出现内存泄漏&#xff0c;垃圾回收出现使的开发者能…

入门力扣自学笔记234 C++ (题目编号:2325)

2325. 解密消息 题目&#xff1a; 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。 将替换表与普通英文字母表对齐&#xff0c…

ESP32设备驱动-PCF8591数据采集驱动

PCF8591数据采集驱动 1、PCF8591介绍 PCF8591 是一款单片集成、独立电源、低功耗、8 位 CMOS 数据采集设备。 PCF8591 具有四个模拟输入、一个模拟输出和一个串行 I2C 总线接口。 PCF8591 的三个地址引脚 A0、A1 和 A2 可用于硬件地址编程 8 PCF8591 器件允许访问相同的 I2C…

dig命令命令常见用法

dig命令命令常见用法域名结构dig命令命令常见用法安装dig查看本机使用的dns地址使用dot或doh查询域名解析查询A记录查询dns所有记录值any从ip地址反查询域名dig -x检查txt记录是否生效查看DNS是否开启AXFR协议全量区传输功能dig诊断DNS污染只显示域名的解析ip递归解析dig trace…

全球13台 DNS 根服务器,居然没有一台属于中国!

域名系统是最重要的互联网服务之一&#xff0c;没有它&#xff0c;我们将无法访问在线内容&#xff0c;甚至无法发送电子邮件。每当我们尝试连接到其他网站或在线服务时&#xff0c;根 DNS 服务器都会帮助我们的计算机找到并到达我们想要的地址。 DNS 根服务器是所有 DNS 的组…

MySQL-JDBC反序列化分析

0x01 前言 听师傅们说这条链子用的比较广泛&#xff0c;所以最近学一学&#xff0c;本来是想配合着 tabby 或是 codeql 一起看的&#xff0c;但是 tabby 的环境搭建一直有问题&#xff0c;耽误了很久时间&#xff0c;所以就直接看了 0x02 JDBC 的基础 本来不太想写这点基础的…

LaTeX使用enumitem包切换enumerate标签样式

一、直接使用enumerate 源码&#xff1a; \documentclass{article} \begin{document} \section{LaTeX Style Sample} There is nothing to show, thank you for reading. \begin{enumerate}\item Apple is a kind of fruit.\item Cat is a kind of animal.\item Butterfly is …

git commit之后,回退撤销commit

在commit之后&#xff0c;发现有不需要提交的文件被提交上去了&#xff0c;好在还没有push到远端&#xff0c;需要撤回重新提交。如果是用的是Sourcetree的话,打开Sourcetree操作如下&#xff1a;找到提交之前的版本的记录右键这条提交记录&#xff0c;点击 将xxx重置到这次提交…