龙岗企业网站设计公司wordpress充值提现
目录
一、前言
二、工作流程总览
三、最常用内置变量
四、命令格式
五、20 个高频实战案例
5.1 基础打印
awk '{print "hello"}' < /etc/passwd 所有行打印成hello
awk '{print}' test6.txt 打印test6.txt文件
awk '{print $1}' test6.txt 默认以空格为分割,取第一列
awk -F: 按照冒号分隔,取第五列
awk -F: '{print $1 $2}' test6.txt 按照冒号分隔,取第一和第二列
awk -F[:/] '{print $9}' test6.txt 以 : 或者 / 作为分隔符,取第九列
5.2 内置变量速用
awk -F: '/root/{print $0}' test6.txt 取含有root的每一行
awk -F: '/root/{print $1}' test6.txt 取含有root字段行的第一列
awk -F: '/root/{print $1,$4}' test6.txt 取第一列和第四行
awk -F[:/] '{print NF}' test6.txt 当前行的列数
awk -F[:/] '{print NR}' test6.txt 当前行号
awk -F: '{print NR,$0}' test6.txt 输出行号和内容
awk 'NR==2{print}' /etc/passwd 打印第二行
awk -F: 'NR==2{print $1}' +文件名 打印第二行第一列
awk -F: '{print $NF}' +文件名 打印最后一列
awk -F: '{print "第"NR"行有"NF"列"}' 打印有多少行和多少列
5.3 BEGIN & END 经典场景
awk 'BEGIN' 在文件开始时运用
awk 'END +命令' +文件路径 文件结束后打印
5.4 条件与逻辑
awk -F: '$1~/root/' 某一列中含有root的
awk -F: '$1~/ro/' 模糊匹配,只要第一列中含有ro就可以了
awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd 打印第七列不以/nologin结尾的行的第一列和第七列
awk 'NR==5{print}' +文件名 打印第五行
awk 'NR<5' /etc/passwd 打印前四行
awk 'NR>=45' /etc/passwd 打印45行以后
awk -F: '$1=="root"' /etc/passwd 打印第一列是root的
awk -F: '$3<30 || $3>1000' test8.txt 第三列小于30或者第三列大于1000
awk -F: '$3>30 && $3<1000' test8.txt 第3列大于30小于1000
awk -F: 'NR>4 && NR<10' /etc/passwd 第4-10行
5.5 输出格式控制
awk 'BEGIN{FS=":"}{print $1}' test8.txt 打印之前定义字段,分隔符为冒号
awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' test8.txt 以冒号为分隔符,中间用---连接5.5 输出格式控制
5.6 生产常用
5.7 调用 Shell 命令
六、数组 + 循环:日志分析利器
6.1 基本数组
6.2 统计 SSH 爆破 IP
七、面试题加餐
八、三剑客对比
九、总结
一、前言
awk 是 Linux 文本三剑客中的“列处理专家”,贝尔实验室三巨头发明,现以 gawk 形式随系统自带。它按行读取、以列运算,用 pattern{action} 一句话就能完成取字段、过滤、统计、格式化输出。BEGIN 初始化,END 汇总,内置变量 1NF NR FS 等让日常 90% 的日志分析、系统巡检、数据报表需求一行搞定;支持正则、逻辑运算、数组循环,更可管道调用 shell 命令,堪称运维与开发的万能文本瑞士军刀。
二、工作流程总览
BEGIN{ … } # 初始化,只执行一次
/pattern/{ … } # 对每一行匹配 pattern 后执行动作(默认无 pattern 则全部执行)
END{ … } # 收尾汇总,只执行一次
核心循环:读(Read) → 执行(Execute) → 重复(Repeat),直到文件结束。
三、最常用内置变量
变量 | 含义 | 示例 |
---|---|---|
$0 | 整行内容 | |
$n | 第 n 列 | $1 第 1 列 |
NF | 当前行的列数 | print NF |
NR | 当前行号(所有文件累计) | print NR |
FNR | 当前行号(每个文件单独计数) | |
FS | 输入字段分隔符(默认空格/Tab) | FS=":" |
OFS | 输出字段分隔符(默认空格) | OFS="," |
RS | 输入记录分隔符(默认 \n ) | |
ORS | 输出记录分隔符(默认 \n ) |
四、命令格式
# 单行直写
awk [选项] '模式{动作}' file# 脚本文件
awk -f script.awk file
五、20 个高频实战案例
5.1 基础打印
# 1. 每行打印 hello
awk '{print "hello"}' /etc/passwd# 2. 输出整行
awk '{print}' zz# 3. 以冒号为分隔符,打印第 5 列
awk -F: '{print $5}' zz# 4. 多分隔符(冒号或斜杠)
awk -F '[:/]' '{print $9}' zz
awk '{print "hello"}' < /etc/passwd 所有行打印成hello
[root@zard3 shelldemo]# awk '{print "hello"}' < /etc/passwd
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
hello
...... 一共52行,因为cat /etc/passwd里面一共是52行
awk '{print}' test6.txt 打印test6.txt文件
[root@zard3 shelldemo]# cat /etc/passwd | head -10 > test6.txt
[root@zard3 shelldemo]# awk '{print}' test6.txt
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
operator:x:11:0:operator:/root:/sbin/nologin
awk '{print $1}' test6.txt 默认以空格为分割,取第一列
[root@zard3 shelldemo]# awk '{print $1}' test6.txt
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
operator:x:11:0:operator:/root:/sbin/nologin
awk -F: 按照冒号分隔,取第五列
[root@zard3 shelldemo]# awk -F: '{print $5}' test6.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
awk -F: '{print $1 $2}' test6.txt 按照冒号分隔,取第一和第二列
awk -F[:/] '{print $9}' test6.txt 以 : 或者 / 作为分隔符,取第九列
[root@zard3 shelldemo]# awk -F[:/] '{print $9}' test6.txt
bin
sbin
sbinlpd
bin
sbin
sbin
mail
sbin
注意:在每一行中:/在一起是算作是一个空字符的
以第一行为例,证明以上观点
5.2 内置变量速用
# 5. 行号 + 整行
awk '{print NR,$0}' /etc/passwd# 6. 只看第 2 行
awk 'NR==2' /etc/passwd# 7. 最后一列
awk -F: '{print $NF}' /etc/passwd# 8. 文件总行数
awk 'END{print NR}' /etc/passwd
awk -F: '/root/{print $0}' test6.txt 取含有root的每一行
[root@zard3 shelldemo]# awk -F: '/root/{print $0}' test6.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
awk -F: '/root/{print $1}' test6.txt 取含有root字段行的第一列
[root@zard3 shelldemo]# awk -F: '/root/{print $1}' test6.txt
root
operator
awk -F: '/root/{print $1,$4}' test6.txt 取第一列和第四行
[root@zard3 shelldemo]# awk -F: '/root/{print $1,$4}' test6.txt
root 0
operator 0
awk -F[:/] '{print NF}' test6.txt 当前行的列数
[root@zard3 shelldemo]# awk -F[:/] '{print NF}' test6.txt
10
10
10
11
12
10
10
10
12
10
awk -F[:/] '{print NR}' test6.txt 当前行号
[root@zard3 shelldemo]# awk -F[:/] '{print NR}' test6.txt
1
2
3
4
5
6
7
8
9
10
awk -F: '{print NR,$0}' test6.txt 输出行号和内容
awk 'NR==2{print}' /etc/passwd 打印第二行
awk -F: 'NR==2{print $1}' +文件名 打印第二行第一列
[root@zard3 shelldemo]# awk -F: 'NR==2{print $1}' /etc/passwd
bin
awk -F: '{print $NF}' +文件名 打印最后一列
[root@zard3 shelldemo]# awk -F: '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
...此处省略
awk -F: '{print "第"NR"行有"NF"列"}' 打印有多少行和多少列
[root@zard3 shelldemo]# awk -F: '{print "第"NR"行有"NF"列"}' /etc/passwd
第1行有7列
第2行有7列
第3行有7列
第4行有7列
第5行有7列
第6行有7列
第7行有7列
第8行有7列
第9行有7列
第10行有7列
第11行有7列
第12行有7列
第13行有7列
第14行有7列
第15行有7列
第16行有7列
第17行有7列
第18行有7列
第19行有7列
第20行有7列
... 此处省略
5.3 BEGIN & END 经典场景
# 9. 计算 1~100 的和
seq 100 | awk '{sum+=$1} END{print sum}'# 10. 统计 /bin/bash 结尾的行数
awk 'BEGIN{n=0} /\/bin/bash$/{n++} END{print n}' /etc/passwd
awk 'BEGIN' 在文件开始时运用
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print x}'
12
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print x}' test6.txt
12
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print x+1}'
13
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print 4.5+4.5}'
9
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print 3*3}'
9
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print 3**3}'
27
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print 3/4}'
0.75
[root@zard3 shelldemo]# awk 'BEGIN{x=12;print 3/4}' >test7.txt
[root@zard3 shelldemo]# cat test7.txt
0.75
awk 'END +命令' +文件路径 文件结束后打印
5.4 条件与逻辑
# 11. 模糊匹配:第 1 列包含 root
awk -F: '$1 ~ /root/' /etc/passwd# 12. 数值比较:UID ≥ 1000
awk -F: '$3>=1000' /etc/passwd# 13. 区间行:第 5~10 行
awk 'NR>=5 && NR<=10' /etc/passwd
awk -F: '$1~/root/' 某一列中含有root的
awk -F: '$1~/ro/' 模糊匹配,只要第一列中含有ro就可以了
[root@zard3 shelldemo]# awk -F: '$1~/ro/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin
chrony:x:992:987::/var/lib/chrony:/sbin/nologin
awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd 打印第七列不以/nologin结尾的行的第一列和第七列
awk 'NR==5{print}' +文件名 打印第五行
[root@zard3 shelldemo]# awk 'NR==5{print}' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@zard3 shelldemo]# awk 'NR==5' /etc/passwd
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
awk 'NR<5' /etc/passwd 打印前四行
[root@zard3 shelldemo]# awk 'NR<5' /etc/passwd
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
awk 'NR>=45' /etc/passwd 打印45行以后
[root@zard3 shelldemo]# awk 'NR>=45' /etc/passwd
test1:x:1001:1001::/home/test1:/bin/bash
tom:x:1002:1002::/home/tom:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
named:x:25:25:Named:/var/named:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zard111:x:1003:1003::/home/zard111:/bin/bash
test3:x:1004:1004::/home/test3:/bin/bash
test4:x:1005:1005::/home/test4:/bin/bash
awk -F: '$1=="root"' /etc/passwd 打印第一列是root的
[root@zard3 shelldemo]# awk -F: '$1==root' /etc/passwd
[root@zard3 shelldemo]# awk -F: '$1=="root"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
awk -F: '$3<30 || $3>1000' test8.txt 第三列小于30或者第三列大于1000
[root@zard3 shelldemo]# awk -F: '$3<30 || $3>1000' test8.txt
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
test1:x:1001:1001::/home/test1:/bin/bash
tom:x:1002:1002::/home/tom:/bin/bash
zard111:x:1003:1003::/home/zard111:/bin/bash
test3:x:1004:1004::/home/test3:/bin/bash
test4:x:1005:1005::/home/test4:/bin/bash
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
awk -F: '$3>30 && $3<1000' test8.txt 第3列大于30小于1000
[root@zard3 shelldemo]# awk -F: '$3>30 && $3<1000' test8.txt
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin
geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin
sssd:x:990:984:User for sssd:/:/sbin/nologin
unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin
chrony:x:992:987::/var/lib/chrony:/sbin/nologin
setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin
saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin
gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin
saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
awk -F: 'NR>4 && NR<10' /etc/passwd 第4-10行
[root@zard3 shelldemo]# awk -F: 'NR>4 && NR<10' /etc/passwd
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
5.5 输出格式控制
# 14. 指定输出分隔符 OFS
awk -F: 'BEGIN{OFS="---"} {print $1,$2}' /etc/passwd# 15. 把多行合并成一行
awk 'BEGIN{ORS=" "} {print}' /etc/passwd
awk 'BEGIN{FS=":"}{print $1}' test8.txt 打印之前定义字段,分隔符为冒号
[root@zard3 shelldemo]# awk 'BEGIN{FS=":"}{print $1}' test8.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
named
mysql
rpcuser
rpc
ntp
gdm
apache
tss
avahi
tcpdump
sshd
radvd
dbus
postfix
nobody
qemu
usbmuxd
pulse
rtkit
abrt
systemd-network
gnome-initial-setup
geoclue
sssd
unbound
chrony
setroubleshoot
saslauth
gluster
saned
colord
libstoragemgmt
polkitd
zard3
test1
tom
zard111
test3
test4
nfsnobody
awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' test8.txt 以冒号为分隔符,中间用---连接5.5 输出格式控制
# 14. 指定输出分隔符 OFS
awk -F: 'BEGIN{OFS="---"} {print $1,$2}' /etc/passwd# 15. 把多行合并成一行
awk 'BEGIN{ORS=" "} {print}' /etc/passwd
5.6 生产常用
# 16. 取本机 ens33 网卡 IP
ifconfig ens33 | awk '/netmask/{print "IP="$2}'# 17. 取根分区可用空间
df -h | awk 'NR==2{print "Avail="$4}'# 18. 统计 Apache 访问日志中每个 IP 出现次数
awk '{ip[$1]++} END{for(i in ip) print ip[i],i}' /var/log/httpd/access_log | sort -nr | head
ifconfig ens33 |awk '/RX p/{print $5"字节"} 找ifconfig ens33里面包含RX p字段的行的第五列
df -h|awk 'NR==2{print $4}' df -h中第二行第四列
awk '{print NR,$0}' /etc/resolv.conf /etc/hosts 同时读取/etc/resolv.conf和/etc/hosts的行号和每一行的内容
[root@zardcopy ~]# awk '{print NR,$0}' /etc/resolv.conf /etc/hosts
1 # Generated by NetworkManager
2 nameserver 255.255.255.0
3 nameserver 8.8.8.8
4 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
5 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
6 192.168.10.101 zardcopy
7 192.169.10.104 zard
8
5.7 调用 Shell 命令
# 19. 统计当前在线用户
awk 'BEGIN{while ("w"|getline) n++; print n-2}'# 20. 动态获取主机名
awk 'BEGIN{"hostname"|getline; print $0}'
六、数组 + 循环:日志分析利器
6.1 基本数组
# 字符串下标
awk 'BEGIN{a["ip"]=192.168.1.1; print a["ip"]}'
6.2 统计 SSH 爆破 IP
awk '/Failed password/{ip[$11]++}END{for(i in ip) print i","ip[i]}' /var/log/secure
配合脚本实时告警:
#!/bin/bash
awk '/Failed password/{ip[$11]++}END{for(i in ip){if(ip[i]>=3) print "警告!",i,"失败次数",ip[i]}}' /var/log/secure
七、面试题加餐
-
提取版本号
文本:1.9.7
命令:echo "1.9.7" | awk -F. '{print $1,$2,$3}'
-
两列合并,中间留 2 空格
文件内容:zhangsan 20 江苏南京 汉族
命令
awk '{printf "%s %s\n",$1,$3}' file
八、三剑客对比
工具 | 定位 | 擅长场景 |
---|---|---|
grep | 纯文本过滤 | 快速查找、正则匹配 |
sed | 流编辑器 | 整行替换/删除/插入 |
awk | 报告生成器 | 按列处理、统计、格式化输出 |
九、总结
awk 是 Linux 下最锋利的「列级」文本处理刀:按行读、按列切、按条件算、按格式吐,一行搞定过滤、统计、报表三大需求。
速记
-
结构:
BEGIN{一次} pattern{每行} END{汇总}
-
必背 4 变量:
$0
整行、$n
第 n 列、NF
列数、NR
行号 -
必背 2 符号:
~
包含、!~
不包含;-F
指定分隔符 -
三板斧:
• 取列:awk -F: '{print $1,$7}' /etc/passwd
• 统计:awk '{ip[$1]++} END{for(i in ip) print ip[i],i}' access.log
• 过滤:awk -F: '$3>=1000 && $7!~/nologin$/{print $1}' /etc/passwd
-
场景:日志 IP 排名、系统指标监控、配置文件批量修改、实时告警脚本。
掌握 awk,告别手搓 sed/grep 组合,让文本处理从 10 行变 1 行。