gawk程序基础

2023-12-27 05:08
文章标签 基础 程序 gawk

本文主要是介绍gawk程序基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

虽然sed已经很牛逼了,但是再牛逼也有自身的限制。gawk就是用来搞定sed不能搞定的问题。

gawk可以做以下几件事情:

  • 定义变量来保存数据;
  • 使用算术和字符串操作符来处理数据;
  • 使用结构化编程概念,为数据处理增加逻辑;
  • 提取数据文件中的数据元素进行格式化。

gawk命令格式:


gawk options program file

还是直接看例子吧。

列操作


首先假设我们有这样一个文本数据data:

No.1 Google Gmail
No.2 Microsoft Windows
No.3 SAP ERP
No.4 Intel Core
No.5 Cisco Rout

输入命令并得出输出结果:

$ gawk '{print $1}' data
No.1
No.2
No.3
No.4
No.5

看到了吧,啥情况,这是输出文本所有以空格为分隔符的第一列。输出第二列当然就是这样写了。

$ gawk '{print $2}' data
Google
Microsoft
SAP
Intel
Cisco

如果命令是‘$0’,会出现啥?

$ gawk '{print $0}' data
No.1 Google Gmail
No.2 Microsoft Windows
No.3 SAP ERP
No.4 Intel Core
No.5 Cisco Router

很显然,如果输入‘$0’,那整个文本就输出了。

好,有了这个功能,那我们分析一些系统文件是不是就省事多了,比如passwd文件里面的内容打开以后,如果直接看,那貌似比较困难,现在有了gwak,来先输出一下第一列吧。

$ gawk -F: '{print $1}' /etc/passwd 
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
systemd-timesync
systemd-network
systemd-resolve
systemd-bus-proxy
syslog
......

看到这个结果就爽,不过要注意:这里用了一个参数F,这个参数的意思就是指定行中分隔数据字段的字段分隔符。F后面紧跟了个‘:’,意思就是以‘:’为分隔符。

gawk当然也可以用于管道数据处理:

$ echo "I have a pen" | gawk '{$4="apple"; print $0}'
I have a apple

这个命令的意思就是将第四个词改为“apple”,然后全部输出。注意:$4=”apple”这个地方必须是双引号,如果是单引号就只会输出“I have a”。

与sed一样,gawk也可以一行一行地输入脚本命令:

$ gawk '{
> $4="apple"
> print $0}'appleapple

因为我们之前啥也每输入,也就是说没有原始字符串,所以每次回车都替换第四个单词为apple,然后通过ctrl+D就可以结束运行了。

从文件中读取命令


新建脚本script

{print $1 "'s home direcotry is " $6}

运行并得出结果:

$ gawk -F: -f script /etc/passwd
root's home direcotry is /root
daemon's home direcotry is /usr/sbin
bin's home direcotry is /bin
sys's home direcotry is /dev
sync's home direcotry is /bin
games's home direcotry is /usr/games
man's home direcotry is /var/cache/man
lp's home direcotry is /var/spool/lpd
mail's home direcotry is /var/mail
news's home direcotry is /var/spool/news
uucp's home direcotry is /var/spool/uucp
proxy's home direcotry is /bin
www-data's home direcotry is /var/www
backup's home direcotry is /var/backups
list's home direcotry is /var/list
irc's home direcotry is /var/run/ircd
gnats's home direcotry is /var/lib/gnats
nobody's home direcotry is /nonexistent
systemd-timesync's home direcotry is /run/systemd
systemd-network's home direcotry is /run/systemd/netif
systemd-resolve's home direcotry is /run/systemd/resolve
systemd-bus-proxy's home direcotry is /run/systemd
syslog's home direcotry is /home/syslog
_apt's home direcotry is /nonexistent
messagebus's home direcotry is /var/run/dbus
uuidd's home direcotry is /run/uuidd
lightdm's home direcotry is /var/lib/lightdm
whoopsie's home direcotry is /nonexistent
avahi-autoipd's home direcotry is /var/lib/avahi-autoipd
avahi's home direcotry is /var/run/avahi-daemon
dnsmasq's home direcotry is /var/lib/misc
colord's home direcotry is /var/lib/colord
speech-dispatcher's home direcotry is /var/run/speech-dispatcher
hplip's home direcotry is /var/run/hplip
kernoops's home direcotry is /
pulse's home direcotry is /var/run/pulse
rtkit's home direcotry is /proc
saned's home direcotry is /var/lib/saned
usbmux's home direcotry is /var/lib/usbmux
comac's home direcotry is /home/comac
sshd's home direcotry is /var/run/sshd

当然这个脚本也可以这么写:

{ 
text="'s home directory is " 
print $1 text $6
}

注意:每个命令分别放到新的一行,有没有分号无所谓。

BEGIN,END关键字的使用


这两个关键字理解也简单,BEGIN就是在执行脚本前运行这个,END就是在执行脚本后运行这个。

还是看例子:

$ gawk 'BEGIN { print "This is the key word BEGIN" } { print $0}' data
This is the key word BEGIN
No.1 Google Gmail
No.2 Microsoft Windows
No.3 SAP ERP
No.4 Intel Core
No.5 Cisco Router

在打印data中的文本前先输出了BEGIN中的内容。下面再看看END是啥效果:

$ gawk 'BEGIN { print "This is the key word BEGIN" } { print $0} END { print "This is the key word END"}' data
This is the key word BEGIN
No.1 Google Gmail
No.2 Microsoft Windows
No.3 SAP ERP
No.4 Intel Core
No.5 Cisco Router
This is the key word END

很简单是吧,最后呢,再体验一下gawk的威力,你就回觉得这家伙真心牛逼。

新建脚本文件script

BEGIN {
print "The latest list of users and shells"
print "Userid                  shell "
print "---------------------------------------------"
FS=":"
}{
print $1 "\t\t\t" $7
}END {
print "---------------------------------------------"
print "This is the end of the list"
}

输出结果:

$ gawk -f script /etc/passwd
The latest list of users and shells
Userid                  shell 
---------------------------------------------
root            /bin/bash
daemon          /usr/sbin/nologin
bin         /usr/sbin/nologin
sys         /usr/sbin/nologin
sync            /bin/sync
games           /usr/sbin/nologin
man         /usr/sbin/nologin
lp          /usr/sbin/nologin
mail            /usr/sbin/nologin
news            /usr/sbin/nologin
uucp            /usr/sbin/nologin
proxy           /usr/sbin/nologin
www-data            /usr/sbin/nologin
backup          /usr/sbin/nologin
list            /usr/sbin/nologin
irc         /usr/sbin/nologin
gnats           /usr/sbin/nologin
nobody          /usr/sbin/nologin
systemd-timesync            /bin/false
systemd-network         /bin/false
systemd-resolve         /bin/false
systemd-bus-proxy           /bin/false
syslog          /bin/false
_apt            /bin/false
messagebus          /bin/false
uuidd           /bin/false
lightdm         /bin/false
whoopsie            /bin/false
avahi-autoipd           /bin/false
avahi           /bin/false
dnsmasq         /bin/false
colord          /bin/false
speech-dispatcher           /bin/false
hplip           /bin/false
kernoops            /bin/false
pulse           /bin/false
rtkit           /bin/false
saned           /bin/false
usbmux          /bin/false
comac           /bin/bash
sshd            /usr/sbin/nologin
---------------------------------------------
This is the end of the list

生成这么清晰明了的报表,就写到这里吧,稍稍休息一下。

参考文献

[1] Linux Command Line and Shell Scripting Bible 2nd Edition. Richard Blum, Christine Bresnahan. WILEY Press.

这篇关于gawk程序基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close