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)和整行内容($0)
1 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
匹配字符串过滤出行
[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
按列(字段)输出
[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
输出本机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
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
扩展
[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
[root@localhost ~]# echo "A B C D" |awk '{OFS="|";print $0;$1=$1;print $0}'
A B C D
A|B|C|D
扩展
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