热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

awkif包含_千面awk|Linux中国

awk命令不仅提供了简单的输入字符串筛选功能,还包含提取数据列、打印简单文本、筛选内容——甚至做一些数学计算。--SandraHenry-stockerawk命令不仅
6950c12c26ff030ffdf239dca619cb60.pngawk 命令不仅提供了简单的输入字符串筛选功能,还包含提取数据列、打印简单文本、筛选内容——甚至做一些数学计算。-- Sandra Henry-stocker

awk 命令不仅提供了简单的输入字符串筛选功能,还包含提取数据列、打印简单文本、筛选内容——甚至做一些数学计算。

如果你仅使用 awk 选取一行中的特定文本,那么你可能错过了它的很多功能。在这篇文章中,我们会来看看使用 awk 可以帮你做一些其他的什么事情,并提供一些例子。

提取数据列

awk 所提供的最简单与最常用的功能便是从文件或管道传输的数据中选取特定的内容。默认使用空格当做分隔符,这非常简单。

$ echo one two three four five | awk ‘{print $4}’four$ who | awk ‘{print $1}’jdoefhenry

空格指的是一系列的 space 或 tab 字符。在下面所展示的命令里,awk 从提供的数据中筛选第一和第四项。

awk 命令也可以通过在其后增加文件名参数的方式从文本文件中获取数据。

$ awk '{print $1,$5,$NF}' HelenKellerQuoteThe beautiful heart.

(LCTT 译注:“The best and most beautiful things in the world can not be seen or even touched , they must be felt with heart.” ——海伦凯勒)

在这个例子中,awk 挑选了一行中的第一个、第五个和最后一个字段。

命令中的 $NF 指定选取每行的最后一个字段。这是因为 NF 代表一行中的字段数量Number of Field,也就是 23,而 $NF 就代表着那个字段的值,也就是heart。最后的句号也包含进去了,因为它是最后一个字符串的一部分。

字段能以任何有用的形式打印。在这个例子中,我们将字段以日期的格式进行打印输出。

$ date | awk '{print $4,$3,$2}'2019 Nov 22

如果你省略了 awk 命令中字段指示符之间的逗号,输出将会挤成一个字符串。

$ date | awk '{print $4 $3 $2}'2019Nov21

如果你将通常使用的逗号替换为连字符,awk 就会尝试将两个字段的值相减——或许这并不是你想要的。它不会将连字符插入到输出结果中。相反地,它对输出做了一些数学计算。

$ date | awk '{print $4-$3-$2}'1997

在这个例子中,它将年 “2019” 和日期 “22” 相减,并忽略了中间的 “Nov”。

如果你想要空格之外的字符作为输出分隔符,你可以通过 OFS(输出分隔符output field separator)指定分隔符,就像这样:

$ date | awk '{OFS="-"; print $4,$3,$2}'2019-Nov-22

打印简单文本

你也可以使用 awk 简单地显示一些文本。当然了,比起 awk 你可能更想使用 echo 命令。但换句话说,作为 awk 脚本的一部分,打印某些相关性文本将会非常实用。这里有一个没什么用的例子:

$ awk 'BEGIN {print "Hello, World" }'Hello, World

下面的例子更加合理,添加一行文本标签来更好的辨识数据。

$ who | awk 'BEGIN {print "Current logins:"} {print $1}'Current logins:shsnemo

指定字段分隔符

不是所有的输入都以空格作为分隔符的。如果你的文本通过其它的字符作为分隔符(例如:逗号、冒号、分号),你可以通过 -F 选项(输入分隔符)告诉 awk:

$ cat testfilea:b:c,d:e$ awk -F : '{print $2,$3}' testfileb c,d

下面是一个更加有用的例子——从冒号分隔的 /etc/passwd 文件中获取数据:

$ awk -F: '{print $1}' /etc/passwd | head -11rootdaemonbinsyssyncgamesmanlpmailnewsuucp

筛选内容

你也可以使用 awk 命令评估字段。例如你仅仅想列出 /etc/passwd 中的用户账号,就可以对第三个字段做一些筛选。下面的例子中我们只关注大于等于 1000 的 UID:

$ awk -F":" ' $3 >= 1000 ' /etc/passwdnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bashnemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zshdory:x:1002:1002:Dory,,,:/home/dory:/bin/bash...

如果你想为输出增加标题,可以添加 BEGIN 从句:

$ awk -F":" 'BEGIN {print "user accounts:"} $3 >= 1000 ' /etc/passwduser accounts:nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bashnemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zshdory:x:1002:1002:Dory,,,:/home/dory:/bin/bash

如果你想要不止一行的标题,你可以通过 "\n" 分隔输出:

$ awk -F":" 'BEGIN {print "user accounts\n============="} $3 >= 1000 ' /etc/passwduser accounts=============nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinshs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bashnemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zshdory:x:1002:1002:Dory,,,:/home/dory:/bin/bash

在 awk 中进行数学计算

awk 提供了惊人的数学计算能力,并且可以开平方,算 log,算 tan 等等。

这里有一对例子:

$ awk 'BEGIN {print sqrt(2019)}'44.9333$ awk 'BEGIN {print log(2019)}'7.61036

想要详细了解 awk 的数学计算能力,可以看《使用 awk 进行数学计算》这篇文章。

awk 脚本

你也可以使用 awk 写一套单独的脚本。下面的例子模仿了之前写过的一个,不过还计算了系统里账户的数量。

#!/usr/bin/awk -f# 这一行是注释BEGIN { printf "%s\n","User accounts:" print "==============" FS=":" n=0}# 现在开始遍历数据{ if ($3 >= 1000) { print $1 n ++ }}END { print "==============" print n " accounts"}

注意 BEGIN 那一节是如何提供标题、指定字段分隔符和初始化计数器的,它仅在脚本初始化时期执行。这个脚本也包含 END 节,它仅在中间所有命令处理完成之后运行,显示了所有中间小节所筛选数据的最终行数(第三个字段大于等于 1000)。

作为一个长存于 Unix 之上的命令,awk 依旧提供着非常有用的服务,这也是我几十年前爱上 Unix 的原因之一。


via: https://www.networkworld.com/article/3454979/the-many-faces-of-awk.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:LuuMing 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

97ca24b59d949ab4625a076671eeece7.png?:还在看吗?



推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • Linux 基础命令详解
    本文介绍了在 Linux 系统中常见的命令及其用法。当用户登录系统后,默认提示符会显示为 [root@localhost ~]# 或 [user@localhost ~]$,其中 # 表示当前用户为 root,$ 表示普通用户。我们将深入探讨一些常用的 Linux 命令,帮助初学者更好地理解和使用这些工具。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 0626TP整理二(调试模式,空操作,跨控制器调用,跨方法跳转redirect(),框架语法,创建model模型)...
    一、调试模式(入口文件:index.php)define(APP_DEBUG,true);调试模式define(APP_DEBUG,FALSE);运行模 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍如何在QT框架中使用QWebSocket和QTcpSocket实现SSL加密通信,涵盖单向认证设置。单向认证常见于Web通信场景,其中客户端验证服务端证书,而服务端不验证客户端证书。 ... [详细]
  • VSCode与Gitee集成:项目提交的高效实践
    本文介绍如何利用VSCode内置的Git工具将项目提交到Gitee,简化Git命令的使用,提升代码管理效率。同时分享一些常见的踩坑经验和解决方案。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
author-avatar
秋夜里的寂寞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有