9. 文本三剑客之awk

2024-06-15 15:36
文章标签 awk 文本 三剑客

本文主要是介绍9. 文本三剑客之awk,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 9.1 什么是awk
    • 9.2 awk命令格式
    • 9.3 awk执行流程
    • 11.4 行与列
      • 11.4.1 取行
      • 11.4.2 取列

9.1 什么是awk

虽然sed编辑器是非常方便自动修改文本文件的工具,但其也有自身的限制。通常你需要一个用来处理文件中的数据的更高级工具,它能提供一个类编程环境来修改和重新组织文件中的数据。这正是awk能够做到的。

awk程序是Unix中的原始awk程序的GNU版本。 awk程序让流编辑迈上了一个新的台阶,它提供了一种编程语言而不只是编辑器命令。在awk编程语言中,你可以做下面的事情:

  • 定义变量来保存数据;
  • 使用算术和字符串操作符来处理数据;
  • 使用结构化编程概念(比如if-then语句和循环)来为数据处理增加处理逻辑;
  • 通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告。

awk程序的报告生成能力通常用来从大文本文件中提取数据元素,并将它们格式化成可读的报告。其中最完美的例子是格式化日志文件。在日志文件中找出错误行会很难, awk程序可以让你从日志文件中过滤出需要的数据元素,然后你可以将其格式化,使得重要的数据更易于阅读。

结构化数据:意思是数据的格式是固定的,例如在数据库中存储人的信息可以通过以下字段来定义

id name age birth gender like …

1 张三 20 5.26 男 看书

2 李四 18 男 电影

3 王五 19 4.5 女

半结构化数据:它可能部分信息是有一定固定结构,而另一部分则没有固定结构。例如日志内容

date ip method

非结构化数据:数据是没有固定结构的,例如图片、电影、音乐这类文件都是非结构化数据

9.2 awk命令格式

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
选项描述
-F fs指定行中划分数据字段的字段分隔符
-f progfile从指定文件中读取程序
-v var=val在awk中定义一个变量及其默认值
-mf N指定要处理的数据文件中最大的字段数
-mr N指定数据文件中最大数据的行数

官方示例:

Examples:awk '{ sum += $1 }; END { print sum }' fileawk -F: '{ print $1 }' /etc/passwd

9.3 awk执行流程

例如执行如下的命令:

awk -F , 'BEGIN{print "name"}{print $2}END{print "end of file"}' openlab.txt

所操作的流程:

11.4 行与列

名词awk中叫法一些说明
记录 record每一行默认通过回车分割的
字段,域 field每一列默认通过空格分割的

11.4.1 取行

awk说明
NR==1取出某一行
NR>=1&&NR<=5取出1~5号
/openlab/过滤
/101/,/105/取出 101~105
符号> >= < <= == !=

使用示例:

[root@openEuler ~]# vim openlab.txt
[root@openEuler ~]# cat openlab.txt 
My name is jock.
I teach linux.
101
I like play computer game.
My qq is 24523452
105
openlab is good# 1. 获取第一行
[root@openEuler ~]# awk 'NR==1' openlab.txt 
My name is jock.# 2. 范围获取,获取1~5行
[root@openEuler ~]# awk 'NR>=1 && NR<=5' openlab.txt 
My name is jock.
I teach linux.
101
I like play computer game.
My qq is 24523452# 3. 从文件中过滤 /openlab
[root@openEuler ~]# awk '/openlab/' openlab.txt 
openlab is good

11.4.2 取列

awk说明
-F指定分割符,指定每一列结束标记(默认是空格,连续的空格,tab键)
$n取出某一列,n是从1开始的整数
$0取出所有列,即整行
$NF最后一列
$(NF-1)最后第二列
-v定义分割符变量的值
FSField Separator 字段分割符,每个字段结束标记,-v FS=: 它等价于 -F:
OFSOutput Field Separator 输出字段分割符(awk显示每一列时,每一列之间通过什么分割,默认是空格)

示例:

# 取出ls -l 命令输出结果的第5列
[root@openEuler ~]# ls -l | awk '{print $5}'916
4096
119072917
125801637
8287769
10675730
7892
102
2413
92584268
0
4958
79# 取出ls -l 命令输出结果的第5列和最后一列
[root@openEuler ~]# ls -l|awk '{print $5,$9}'916 anaconda-ks.cfg
4096 data
119072917 grafana-enterprise-10.4.2-1.x86_64.rpm
125801637 grafana-enterprise-10.4.2.linux-amd64.tar.gz
8287769 mysqld_exporter-0.15.1.linux-amd64.tar.gz
10675730 node_exporter-1.8.0.linux-amd64.tar.gz
7892 nohup.out
102 openlab.txt
2413 passwd
92584268 prometheus-2.45.4.linux-amd64.tar.gz
0 sshd_config
4958 sshd_configr
79 test.txt
[root@openEuler ~]# ls -l|awk '{print $5,$(NF)}'348116
916 anaconda-ks.cfg
4096 data
119072917 grafana-enterprise-10.4.2-1.x86_64.rpm
125801637 grafana-enterprise-10.4.2.linux-amd64.tar.gz
8287769 mysqld_exporter-0.15.1.linux-amd64.tar.gz
10675730 node_exporter-1.8.0.linux-amd64.tar.gz
7892 nohup.out
102 openlab.txt
2413 passwd
92584268 prometheus-2.45.4.linux-amd64.tar.gz
0 sshd_config
4958 sshd_configr
79 test.txt# 3. 将输出的结果列对齐
[root@openEuler ~]# ls -l|awk '{print $5,$(NF)}'| column -t
348116     
916        anaconda-ks.cfg
4096       data
119072917  grafana-enterprise-10.4.2-1.x86_64.rpm
125801637  grafana-enterprise-10.4.2.linux-amd64.tar.gz
8287769    mysqld_exporter-0.15.1.linux-amd64.tar.gz
10675730   node_exporter-1.8.0.linux-amd64.tar.gz
7892       nohup.out
102        openlab.txt
2413       passwd
92584268   prometheus-2.45.4.linux-amd64.tar.gz
0          sshd_config
4958       sshd_configr
79         test.txt# 4. 使用awk调换/etc/passwd文件的第一列和最后一列的内容
[root@openEuler ~]# awk -F: -v OFS=: '{print $NF,$2,$3,$4,$5,$6,$1}' passwd | head -5
/bin/bash:x:0:0:Super User:/root:root
/usr/sbin/nologin:x:1:1:bin:/bin:bin
/usr/sbin/nologin:x:2:2:daemon:/sbin:daemon
/usr/sbin/nologin:x:3:4:adm:/var/adm:adm
/usr/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp

注意:$(NF) 表示获取最后一列,最后第二列是 $(NF-1)

案例:取出网卡中的 IP 地址。

# 使用 sed 来实现
[root@openEuler ~]# ip a show ens160|sed -n '3p'|sed -r 's/(.*t )(.*)(\/.*$)/\2/g'
192.168.72.131# 使用awk 来实现
[root@openEuler ~]# ip a show ens160|awk 'NR==3'|awk -F'[ /]+' '{print $3}'192.168.72.131

NR:Number of Record

NF:Number of Field

这篇关于9. 文本三剑客之awk的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063864

相关文章

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma