awk

概念

awk是一种优良的文本处理工具,linux及unix环境中现有的功能最强大的数据处理引擎之一,这种编程及数据操作语言的最大功能取决于一个人所拥有的知识
awk是三个人名的缩写

awk语言是由模式和动作组成

模式
正则表达式
关系表达式
匹配表达式

动作
变量
命令
内置函数
流控制语句
BEGIN语句 :  设置计数和打印头部信息,在任何动作之前执行
END语句 :  输出统计结果,在完成动作之后执行

awk工作通过3个步骤

  1. 读:从文件,管道,或者标准输入中读入一行然后把它放入内存中
  2. 执行:对每一行数据,根据AWK命令按照顺序执行,默认情况是处理每一行数据,也可以指定模式
  3. 重复,:一直重复上述两个过程直到文件结束

AWK支持两种不同类型的变量:内置变量,自定义变量

$n	:	当前记录的第n个字段,
$0	:	执行过程中当前行的文本内容
FILENAME	:	 当前输入文件的名
FS 	:	字段分割符(默认是空格)
$NF :	最后一列
NF	:	每一行的字段数量 
FNR	:	各文件分别计数的行号
NR	:	表示记录数,在执行过程中对应于当前的行号,
			NR和FNR的区别,
			NR在读取不同文件时,是一直增加的
			FNR在读取下一个文件时,从1开始计算
			
OFS	:	输出字段分隔符(默认值是一个空格)
ORS	:	输出记录分隔符(默认值是一个换行符)
RS	:	记录分隔符(默认是一个换行符)
\t	:	制表符
\n	:	换行符
~	:	匹配
!~	:	不匹配

-F指定输入分隔符,fs可以是字符串或者正则,分隔符默认是空格

[root@localhost ~]# echo aa/bb/cc/dd | awk -F "/" '{print $2}'
bb

将passwd中的用户名打印出来

[root@localhost ~]# awk -F ":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt

或者

[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt

过滤出系统的ip地址

[root@localhost ~]# ifconfig ens33 | grep netmask | awk '{print $2}'
192.168.43.162

参与运算

[root@localhost ~]# echo "12 12 14 1" > a.txt
[root@localhost ~]# awk '{print $1+10}' a.txt 
22

[root@localhost ~]# echo "one two three four" | awk '{print $NF}'
four
[root@localhost ~]# echo "one two three four" | awk '{print $(NF-1)}'
three
[root@localhost ~]# echo "one two three four" | awk '{print $(NF/2)}'
two

打印出passwd文件中用户uid小于10的用户名和他登录使用的shell
格式化输出 \t:tab键制表符

[root@localhost ~]# awk -F ":" '$3<10{print $1,"\t<===>\t",$NF}' /etc/passwd
root 	<===>	 /sbin/nologin
bin 	<===>	 /sbin/nologin
daemon 	<===>	 /sbin/nologin
adm 	<===>	 /sbin/nologin

打印出passwd中uid小于10且shell是bin/bash的用户

[root@localhost ~]# awk -F ":" '$3<10&&$NF="bin/bash"{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown

开始和结束模块

可以将上面的内容写入到脚本文件
[root@localhost ~]# cat test1.awk 
BEGIN{
  print "UserId\t\t\tShell"
  print "=================="
  FS=":"
}
$3<10 && $ NF="/sbin/nologin"{
  printf "%-20s %-20s\n",$1,$NF
}

执行
[root@localhost ~]# awk -f test1.awk /etc/passwd
UserId			Shell
==================
root                 /sbin/nologin       
bin                  /sbin/nologin       
daemon               /sbin/nologin       
adm                  /sbin/nologin       
lp                   /sbin/nologin       
sync                 /sbin/nologin       
shutdown             /sbin/nologin       
halt                 /sbin/nologin       
mail                 /sbin/nologin       
sss                  /sbin/nologin     

打印以root开头的行

[root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin

以bash结尾的行

[root@localhost ~]# awk '/bash$/' /etc/passwd
sss:x:0:0::/home/sss:/bin/bash

输出行号大于等于3且小于等于6的行

[root@localhost ~]# awk -F: '(NR>=3&&NR<=6){print $0}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

取出ip地址,(使用NR行号来定位)

[root@localhost ~]# ifconfig ens33 | awk 'NR==2{print $2}'
192.168.43.162

去除首行内容

[root@localhost ~]# ll
总用量 1716
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

[root@localhost ~]# ll | grep -v ^总
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

[root@localhost ~]# ll | sed 1d
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

[root@localhost ~]# ll | awk 'NR!=1{print $0}'
-rw-r--r-- 1 root root      11 10月  8 20:56 a.txt
-rw-r--r-- 1 root root      95 10月  9 08:37 free.sh
drwxrwxr-x 6 root root     325 9月  26 18:14 redis-4.0.11

使用awk找到包含root字符的行

[root@localhost ~]# awk '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

[root@localhost ~]# awk '/root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

[root@localhost ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:997:994:Docker User:/var/lib/docker:/sbin/nologin

不匹配root行

[root@localhost ~]# awk '!/root/' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
....

如果UID大于10,则输出user=>用户名, 否则输出pass=>用户名

[root@localhost ~]# awk -F: '{if($3>10){print "user=>"$1}else{print "pass=>"$1}}' /etc/passwd
pass=>root
pass=>bin
pass=>daemon
pass=>adm
pass=>lp
pass=>sync
pass=>shutdown
pass=>halt
pass=>mail
user=>operator
user=>games
user=>ftp
user=>nobody
user=>systemd-network

查出行号大于10,并且包含bin/bash的行

[root@localhost ~]# awk 'NR>10 && $NF ~ "bin/bash"{print $0}' /etc/passwd
sss:x:0:0::/home/sss:/bin/bash

引用变量时,使用单引号+双引号括起来的方式

[root@localhost ~]# awk 'BEGIN{print "'$USER'"}'
root

格式化输出内容

printf
不会自动打印换行符\n
%c显示字符的AscII码
%d十进制整数
%f显示浮点数
%s显示字符串
%% % 本身
%u 无符号整数

输出passwd文件的用户名列内容

[root@localhost ~]# awk -F":" '{printf "%s\n",$1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值