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

相关文章

Level3 — PART 3 — 自然语言处理与文本分析

目录 自然语言处理概要 分词与词性标注 N-Gram 分词 分词及词性标注的难点 法则式分词法 全切分 FMM和BMM Bi-direction MM 优缺点 统计式分词法 N-Gram概率模型 HMM概率模型 词性标注(Part-of-Speech Tagging) HMM 文本挖掘概要 信息检索(Information Retrieval) 全文扫描 关键词

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock? Amazon Bedrock是亚马逊云服务(AWS)推出的一项旗舰服务,旨在推动生成式人工智能(AI)在各行业的广泛应用。它的核心功能是提供由顶尖AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI以及亚马逊自身)开发的多种基础模型(Foundation Models,简称FMs)。

css 处理文本不换行的方法

https://www.cnblogs.com/sensualgirl/p/3712332.html

文本分类场景下微调BERT

How to Fine-Tune BERT for Text Classification 论文《How to Fine-Tune BERT for Text Classification?》是2019年发表的一篇论文。这篇文章做了一些实验来分析了如何在文本分类场景下微调BERT,是后面网上讨论如何微调BERT时经常提到的论文。 结论与思路 先来看一下论文的实验结论: BERT模型上面的

python tkinter 文本类组件

Label组件 Label(win,text='文本',justify='center) win指定Label组件的父容器;text指定标签中的文本;justify指定标签中拥有多行文本时,最后一行文本的对齐方式。 from tkinter import *from PIL import Image,ImageTkroot = Tk()root.title("compound")roo

Git命令文本手册

git init # 初始化本地git仓库(创建新仓库)git config --global user.name "xxx" # 配置用户名git config --global user.email "xxx@xxx.com"

一个C++程序运行,从点击运行到控制台打印文本,电脑硬件的资源是如何调动的

当点击运行一个 C++ 程序并看到控制台输出文本时,计算机硬件和操作系统之间协同工作,完成了多个步骤。这些步骤涉及 CPU、内存、存储设备、操作系统和输入输出设备的共同作用。下面是一个详细的过程描述: 1. 程序加载 启动:当你点击运行一个可执行文件时,操作系统(通常是 Windows、Linux 或 macOS)的文件系统管理器识别请求,并启动加载程序。读取可执行文件:加载程序将可执行文件从

AS3中的TextField文本事件 处理

 textfield支持的html标签不多, a标签侦听事件: textFiled.htmlText = "<a href='event:typetext'>con</a>"; textFiled.addEventListener(TextEvent.LINK,linkhandle); function linkhandle(event:TextEvent):void{

三文带你轻松上手鸿蒙的AI语音03-文本合成声音

三文带你轻松上手鸿蒙的AI语音03-文本合成声音 前言 接上文 三文带你轻松上手鸿蒙的AI语音02-声音文件转文本 HarmonyOS NEXT 提供的AI 文本合并语音功能,可以将一段不超过10000字符的文本合成为语音并进行播报。 场景举例 手机在无网状态下,系统应用无障碍(屏幕朗读)接入文本转语音能力,为视障人士提供播报能力。类似微信读书,可以实现将文章内容通过语音朗读,可以