Linux三剑客之awk

Linux三剑客之awk

概述

awk有强大的文本格式化的能力,对文本进行复杂处理;并且支持条件判断,数组以及循环等功能。

awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符。

awk是按行处理,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有分割符默认为空格。

语法:
awk  options  pattern  {action}  file
     可选参数      '条件动作'      文件/数据
awk的内置命令:
$0:表示整行(完整的输入记录——即某个文件的所有内容
$1(n):表示第一列(指定分隔符后,当前记录的第n个字段)
NF:分割后,当前行一共有多少个字段
NR:当前记录数,行数    
# 例如:NR==5 表示第5行
# 可以使用man awk来查看
语法1:
awk参数:
-F 指定分割字符串
-v 定义或者修改一个awk的内部变量
-f 从脚本文件中读取awk命令
# 示例:
root@k8s-node1 ~]# awk -F':' '{print $1}' test.sh   # 以:为输入分隔符获取该文件第一列的内容
ROOT
ETCD
bin
daemon
adm
lp
[root@k8s-node1 ~]# awk -v FS=":" '{print $1,$NF}' /etc/passwd    # -v 指定变量FS=":"为输入分隔符
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
[root@k8s-node1 ~]# awk -F=":" -v OFS="####" '{print $1,$NF}' /etc/passwd 
[root@k8s-node1 ~]# awk -v FS=":" -v OFS="####" '{print $1,$NF}' /etc/passwd   # -v 也可以指定OFS=”###“为输出分隔符
root####/bin/bash
bin####/sbin/nologin
daemon####/sbin/nologin
adm####/sbin/nologin
lp####/sbin/nologin
awk的分隔符

输入分隔符:awk默认是空格,空白字符;变量名是FS;当我们处理特殊文件时,可以自由指定分隔符。

输出分隔符:awk默认是空格,变量名简称是OFS。

awk的内置变量

FILENAME 当前输入文件的名。
FS  字段分隔符(默认是任何空格)。
OFS 输出字段分隔符(默认值是一个空格)。
NF  表示字段数,在执行过程中对应于当前的字段数。
NR  表示记录数,在执行过程中对应于当前的行号。
FNR 各文件分别计数的行号
ORS 输出记录分隔符(默认值是一个换行符)。
RS  记录分隔符(默认是一个换行符)。
ARGC  命令行参数的数目。
ARGV  数组,保存的是命令行的各参数。

实例:

1、一次性输出多列

[root@k8s-node1 ~]# cat -n test1.sh 
     1  pyyu0 pyyu1 pyyu2 pyyu3 pyyu4
     2  pyyu5 pyyu6 pyyu7 pyyu8 pyyu9
     3  pyyu10 pyyu11 pyyu12 pyyu13 pyyu14
     4  pyyu15 pyyu16 pyyu17 pyyu18 pyyu19
     5  pyyu20 pyyu21 pyyu22 pyyu23 pyyu24
     6  pyyu25 pyyu26 pyyu27 pyyu28 pyyu29
     7  pyyu30 pyyu31 pyyu32 pyyu33 pyyu34
     8  pyyu35 pyyu36 pyyu37 pyyu38 pyyu39
     9  pyyu40 pyyu41 pyyu42 pyyu43 pyyu44
    10  pyyu45 pyyu46 pyyu47 pyyu48 pyyu49
[root@k8s-node1 ~]# awk '{print $0}' test1.sh         # 查看全部
[root@k8s-node1 ~]# awk '{print}' test1.sh
pyyu0 pyyu1 pyyu2 pyyu3 pyyu4
pyyu5 pyyu6 pyyu7 pyyu8 pyyu9
pyyu10 pyyu11 pyyu12 pyyu13 pyyu14
pyyu15 pyyu16 pyyu17 pyyu18 pyyu19
pyyu20 pyyu21 pyyu22 pyyu23 pyyu24
pyyu25 pyyu26 pyyu27 pyyu28 pyyu29
pyyu30 pyyu31 pyyu32 pyyu33 pyyu34
pyyu35 pyyu36 pyyu37 pyyu38 pyyu39
pyyu40 pyyu41 pyyu42 pyyu43 pyyu44
pyyu45 pyyu46 pyyu47 pyyu48 pyyu49
[root@k8s-node1 ~]# awk '{print $1,$2}' test1.sh      # 输出第一列,第二列(中间用,隔开)
pyyu0 pyyu1
pyyu5 pyyu6
pyyu10 pyyu11
pyyu15 pyyu16
pyyu20 pyyu21
pyyu25 pyyu26
pyyu30 pyyu31
pyyu35 pyyu36
pyyu40 pyyu41
pyyu45 pyyu46

2、自定义输出内容。

[root@k8s-node1 ~]# awk '{print "第一列:"$1,"第二列:"$2}' test1.sh 
第一列:pyyu0 第二列:pyyu1
第一列:pyyu5 第二列:pyyu6
第一列:pyyu10 第二列:pyyu11
第一列:pyyu15 第二列:pyyu16
第一列:pyyu20 第二列:pyyu21
第一列:pyyu25 第二列:pyyu26
第一列:pyyu30 第二列:pyyu31
第一列:pyyu35 第二列:pyyu36
第一列:pyyu40 第二列:pyyu41
第一列:pyyu45 第二列:pyyu46
# awk 外层使用单引号,内层使用双引号;内置变量$1,$2都不加引号,以防识别为文本内容

3、显示文件3-8行的内容

[root@k8s-node1 ~]# awk 'NR==3,NR==5' test1.sh 
pyyu10 pyyu11 pyyu12 pyyu13 pyyu14
pyyu15 pyyu16 pyyu17 pyyu18 pyyu19
pyyu20 pyyu21 pyyu22 pyyu23 pyyu24
# 显示第3行到第5行的内容

4、设置模式(条件)

截取文件内容中第三行的第一个字段

[root@k8s-node1 ~]# awk 'NR==3{print $1}' test1.sh 
pyyu10
# 截取第5行的内容
[root@k8s-node1 ~]# awk 'NR==3{print}' test1.sh      
pyyu10 pyyu11 pyyu12 pyyu13 pyyu14
[root@k8s-node1 ~]# awk 'NR==3{print $0}' test1.sh 
pyyu10 pyyu11 pyyu12 pyyu13 pyyu14
练习:
[root@k8s-node1 ~]# free 
              total        used        free      shared  buff/cache   available
Mem:       15731672     2854776     9175884        6160     3701012    12552812
Swap:             0           0           0
[root@k8s-node1 ~]# free | awk 'NR==2{print $3}'
2855024
[root@k8s-node1 ~]# free | awk '{print $3}'
free
2853520
0

5、给文件添加行号

[root@k8s-node1 ~]# awk '{print NR,$0}' test1.sh 
1 pyyu0 pyyu1 pyyu2 pyyu3 pyyu4
2 pyyu5 pyyu6 pyyu7 pyyu8 pyyu9
3 pyyu10 pyyu11 pyyu12 pyyu13 pyyu14
4 pyyu15 pyyu16 pyyu17 pyyu18 pyyu19
5 pyyu20 pyyu21 pyyu22 pyyu23 pyyu24
6 pyyu25 pyyu26 pyyu27 pyyu28 pyyu29
7 pyyu30 pyyu31 pyyu32 pyyu33 pyyu34
8 pyyu35 pyyu36 pyyu37 pyyu38 pyyu39
9 pyyu40 pyyu41 pyyu42 pyyu43 pyyu44
10 pyyu45 pyyu46 pyyu47 pyyu48 pyyu49
# 显示文件的3-5行
[root@k8s-node1 ~]# awk 'NR==3,NR==5{print NR,$0}' test1.sh 
3 pyyu10 pyyu11 pyyu12 pyyu13 pyyu14
4 pyyu15 pyyu16 pyyu17 pyyu18 pyyu19
5 pyyu20 pyyu21 pyyu22 pyyu23 pyyu24
# 显示文件的第1列,倒数第2列和最后1列
[root@k8s-node1 ~]# awk '{print $1,$(NF-1),$NF}' test1.sh 
pyyu0 pyyu3 pyyu4
pyyu5 pyyu8 pyyu9
pyyu10 pyyu13 pyyu14
pyyu15 pyyu18 pyyu19
pyyu20 pyyu23 pyyu24
pyyu25 pyyu28 pyyu29
pyyu30 pyyu33 pyyu34
pyyu35 pyyu38 pyyu39
pyyu40 pyyu43 pyyu44
pyyu45 pyyu48 pyyu49

6、利用awk去除IP地址信息

[root@k8s-node1 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.41  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::216:3eff:fe38:7026  prefixlen 64  scopeid 0x20<link>
        ether 00:16:3e:38:70:26  txqueuelen 1000  (Ethernet)
        RX packets 15734888  bytes 6580772034 (6.1 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13116110  bytes 1139846254 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
[root@k8s-node1 ~]# ifconfig eth0 | awk 'NR==2'
        inet 10.0.0.41  netmask 255.255.255.0  broadcast 10.0.0.255
[root@k8s-node1 ~]# ifconfig eth0 | awk 'NR==2' | awk '{print $2}'
10.0.0.41

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值