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

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

提取数据列

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

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

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

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

$ awk '{print $1,$5,$NF}' HelenKellerQuote
The 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:
shs
nemo

指定字段分隔符

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

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

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

$ awk -F: '{print $1}' /etc/passwd | head -11
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp

筛选内容

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

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

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

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

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

$ awk -F":" 'BEGIN {print "user accountsn============="} $3 >= 1000 ' /etc/passwd
user accounts
=============
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
shs:x:1000:1000:Sandra Henry-Stocker,,,:/home/shs:/bin/bash
nemo:x:1001:1001:Nemo,,,:/home/nemo:/usr/bin/zsh
dory: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 "%sn","User accounts:"print "=============="FS=":"n=0
}# 现在开始遍历数据
{if ($3 >= 1000) {print $1n ++}
}END {print "=============="print n " accounts"
}

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

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


awk -f 分隔符 命令_千面 awk相关推荐

  1. awk -f 分隔符 命令_详解!!!awk参见使用命令

    今天介绍Linux常见的一个命令awk,一门模式匹配的编程语言,因为它的主要功能是用于匹配文本并处理,同时它有一些编程语言才有的语法,例如函数.分支循环语句.变量等等.当然比起我们常见的编程语言,aw ...

  2. awk -f 分隔符 命令_Linux三剑客之awk

    awk命令用法小记 版本:CentOS7 ▼  ▼  ▼  ▼  ▼   ▼  ▼  ▼  ▼ 作别老东家,省略一些心里话,希望尽快度过这段迷茫期,调整好心态,面对疾风吧~ 话不多说进入正题 使用方法 ...

  3. awk -f 分隔符 命令_Linux awk命令详解(详解版)

    除了使用 sed 命令,Linux 系统中还有一个功能更加强大的文本数据处理工具,就是 awk.它诞生于 20 世纪 70 年代末期,这也许是它影响了众多 Linux 用户的原因之一. 曾有人推测 a ...

  4. linux awk过滤符号,shell文本过滤之awk命令

    本文信息本文由方法SEO顾问发表于2014-07-1811:27:48,共 2174 字,转载请注明:shell文本过滤之awk命令_[方法SEO顾问],如果我网站的文章对你有所帮助的话,来百度口碑给 ...

  5. awk bc命令 linux_linux之awk命令(转载)

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...

  6. Linux awk编辑器及命令

    Linux awk编辑器及命令 一.awk编辑器 1.工作原理 2.命令格式 3.awk常见的内建变量如下所示: 二.按行输出文本 三.按字段输出文本 四.通过管道.双引号调用 Shell 命令 一. ...

  7. linux awk f,linux的awk详情(上)

    一丶awk介绍 AWK是一种处理文本文件的语言,是一个强大的文本分析工具,可以报告生成器,格式化文本输出 1.常用语法 awk [options] 'program' var=value file- ...

  8. linux命令终极系列awk

    AWK man 手册:http://man.linuxde.net/awk AWK编程的内容极多,这里只罗列简单常用的用法,更多请参考 http://www.gnu.org/software/gawk ...

  9. awk内置命令RS,ORS,FS,OFS的使用

    Awk内置命令RS, ORS, FS, OFS FS 指定字段列分隔符 OFS 指定输出字段列分隔符 RS指定行分隔符 默认分隔符为\n ORS指定输出行分隔符 FS指定列分隔符,相当于参数-F.OF ...

最新文章

  1. postman设置测试环境
  2. 虚拟机磁盘模式的转换
  3. 湖南大学C语言作业用oj吗,湖南大学C语言题库(含答案)
  4. python 套接字 struck_Python socket粘包问题(最终解决办法)
  5. SpringBoot基础篇(二):HelloWorld细节探究
  6. android 应用切换动画,怎么在Android应用中利用Activity对动画进行切换
  7. python数据结构-链表
  8. c语言解三元一次方程组_在R里面对三元一次方程求解
  9. 两万字 40 张图带你参透并发编程
  10. mysql 写出高性能sql 防止索引失效总结
  11. 直流电机、减速器、编码器与TB6612FNG知识整理
  12. 麒麟桌面系统添加字体
  13. 720nopenwrt设置打印服务器_打印服务器的ip配置及共享设置
  14. ubuntu 超好用截图和标记图片工具shutter
  15. matplotlib之pyplot模块——获取或设置坐标轴刻度及标签(xticks、yticks)
  16. 程序员初入职场,如何规划好自己的职业生涯?
  17. python更改进程名称_更改python脚本的进程名称 - python
  18. 基于JAVA网上图书销售系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  19. 获取百度网盘下载真实地址
  20. 马斯克立军令状:特斯拉不到6500亿美元我就白干

热门文章

  1. Centos7 释放内存
  2. 解决fullgc_「OOM」Java heap space原因与解决
  3. 模型部署到移动端_TensorFlow Lite 自然语言处理模型的最新功能,助力设备端 NLP 部署...
  4. 强制删除正在运行的文件_win10系统上怎么强制删除文件
  5. java高并发(十六)J.U.C之ForkJoin
  6. 算法导论学习笔记 6.5 优先队列
  7. 技术的深度与广度,该如何取舍?
  8. 别人的20几岁 vs 互联网人的20几岁
  9. java中数据结构的应用_Java集合入门 (二)常用数据结构和应用场景-数组
  10. python安装第三方包总是超时_(python pip安装第三方库超时问题(raise ReadTimeoutErrorself._pool, None, 'Read timed out.')...