awk

工作原理:

逐行读取文件,默许以空格或tab键为分隔符,讲切割所得的各个字段保存到内建变量中,并按模式或许条件去履行修改指令。

sed指令常用于一整行的处理,而awk比较倾向于将一行分红多个“字段”然后进行处理。awk信息的读入也是逐行读取的,履行成果能够通过print的功能将字段数据打印显现。运用awk指令的过程中,能够运用逻辑操作符“&&”表明“与”、“||”表明“或”、“!”表明“非”;还能够进行简单的数学运算,如+、-、*、/、&、^、分别表明加、减、乘、取余和乘方。

指令格局

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

awk常见的内建变量(可直接运用)如下所示

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

AWK基础用法

按行输出

[root@localhost ~]# cat 3.txt
one
two
three
fore
five
six
seven
eight
nine
ten
[root@localhost ~]# awk '{print NR,$0}' 3.txt ##打印行号(NR)和整行内容($01 one
2 two
3 three
4 fore
5 five
6 six
7 seven
8 eight
9 nine
10 ten
[root@localhost ~]# awk 'NR==1,NR==3 {print $o}' 3.txt   ##打印1-3行的行内容
one
two
three
[root@localhost ~]# awk '(NR==1)||(NR==3) {print $0}' 3.txt   ##打印榜首行和第三行的行内容
one
three
[root@localhost ~]# awk '(NR%2)==1 {print}' 3.txt  ##打印奇数行的行内容
one
three
five
seven
nine
[root@localhost ~]# awk '(NR%2)==0 {print}' 3.txt  ##打印偶数行的行内容 
two
fore
six
eight
ten

文本三剑客之awk编辑器

文本三剑客之awk编辑器

匹配字符串过滤出行

[root@localhost ~]# cat 3.txt 
one
two
three
fore
five
six
seven
eight
nine
ten
[root@localhost ~]# awk '/s/ {print $0}' 3.txt 
six
seven

文本三剑客之awk编辑器

按列(字段)输出

[root@localhost ~]# awk -F ':' '{print $1,$3}'  /etc/pass
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@localhost ~]# awk 'BEGIN {FS=":"}; {print $1,$3}' /etc/pass
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
[root@localhost ~]# awk -F: '$3>500 {print $1}' /etc/passwd
polkitd
libstoragemgmt
colord
saslauth
setroubleshoot
chrony
geoclue
sssd
nfsnobody
gnome-initial-setup
denhjiaqi
wry
7
8
[root@localhost ~]# awk -F: '{if ($3>500) {print $1}}' /etc/passwd
polkitd
libstoragemgmt
colord
saslauth
setroubleshoot
chrony
geoclue
sssd
nfsnobody
gnome-initial-setup
denhjiaqi
wry
7
8

文本三剑客之awk编辑器

文本三剑客之awk编辑器

输出本机IP地址

[root@localhost ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.132.3  netmask 255.255.255.0  broadcast 192.168.132.255
        inet6 fe80::fc4d:8c45:8cfe:8b28  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:15:24:95  txqueuelen 1000  (Ethernet)
        RX packets 12475  bytes 920297 (898.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4385  bytes 459777 (449.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]# ifconfig ens33 | awk 'NR==2{print $2}'
192.168.132.3

文本三剑客之awk编辑器

BEGIN模式

BEGIN {操作1} awk在读取文件之前履行的操作
[条件] {操作2} awk逐行读取文件时履行的操作
END {操作3} awk在处理完文件一切行之后履行的操作
[root@localhost ~]# cat /etc/pass
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@localhost ~]# awk 'BEGIN{x=0};/\/bin\/bash$/{x++};END {print x}' /etc/pass
1

文本三剑客之awk编辑器

扩展

[root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1867048      336064     1070900        9340      460084     1307276
Swap:       4194300           0     4194300
[root@localhost ~]# free | awk '/Mem:/ {print int ($3/$2*100)"%"}'
18%
[root@localhost ~]# top -b -n 1 | head -5
top - 15:57:47 up 18:57,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 155 total,   1 running, 154 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  8.1 sy,  0.0 ni, 91.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867048 total,  1070432 free,   336388 used,   460228 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  1306912 avail Mem 
[root@localhost ~]# top -b -n 1 | head -5 |awk -F, '/Cpu/{print $4}' | awk '{print int($1)"%"}'
94%
[root@localhost ~]# ifconfig ens33 |awk '/RX p/{print $5}'
1013189
[root@localhost ~]# ifconfig ens33 |awk '/TX p/{print $5}'
507574
[root@localhost ~]# df -h |awk '/sda1/{print $4}'
836M
[root@localhost ~]# cat /etc/passwd |wc -l
46
[root@localhost ~]# who |wc -l
1
[root@localhost ~]# ps aux |wc -l
157
[root@localhost ~]# rpm -qa |wc -l
1380

文本三剑客之awk编辑器

[root@localhost ~]# echo "A B C D" |awk '{OFS="|";print $0;$1=$1;print $0}'
A B C D
A|B|C|D

文本三剑客之awk编辑器

扩展

date指令

Linux中 date指令能够用来显现或设定体系的日期与时刻。

格局

date -d “日期时刻” //显现字符串所☞日期和时刻
date <+时刻日期格局> //☞定日期
eg:
date -d “-1day”
date -d “1day”\

时刻日期格局

%%   输出字符 %
%a   星期几的缩写 (Sun..Sat)
%A   星期的完好称号(Sunday..Saturday)。 
%b   缩写的月份称号(例如,Jan)
%B   完好的月份称号(例如,January)
%c   本地日期和时刻(例如,Thu Mar  3 23:05:25 2005)
%C   世纪,和%Y相似,可是省略后两位(例如,20)
%d   日 (01..31)
%D   日期,等价于%m/%d/%y
%e   一月中的一天,格局运用空格填充,等价于%_d
%F   完好的日期;等价于 %Y-%m-%d
%g   ISO 标准计数周的年份的最终两位数字
%G   ISO 标准计数周的年份,通常只对%V有用
%h   等价于 %b
%H   小时 (00..23)
%I   小时 (01..12)
%j   一年中的第几天 (001..366)
%k   小时,运用空格填充 ( 0..23); 等价于 %_H
%l   小时, 运用空格填充 ( 1..12); 等价于 %_I
%m   月份 (01..12)
%M   分钟 (00..59)
%n   新的一行,换行符
%N   纳秒 (000000000..999999999)
%p   用于表明当地的AM或PM,如果未知则为空白
%P   相似 %p, 可是是小写的
%r   本地的 12 小时制时刻(例如 11:11:04 PM)
%R   24 小时制 的小时与分钟; 等价于 %H:%M
%S   秒 (00..60)
%t   刺进水平制表符 tab
%T   时刻; 等价于 %H:%M:%S
%u   一周中的一天 (1..7); 1 表明星期一
%U   一年中的第几周,周日作为一周的开始 (00..53)
%V   ISO 标准计数周,该方法将周一作为一周的开始 (01..53)
%w   一周中的一天(0..6),0代表星期天
%W   一年中的第几周,周一作为一周的开始(00..53)
%x   本地的日期格局(例如,12/31/99)
%X   本地的日期格局(例如,23:13:48)
%y   年份后两位数字 (00..99)
%Y   年
%Z  时区缩写 (如 EDT)

常用操作

date +%Y%m%d                   # 显现年月日
date -d "+1 day" +"%Y%m%d"       # 显现后一天的日期
date -d "-1 month" +"%Y%m%d"     # 显现上一月的日期
date -d "1 month ago" +"%Y%m%d"  # 显现上一月的日期
date -d "-1 year" +"%Y%m%d"      # 显现前一年的日期
date -d "10 second ago" +"%Y%m%d %H:%M:%S"  # 显现10秒前的时刻,显现具体的时分秒
[root@localhost ~]# date +"%y%m%d"
220917
[root@localhost ~]# date +"%Y%m%d"
20220917
[root@localhost ~]# date -d "-1 day" +"%Y%m%d"
20220916
[root@localhost ~]# date -d "-1 month" +"%Y%m%d"
20220817
[root@localhost ~]# date -d "-1 year" +"%Y%m%d"
20210917
[root@localhost ~]# date -d "10 second ago" +"%Y%m%d %H:%M:%S"
20220917 16:20:13

文本三剑客之awk编辑器