awk详解

withfeel withfeel     2023-04-11     802

关键词:

原文连接:http://www.ruanyifeng.com/blog/2018/11/awk.html

? ?

awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。

它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。

技术图片

awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。

一、基本用法

awk的基本用法就是下面的形式。


#
格式
$ awk
动作 文件名

# 示例
$ awk ‘print $0 demo.txt

上面示例中,demo.txtawk所要处理的文本文件。前面单引号内部有一个大括号,里面就是每一行的处理动作print $0。其中,print是打印命令,$0代表当前行,因此上面命令的执行结果,就是把每一行原样打印出来。

下面,我们先用标准输入(stdin)演示上面这个例子。


$ echo ‘this is a test‘ | awk ‘print $0
this is a test

上面代码中,print $0就是把标准输入this is a test,重新打印了一遍。

awk会根据空格和制表符,将每一行分成若干字段,依次用$1$2$3代表第一个字段、第二个字段、第三个字段等等。


$ echo ‘this is a test‘ | awk ‘print $3
a

上面代码中,$3代表this is a test的第三个字段a

下面,为了便于举例,我们把/etc/passwd文件保存成demo.txt


root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

这个文件的字段分隔符是冒号(:),所以要用-F参数指定分隔符为冒号。然后,才能提取到它的第一个字段。


$ awk -F ‘:‘ ‘ print $1 demo.txt
root
daemon
bin
sys
sync

二、变量

除了$ + 数字表示某个字段,awk还提供其他一些变量。

变量NF表示当前行有多少个字段,因此$NF就代表最后一个字段。


$ echo ‘this is a test‘ | awk ‘print $NF
test

$(NF-1)代表倒数第二个字段。


$ awk -F ‘:‘ ‘print $1, $(NF-1)‘ demo.txt
root /root
daemon /usr/sbin
bin /bin
sys /dev
sync /bin

上面代码中,print命令里面的逗号,表示输出的时候,两个部分之间使用空格分隔。

变量NR表示当前处理的是第几行。


$ awk -F ‘:‘ ‘print NR ") " $1 demo.txt
1) root
2) daemon
3) bin
4) sys
5) sync

上面代码中,print命令里面,如果原样输出字符,要放在双引号里面。

awk的其他内置变量如下。

  • FILENAME:当前文件名
  • FS:字段分隔符,默认是空格和制表符。
  • RS:行分隔符,用于分割每一行,默认是换行符。
  • OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
  • ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
  • OFMT:数字输出的格式,默认为%.6g

    三、函数

    awk还提供了一些内置函数,方便对原始数据的处理。

    函数toupper()用于将字符转为大写。


    $ awk -F ‘:‘ ‘ print toupper($1) ‘ demo.txt
    ROOT
    DAEMON
    BIN
    SYS
    SYNC

    上面代码中,第一个字段输出时都变成了大写。

    其他常用函数如下。

  • tolower():字符转为小写。
  • length():返回字符串长度。
  • substr():返回子字符串。
  • sin():正弦。
  • cos():余弦。
  • sqrt():平方根。
  • rand():随机数。

    awk内置函数的完整列表,可以查看手册

    四、条件

    awk允许指定输出条件,只输出符合条件的行。

    输出条件要写在动作的前面。


    $ awk
    条件 动作文件名

    请看下面的例子。


    $ awk -F ‘:‘ ‘/usr/ print $1 demo.txt
    root
    daemon
    bin
    sys

    上面代码中,print命令前面是一个正则表达式,只输出包含usr的行。

    下面的例子只输出奇数行,以及输出第三行以后的行。


    #
    输出奇数行
    $ awk -F ‘:‘ ‘NR % 2 == 1 print $1 demo.txt
    root
    bin
    sync

    # 输出第三行以后的行
    $ awk -F ‘:‘ ‘NR >3 print $1 demo.txt
    sys
    sync

    下面的例子输出第一个字段等于指定值的行。


    $ awk -F ‘:‘ ‘$1 == "root" print $1 demo.txt
    root

    $ awk -F ‘:‘ ‘$1 == "root" || $1 == "bin" print $1 demo.txt
    root
    bin

    五、if 语句

    awk提供了if结构,用于编写复杂的条件。


    $ awk -F ‘:‘ ‘if ($1 > "m") print $1 demo.txt
    root
    sys
    sync

    上面代码输出第一个字段的第一个字符大于m的行。

    if结构还可以指定else部分。


    $ awk -F ‘:‘ ‘if ($1 > "m") print $1; else print "---"‘ demo.txt
    root
    ---
    ---
    sys
    sync

    ? ?

    来自 <http://www.ruanyifeng.com/blog/2018/11/awk.html>

awk用法详解

[[email protected]~]##awk参数‘模式动作‘  文件[[email protected]~]##awk参数‘条件(找谁)  干啥‘文件 [[email protected]~]#awk-F":"‘NR==2print$2,$4‘/etc/passwdx1[[email pro 查看详情

awk命令详解(代码片段)

free-h|awk‘NR==2‘396free-h|awk‘NR==3‘397free-h|awk‘NR==2print$NF‘398free-h|awk‘NR==2print$NF,$2‘399free-h|awk‘NR==2print$NF/$2‘400free-h|awk‘NR==2print$NF/$2*100‘401free-h|awk‘NR==2printint($ 查看详情

awk详解(转)

awk是行处理器:相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息原文连接:http://blog.chinaunix.net/uid-23302288-id-3785105.html awk处理过程: 依次对每一行进行处理,然后... 查看详情

awk指令用法详解(代码片段)

1.awk概述1.1awk命名历史awk有3个不同版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是AWK的GNU版本。awk其名称得自于它的创始人AlfredAho、PeterWeinberger和BrianKernighan姓氏的首个字母。实际上AWK的确拥有自己的语言:... 查看详情

linux下的awk用法详解(代码片段)

(Linux下的awk用法详解)一、awk介绍1.AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人AlfredAho,PeterWeinberger,和BrianKernighan的FamilyName的首字符。2.AWK拥有自己的语言:AWK程序设计语言,... 查看详情

linuxawk详解(代码片段)

awk:  awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,  awk在其对数据分析并生成报告时,显得尤为强大。  简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析... 查看详情

awk详解

原文连接:http://www.ruanyifeng.com/blog/2018/11/awk.html ??awk是处理文本文件的一个应用程序,几乎所有Linux系统都自带这个程序。 它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV那样的每行格式相同的文本文件,awk... 查看详情

linux三剑客awk的应用对比案例详解

   awk的格式一awk  参数  ‘条件’(单引号) 文件路径a.参数我们一般用-F “[]” (双引号) 指定分隔符b.条件 为BEGIN模块 + 模式条件 +END模块b1.BEGIN模块在执行awk读取文件之... 查看详情

shell脚本四剑客之awk详解(代码片段)

文章目录awk的介绍awk能够干什么awk的格式工作原理:记录和域内建变量的用法1.FS2.OFS3.RS4.ORS5.NF6.NRBEGIN和END语句块常见案例1.使用NR行号提取ip2.打印UID小于10的账号名称和UID信息3.数学运算4.AWK打印硬盘设备名称,默认以空... 查看详情

shell脚本四剑客之awk详解(代码片段)

文章目录awk的介绍awk能够干什么awk的格式工作原理:记录和域内建变量的用法1.FS2.OFS3.RS4.ORS5.NF6.NRBEGIN和END语句块常见案例1.使用NR行号提取ip2.打印UID小于10的账号名称和UID信息3.数学运算4.AWK打印硬盘设备名称,默认以空... 查看详情

linux-awk命令详解(代码片段)

目录1. awk命令1.1 awk工作原理1.2 awk语法1.2.1 awk完整语法示例:1.2.1 awk工作流程1.3 指定分隔符1.3.1 -F指定分隔符1.3.2 指定输出分隔符2. free命令2.1 free命令各项含义  2.1.1 什么时候会使用交换分区?2.1.2 内核参数优... 查看详情

linux三剑客值awk命令详解(代码片段)

一、awk介绍AWK是一种优良的文本处理工具。它不仅是Linux中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人AlfredAho、PeterWeinberger和BrianKernighan姓氏的首个字母)的最大... 查看详情

linuxawk命令详解(代码片段)

转自:linuxawk命令详解简介awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行... 查看详情

selinux系列(十七)—awk命令使用详解(代码片段)

Awk一次对一条记录进行操作,直到到达输入的末尾。记录由一个称为记录分隔符的字符分隔。默认的记录分隔符是换行符,这意味着文本数据中的每一行都是一个记录。每条记录中的字段由$后跟字段号(以1开头)引用。第一个... 查看详情

grepawksed命令详解2

grep、awk、sed命令详解上一篇对grep、awk、sed命令的基本参数做了介绍,这一篇写一些例子。1.分析access.log日志内,当天访问次数最多的10个页面,并且按降序排列。#cataccess.log|awk-F‘‘‘print$7‘|sort|uniq-c|sort-nr|head-10 2.获取访... 查看详情

linuxawk命令详解

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

awk从入门到入土(11)awkgetline函数详解(代码片段)

**getline命令是我个人认为awk最强大的一个命令。因为它彻底改变了awk的运行逻辑。**awk本质上就是一个for循环,它每次对输入文件的一行进行处理,然后转而执行下一行,直到整个文件的每一行都被执行完毕。整个过... 查看详情

linuxawk命令详解

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk有三个不... 查看详情