Linux 命令:awk

1. 写在前面

本文主要介绍 Linux “awk” 命令:“awk” 是另一个强大的文本处理工具,用于处理和操作结构化数据,如日志文件和命令输出。它可以根据需要为我们打印特定的列值。

公众号: 滑翔的纸飞机

2. awk 命令

我们能用 awk 做什么?awk 处理文本数据,不管是从文件来的或者数据流中来的。输入数据被区分为记录和文本域。 awk 一次处理一条记录,一直到输入结束。

  • awk 操作:

(1) 逐行扫描文件;
(2) 将每个输入行分割成字段;
(3) 将输入行/字段与匹配规则进行比较;
(4) 对匹配的行执行操作;

  • 适用于:

(1) 转换数据文件;
(2) 生成格式化报告;

  • 编程结构:

(1) 输出行格式化;
(2) 算术和字符串运算;
(3) 条件和循环;

awk 命令的基本语法是:

awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...  ]

-F fs:指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:;
-f program-file:从脚本文件中读取awk命令;
-v: 后跟var=value,赋值一个用户定义变量;

备注: 示例文本文件:text.txt、text2.txt

cat > ./text.txt
---------------------------------------------------
Dwight Frances manager account 45000
Lindsay Max clerk account 25000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000
Gale Evelina peon sales 15000
Baron Eveline clerk sales 23000
Will Pater peon sales 13000
Christopher Noah director purchase 80000
cat > ./text2.txt
---------------------------------------------------
A    B    CTarun    A12    1
Man    B6    2
Praveen    M42    3

2.1 简单示例

(1)awk 的默认行为

默认情况下,awk 会打印指定文件中的每一行数据。

root@dev:~/linux# awk '{print}' text.txt 
---------------------------------------------------
Dwight Frances manager account 45000
Lindsay Max clerk account 25000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000
Gale Evelina peon sales 15000
Baron Eveline clerk sales 23000
Will Pater peon sales 13000
Christopher Noah director purchase 80000

在上述示例中,没有给出任何模式。因此操作适用于所有行。不带任何参数的 print 参数默认打印整行,因此它可以打印文件的所有行,不会出现失败。

(2)打印与给定模式匹配的行

root@dev:~/linux# awk '/manager/ {print}' text.txt 
---------------------------------------------------
Dwight Frances manager account 45000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000

在上例中,awk 命令会打印所有与 "manager "匹配的行。

**备注:**一个正则表达式匹配一系列字符串。awk 正则表达式样式使用//来包裹,可以是任何一种其他的正则表达式。这是一个例子,打印任何以两个或者更多数字开头的记录的第一个文本域:

root@dev:~/linux# awk '/^[A-B][a-z]/ { print $1,$2 }' text.txt
---------------------------------------------------------------
Baron Eveline

(3)将一行拆分为多个字段

对于每条记录(即行),awk 命令默认以空格字符分割记录,并将其存储在 $n 变量中。如果一行有 4 个字段,则分别存储在 $1、$2、$3 和 $4 中。另外,$0 代表整行。

root@dev:~/linux# awk '{print $1,$2,$5}' text.txt 
---------------------------------------------------
Dwight Frances 45000
Lindsay Max 25000
Jo Richardson 50000
Rosalind Watt 47000
Gale Evelina 15000
Baron Eveline 23000
Will Pater 13000
Christopher Noah 80000

在上例中,$1,$2$5 分别代表姓名和薪金字段。

(4)打印文本中每一行的第一个字段以及用"-"分隔的行号

root@dev:~/linux# awk '{print NR " - " $1,$2 }' text.txt 
-------------------------------------------------------------
1 - Dwight Frances
2 - Lindsay Max
3 - Jo Richardson
4 - Rosalind Watt
5 - Gale Evelina
6 - Baron Eveline
7 - Will Pater
8 - Christopher Noah

在上例中,$1,$2 代表姓名输出行号,“ - ”进行分割;

(5)如果存在,打印任何空行

root@dev:~/linux# awk 'NF == 0 {print NR}' text2.txt 
-------------------------------------------------------------
2

或者

root@dev:~/linux# awk 'NF <= 0 {print NR}' text2.txt 
-------------------------------------------------------------
2

(6) 查找文件中最长一行的长度

root@dev:~/linux# awk '{ if (length($0) > max) max = length($0) } END { print max }'  text.txt 
-------------------------------------------------------------------------------------
40

(7) 计算文件中的行数

root@dev:~/linux# awk 'END { print NR }'  text.txt 
------------------------------------------------------------------
8

(8) 打印超过 35 个字符的行

root@dev:~/linux# awk 'length($0) > 35'  text.txt 
------------------------------------------------------------------
Dwight Frances manager account 45000
Christopher Noah director purchase 80000

(9) 查找/检查任何特定列中的任何字符串

root@dev:~/linux# awk '$1 == "Dwight" { print $0 }' text.txt
------------------------------------------------------------------
Dwight Frances manager account 45000或者:
root@dev:~/linux# awk '{ if($1 == "Dwight") print $0;}' text.txt 
------------------------------------------------------------------
Dwight Frances manager account 45000

(10)打印从 1 到 n 的第一个数字的平方,例如 6

root@dev:~/linux# awk 'BEGIN { for(i=1;i<=6;i++) print "square of", i, "is",i*i; }'
--------------------------------------------------------------------------------
square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
square of 6 is 36

(11) 计算文件大小

root@dev:~/linux# ls -l *.txt | awk '{sum+=$5} END {print sum}'
------------------------------------------------------------------
336

(12) 匹配包含 “manager” 直到 “account"记录

root@dev:~/linux# awk '/manager/,/account/ { print $0 }' text.txt 
------------------------------------------------------------------
Dwight Frances manager account 45000
Jo Richardson manager sales 50000
Rosalind Watt manager account 47000

2.2 awk 中的内置变量

awk 的内置变量包括字段变量–$1、$2、$3 等($0 表示整行)–它们将一行文本分割成单个单词或称为字段的片段。

变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真,则进行忽略大小写的匹配
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出字段分隔符,默认值与输入字段分隔符一致
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)

2.2.1 示例

(1)使用 NR 内置变量(显示行号)

root@dev:~/linux# awk '{print NR,$0}' text.txt 
---------------------------------------------------
1 Dwight Frances manager account 45000
2 Lindsay Max clerk account 25000
3 Jo Richardson manager sales 50000
4 Rosalind Watt manager account 47000
5 Gale Evelina peon sales 15000
6 Baron Eveline clerk sales 23000
7 Will Pater peon sales 13000
8 Christopher Noah director purchase 80000

在上例中,带有 NR 的 awk 命令会打印所有行以及行号。

(2)使用 NF 内置变量(显示最后字段)

root@dev:~/linux# awk '{print $1,$2,$NF}' text.txt 
Dwight Frances 45000
Lindsay Max 25000
Jo Richardson 50000
Rosalind Watt 47000
Gale Evelina 15000
Baron Eveline 23000
Will Pater 13000
Christopher Noah 80000

在上例中,$1,$2 代表姓名,$NF 代表薪金。我们可以使用 $NF 获取薪金,其中 $NF 代表最后一个字段。

(3) NR 内置变量的另一种用法(显示行从 3 到 6行)

root@dev:~/linux# awk 'NR==3, NR==6 {print NR,$0}' text.txt 
3 Jo Richardson manager sales 50000
4 Rosalind Watt manager account 47000
5 Gale Evelina peon sales 15000
6 Baron Eveline clerk sales 23000

在上例中,显示3 ~ 6行记录,显示行号;

(4) 忽略大小写

root@dev:~/linux# awk 'BEGIN{IGNORECASE=1} /evelina/' text.txt 
-----------------------------------------------------------------------
Gale Evelina peon sales 15000root@dev:~/linux# awk 'BEGIN{IGNORECASE=1} /Evelina/' text.txt 
-----------------------------------------------------------------------
Gale Evelina peon sales 15000

(5) 打印文件名及行数

root@dev:~/linux# awk 'END { print "File", FILENAME, "contains", NR, "lines." }' text.txt 
-----------------------------------------------------------------------------------
File text.txt contains 8 lines.

更多示例后续不断补充。

感谢您花时间阅读文章!
关注公众号不迷路!

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

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

相关文章

Android 控件保持宽高比得几种方式

文章目录 Android 控件保持宽高比得几种方式adjustViewBounds百分比布局ConstraintLayout自定义View Android 控件保持宽高比得几种方式 adjustViewBounds 仅适用于 ImageView&#xff0c;保持横竖比。 <ImageViewandroid:layout_width"match_parent"android:l…

动态规划(Dynamic-Programming)问题讲解

动态规划类问题 从已知子问题的解&#xff0c;推导出当前问题的解 推导过程可以表达为一个数学公式用一维或二维数组来保存之前的计算结果&#xff08;可以进一步降维优化&#xff09; 将当前问题 分解成子问题 &#xff0c;找出递归公式&#xff0c;分阶段进行求解 求解过程中…

vue3+ts封装一个button组件

创建一个新的Button组件文件 Button.vue&#xff1a; <template><button :class"buttonClass" :disabled"disabled" click"handleClick"><slot></slot><i v-if"icon" :class"icon"></i&g…

python 生成器yield

生成器 创建生成器的方式 生成器推导式yield关键字 生成器相关方法 for&#xff1a;循环遍历生成器中的每一个值next&#xff1a;获取生成器中的下一个值 生成器注意点 代码执行到yield会暂停&#xff0c;然后把结果返回出去&#xff0c;下次启动生成器会在暂停的位置继续执行…

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

第十五课,海龟画图:抬笔与落笔函数、画曲线函数

一&#xff0c;turtle.penup()和turtle.pendown()&#xff1a;抬起与落下画笔函数 当使用上节课学习的这个turtle.forward()&#xff1a;画笔前进函数时&#xff0c;画笔会朝着当前方向在画布上留下一条指定&#xff08;像素&#xff09;长度的直线&#xff0c;但你可能发现&a…

Map Python用法:深度解析与应用探索

Map Python用法&#xff1a;深度解析与应用探索 在Python编程中&#xff0c;map() 函数是一种强大的内置高阶函数&#xff0c;用于对可迭代对象中的每个元素应用指定的函数&#xff0c;并返回一个新的迭代器&#xff0c;其中包含函数应用后的结果。本文将从四个方面、五个方面…

Bean的生命周期中有哪些对外开放的接口,及各种作用

Bean的生命周期中有哪些对外开放的接口&#xff0c;及各种作用 在 Spring 框架中&#xff0c;Bean 的生命周期可以通过一系列的回调接口来管理和控制。以下是 Spring 中对外开放的主要 Bean 生命周期接口以及它们的作用&#xff1a; InitializingBean 和 DisposableBean 接口&…

C++|set、map模拟实现<——红黑树

目录 一、红黑树的迭代器 1.1红黑树迭代器框架 1.2operator*() && operator->() 1.3operator() 1.4operator--() 1.5operator() && operator!() 1.6begin() && end() 二、如何用红黑树搭配map和set(仿函数) 三、红黑树封装map和set(简易版…

springboot + Vue前后端项目(第十三记)

项目实战第十三记 写在前面1.建立角色表2. 后端代码生成2.1 RoleController 3. 前端页面的搭建3.1 Role.vue3.2 路由3.3 Aside.vue3.4 页面效果 4.建立菜单表5.后端代码编写5.1 Menu5.2 MenuController 6.前端页面的搭建6.1 Menu.vue6.2 路由6.3 Aside.vue6.4 页面效果 总结写在…

keepalived安装文档

目录 1、安装环境 2、安装keepalived 2.1 上传keepalived安装文件 2.2 解压 2.3 安装keepalived 2.4 加入开机启动&#xff1a; 2.5 配置日志文件 2.6 打开防火墙的通讯地址 1、安装环境 su - root yum -y install kernel-devel* yum -y install openssl-* yum -y …

vx小程序初学

小程序初学 在我还没接触到微信小程序之前&#xff0c;通常使用轮播要么手写或使用swiper插件去实现&#xff0c;当我接触到微信小程序之后&#xff0c;我看到了微信小程序的强大之处&#xff0c;让我为大家介绍一下吧&#xff01; swiper与swiper-item一起使用可以做轮播图 …

把自己的服务器添加到presearch节点

Presearch is a scam. Before, judging by the price of the token you should have been able to get between $150-$200 after 12-13 months of regular searches. "If you use this service for the next 11 years you will have earned $30!" Presearch大约需要…

Easy RoCE:在SONiC交换机上一键启用无损以太网

RDMA&#xff08;远程直接内存访问&#xff09;技术是一种绕过 CPU 或操作系统&#xff0c;在计算机之间直接传输内存数据的技术。它释放了内存带宽和 CPU&#xff0c;使节点之间的通信具有更低的延迟和更高的吞吐量。目前&#xff0c;RDMA 技术已广泛应用于高性能计算、人工智…

车流量监控系统

1.项目介绍 本文档是对于“车流量检测平台”的应用技术进行汇总&#xff0c;适用于此系统所有开发&#xff0c;测试以及使用人员&#xff0c;其中包括设计背景&#xff0c;应用场景&#xff0c;系统架构&#xff0c;技术分析&#xff0c;系统调度&#xff0c;环境依赖&#xf…

MongoDB~存储引擎了解

存储引擎 存储引擎是一个数据库的核心&#xff0c;主要负责内存、磁盘里数据的管理和维护。 MongoBD的优势&#xff0c;在于其数据模型定义的灵活性、以及可拓展性。但不要忽略&#xff0c;其存储引擎也是插件式的存在&#xff0c;支持不同类型的存储引擎&#xff0c;使用不同…

导线防碰撞警示灯:高压线路安全保障

导线防碰撞警示灯&#xff1a;高压线路安全保障 在广袤的大地上&#xff0c;高压线路如同血脉般纵横交错&#xff0c;然而&#xff0c;在这看似平静的电力输送背后&#xff0c;却隐藏着不容忽视的安全隐患。特别是在那些输电线路跨越道路、施工等区域的路段&#xff0c;线下超…

顶点着色技术在AI去衣中的作用

在当今的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶汽车&#xff0c;再到在线购物推荐。然而&#xff0c;AI的影响远不止于此。近年来&#xff0c;AI在图像处理和计算机视觉领域的应用取得了显著进…

c++字符串相关接口

c字符串相关接口 1.str2wstr(str转换wstr)2.wstr2str(str转换wstr)3.Utf8ToAsi(Utf8转换ANSI)4.AsiToUtf8(ANSI转换Utf8)5.stringformatA/stringformatW(按照指定的格式格式化字符串)6.GetStringBetween(获取cStart cEnd之间的字符串)7.Char2Int(char转int)8.Str2Bin(字符串转换…

视觉语言大模型llava学习

1. 拉取 https://github.com/haotian-liu/LLaVA 视觉语言大模型是人工智能领域一种重要的多模态模型&#xff0c;它结合了计算机视觉&#xff08;CV&#xff09;和自然语言处理&#xff08;NLP&#xff09;的技术&#xff0c;使得模型能够同时理解图像和文本信息。这类模型在多…