文本三剑客之awk的用法小例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

  • 一、awk的工作原理
  • 二、命令格式
  • 三、awk的应用示例
    • 1、打印文本内容
    • 2、根据$n提取字段
    • 3、根据选项-F指定分隔符
    • 4、根据关键字提取所在行
    • 5、使用BEGIN输出包含指定字符的行并统计有多行
    • 6、FS∶ 列分割符提取列
    • 7、NF
    • 8、NR


一、awk的工作原理

1.逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
2.sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
3.在使用awk命令的过程中,可以使用逻辑操作符“&&”表示“与”、“||”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/、%、^分别表示加、减、乘、除、取余和乘方。

  • AWK 是一种处理文本文件的语言,是一个强大的文本分析工具
  • 可以在无交互的模式下实现复杂的文本操作
  • 相较于sed常作用于一整个行的处理,awk则比较倾向于一行当中分成数个字段来处理,因为awk相当适合小型的文本数据。
  • 二、命令格式

    awk 选项 ‘模式或条件 {操作} 文件 1 文件 2 
    awk -f 脚本文件 文件 1 文件 2 
    

    awk常见的内建变量(可直接用)

  • FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
  • NF:当前处理的行的字段个数。
  • NR:当前处理的行的行号(序数)。
  • $0:当前处理的行的整行内容。
  • $n:当前处理行的第n个字段(第n列)。
  • FILENAME:被处理的文件名。
  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk 一次仅读入一条记录,以进行处理。预设值是’\n’
  • 三、awk的应用示例

    1、打印文本内容

  • awk可以将自动将多个空格压缩成一个空格
  • 打印字符串需要加双引号
  • 方法一:

    打印磁盘已经使用情况

    [root@localhost data]# df |awk '{print $5}'
    

    文本三剑客之awk的用法小例_第1张图片

    方法二:

    打印字符串确定文件有多少行

    [root@localhost data]# awk '{print "hello"}' testfile2|wc -l
    

    文本三剑客之awk的用法小例_第2张图片

    2、根据$n提取字段

    示例一: 提取ip地址

    $n,代表提取第几列

    [root@localhost data]# ifconfig ens33|sed -n '2p'|awk '{print $2}'
    

    文本三剑客之awk的用法小例_第3张图片

    示例2:提取mac地址

    [root@localhost ~]# ifconfig ens33|sed -n '4p' |awk '{print $2}'
    00:0c:29:e8:0c:a8
    

    在这里插入图片描述

    3、根据选项-F指定分隔符

    示例一:打印/etc/passwd所有用户名

    [root@localhost ~]# cat /etc/passwd|awk -F: '{print $1}'
    

    文本三剑客之awk的用法小例_第4张图片

    示例二:打印多列内容
    打印时逗号可以表示空格,如果使用“:”或者“+”,需要将特殊符号加上双引号当成字符串打印

    文本三剑客之awk的用法小例_第5张图片
    文本三剑客之awk的用法小例_第6张图片
    文本三剑客之awk的用法小例_第7张图片
    示例三:打印磁盘已经使用情况,去除%

    方法一:
    [root@localhost ~]# df|awk -F"[ %]+" '{print $5}'
    方法二:
    [root@localhost ~]# df|awk '{print $5}'|awk -F% '{print $1}'
    方法三:
    [root@localhost ~]# df|awk -F"( |%)+" '{print $5}'
    

    文本三剑客之awk的用法小例_第8张图片
    文本三剑客之awk的用法小例_第9张图片
    文本三剑客之awk的用法小例_第10张图片
    示例四:取出文本中的ip地址及时间

    [root@localhost ~]# cat 1.txt |sed '2d'|awk -F"[[ ]"  '{print $5"\t"$1}'
    

    文本三剑客之awk的用法小例_第11张图片

    4、根据关键字提取所在行

    示例一:提取/etc/passwd 以root开头的行

    [root@localhost opt]#cat passwd |awk -F":" '/^root/{print}' 
    root:x:0:0:root:/root:/bin/bash
    

    在这里插入图片描述
    示例二:提取/etc/passwd nologin结尾的行

    [root@localhost etc]# cat passwd |awk -F":" '/nologin$/{print}'
    

    文本三剑客之awk的用法小例_第12张图片

    如果提取/sbin/nologin,则需要\转义/

    [root@localhost etc]# cat passwd |awk -F":" '/\/sbin\/nologin$/{print}'|head -5
    

    在这里插入图片描述
    示例三:提取ip地址

    [root@localhost etc]# ifconfig ens33|awk '/netmask/{print $2}'
    192.168.100.100
    

    在这里插入图片描述

    5、使用BEGIN输出包含指定字符的行并统计有多行

    1.BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作;

    2.awk再处理指定的文本,之后再执行END模式中指定的动作;

    3.END{ } 语句块中,往往会放入打印结果等语句。

    #先定义变量x,表示执行多少次
    [root@localhost etc]# awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    tang:x:1000:1000:tang:/home/tang:/bin/bash
    43
    

    在这里插入图片描述

    6、FS∶ 列分割符提取列

    [root@localhost etc]# awk -v FS=: '{print $1FS$3}' /etc/passwd
    root:0
    bin:1
    daemon:2
    adm:3
    lp:4
    sync:5
    shutdown:6
    halt:7
    

    文本三剑客之awk的用法小例_第13张图片

    7、NF

    示例一:当前处理的行的字段个数

    [root@localhost etc]# cat /etc/passwd |awk -F: '{print NF}'|head -5
    7
    7
    7
    7
    

    文本三剑客之awk的用法小例_第14张图片
    示例二:打印出每行最后一个字段

    [root@localhost etc]# cat /etc/passwd |awk -F: '{print $NF}'
    

    文本三剑客之awk的用法小例_第15张图片
    示例三:打印出每行倒数第二个字段

    [root@localhost etc]# df|awk '{print $(NF-1)}'
    

    文本三剑客之awk的用法小例_第16张图片

    8、NR

    示例一:当前处理的行的行号

    [root@localhost etc]# awk  -F":" '{print $1,NR}' /etc/passwd
    
    [root@localhost etc]# awk  -F":" '{print NR"\t"$1}' /etc/passwd
    

    文本三剑客之awk的用法小例_第17张图片

    文本三剑客之awk的用法小例_第18张图片
    示例二:NR==n代表行号等于什么

    [root@localhost etc]# awk -F: 'NR==2 {print $1}' /etc/passwd
    bin
    

    文本三剑客之awk的用法小例_第19张图片示例三:NR%2==0取偶数行

    [root@localhost etc]# cat test.txt 
    one
    two
    three
    four
    five
    six
    seven
    eight
    nine
    ten
    
    [root@localhost etc]# awk -F: 'NR%2==0 {print $1}' test.txt 
    two
    four
    six
    eight
    ten
    

    文本三剑客之awk的用法小例_第20张图片
    示例四:NR%2==1取奇数行

    文本三剑客之awk的用法小例_第21张图片
    示例五:NR= =1,NR= =4取区间行

    [root@localhost etc]# awk -F: 'NR==1,NR==4 {print $1}' test.txt 
    

    文本三剑客之awk的用法小例_第22张图片
    示例六:取UID数值范围$n>1000

    [root@localhost etc]# awk -F: '$3>1000 {print}' /etc/passwd
    nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
    [root@localhost etc]# 
    

你可能感兴趣的:(linux,运维,服务器)