Shell学习笔记 三剑客-awk

awk简介

awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。

awk数据可以是来自标准输入、一个或者多个文件,或者其它命令的输出

它支持用户自定义函数和动态正则表达式等功能,是linux/unix下的一个强大的文本处理工具。

它在命令行中使用,但更多是配合脚本来使用。

awk 的处理文本和数据的方式是,逐行扫描文件,寻找匹配的特定模式的行,并在这些行上进行指定的操作。

如果没有指定的处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。

awk的语法格式

awk [option] 'commands' file
awk [option] -f awk-script-file file

options:
-F 定义输入字段分隔符,默认的分隔符是空格或是制表符

command:
BEGIN{}    {}        END{}
行处理前    行处理    行处理后

awk的基本用法 

[root@servicex ~]# awk 'BEGIN{print 1/2}'
0.5
[root@servicex ~]# awk 'BEGIN{print 1/2} {print "ok"}' /etc/hosts
0.5
ok
ok
[root@servicex ~]# awk 'BEGIN{print 1/2} {print "ok"} END{print "done"}' /etc/hosts
0.5
ok
ok
done
[root@servicex ~]# awk -F ':' '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-bus-proxy
systemd-network
dbus
polkitd
tss
postfix
sshd
chrony
sarah
natasha
harry
test
alex
mysql
lalin
[root@servicex ~]# awk -F ':' '{print $1,$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
systemd-bus-proxy /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
tss /sbin/nologin
postfix /sbin/nologin
sshd /sbin/nologin
chrony /sbin/nologin
sarah /sbin/nologin
natasha /bin/bash
harry /bin/bash
test /bin/bash
alex /bin/bash
mysql /sbin/nologin
lalin /bin/bash
[root@servicex ~]# df | awk '/\/$/ {if ($3 >1000000) print $5}'
9%
[root@servicex ~]# df | awk '/\/$/ {if ($3 <1000000) print $5}'
[root@servicex ~]# 

awk  工作原理

awk -F '{print $1,$3}' /etc/passwd
1.awk 使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束
2.awk进行字段分解,每个字段存储在已编号的变量中从$1开始,最多支持$100
3.awk默认情况下的分隔符是空格,因为有一个内部变量 FS 来确定字段分隔符。初始FS为空格
4.awk打印字段,将以设置的方法使用 print 函数打印
5.awk在打印的字段之间加上空客,因为$1,$3之间有一个逗号,逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符 OFS ,OFS默认为空格
6.awk输出之后,将从文件中获取零一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕。

awk 内部变量

$0 $0保存当前记录的内容

NR  The total number of input records seen so far 控制输出的总行数或者打印行号

FNR 记录文件的编号和行号

NF 保存行的最后一列内容

FS 指定字段分隔符,默认为空格

OFS 输出字段分隔符

awk 脚本编程

条件判断

if语句格式:

{if(表达式) {语句1,语句2......}}
//统计系统的用户数0-1000
[root@servicex ~]# awk -F ":" 'BEGIN{i=0} { if($3>0 && $3<1000) {i++} } END{print i " managers"}' /etc/passwd
21 managers

循环

数组

你可能感兴趣的:(Shell,redhat,linux)