内容目录:
内容一:awk 格式
内容二:选项
2.1 awk 的 -F 选项
2.2 awk 的 RS、ORS、FS、OFS 选项
2.3 awk 的 sub、gsub 选项
2.3.1 sub 和 gsub 的区别
2.3.2 sub 和 gsub 的格式
2.3.2.1 sub 的格式
2.3.2.2 gsub 的格式
内容三:awk 的常用内置变量
内容四: awk 的使用案例
4.1 案例一:awk 基础打印
4.1.1 打印文档第 1 列和第 3 列,但中间没有空格
4.1.2 打印文档第 1 列和第 3 列
4.1.3 打印文档第 1 列和第 3 列,但中间有很长的空格空间
4.1.4 打印倒数第 2 列
4.1.5 打印每一行的行号和列数
4.1.6 打印前一个命令结果的第 5 列
4.1.7 打印前一个命令结果的第 5 列
4.1.8 打印第 2 到最后 1 列
4.1.9 打印每行的行数、列数、第 1 列和最后 1 列,并且将冒号 “:” 视为分割符
4.1.10 打印第 1 列,这里的 \047 代表的是单引号 “’”,并且将冒号 “:” 视为分割符
4.2 案例二:awk 替换打印
4.2.1 将第 1 列为 root 的行的第 3 列替换成 “1” 后打印,并且将冒号 “:” 视为分割符
4.2.2 将全部横杠 “-” 替换成空值后打印
4.2.3 将全部横杠 “-” 替换成 3 个星号 “***” 后打印
4.2.4 给每一行前面添加行号后打印
4.2.5 以竖杠 “|” 作为分割符将第 2 列的数字去掉后打印
4.2.6 将句号 “.” 替换成换行符后打印
4.2.7 将换行符替换成句号 “.” 后打印
4.3 案例三:awk 变量
4.3.1 将 date 命令的运行结果,通过 getline 赋值给 d ,之后将 d 的值打印出来
4.3.2 将 eternalcenter 的值赋予给 content,并将 content 变量的值打印出来
4.4 案例四:awk 自定义分割列符号
4.4.1 将冒号 ”:“ 视为分割符
4.5 案例五:awk 打印常量
4.6 案例六:awk 使用正则表达式匹配
4.6.1 打印包含 Failed 的行的第 11 列
4.6.2 打印以 bash 结尾的行,并且将冒号 “:” 视为分割符
4.6.3 打印以 root 或者 adm 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.6.4 打印以 r 或者 a 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.6.5 打印第 1 列包含 root 的行,并且将冒号 “:” 视为分割符
4.6.6 打印第 7 列不以 nologin 结尾的行的第 1 列和第 7 列,并且将冒号 “:” 视为分割符
4.6.7 打印前一个命令包含 Rx p 的行的第 5 列
4.6.8 打印前一个命令以 / 结尾的行的第 4 列
4.6.9 打印第一列以两个数字结尾的行的第一列,并且将冒号 “:” 视为分割符
4.6.10 打印以 root 开头到以 mysql 开头的所有行的第 1 列,并且将冒号 “:” 视为分割符
4.7 案例七:awk 使用比较运算符匹配
4.7.1 打印行号等于 3 的行,并且将冒号 “:” 视为分割符
4.7.2 打印第 3 列数值等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.3 打印第 3 列数值不等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.4 打印第 3 列数值大于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.5 打印第 3 列数值小于 10 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
4.7.6 打印第 3 列数值大于 10 并且小于 20 的行,并且将冒号 “:” 视为分割符
4.7.7 打印第 3 列数值大于 1000 或者小于 10 的行,并且将冒号 “:” 视为分割符
4.7.8 打印第 3 列乘以第 4 列小于 100 的行,并且将冒号 “:” 视为分割符
4.7.9 打印第 1 列为 root 的行,并且将冒号 “:” 视为分割符
4.8 案例八:awk 计算
4.8.1 0 + 1 = 1
4.8.2 x = 0 + 1
4.8.3 x = 8 + 2
4.8.4 x = 8 – 1
4.8.5 2 + 3 = 5
4.8.6 2 * 3 = 6
4.8.7 3.2 + 3.5 = 6.7
4.8.8 23 除 8 余 7
4.8.9 打印第 3 加上 10 的结果,并且将冒号 “:” 视为分割符
4.8.10 找 200 以内 3 的倍数
4.8.11 找 100 以内 7 的倍数或者包含 7 的数
4.8.12 将第 4 列求和后打印,并且将冒号 “:” 视为分割符
4.9 案例九:awk 计数
4.9.1 计算以 bash 结尾的行数
4.9.2 计算第 3 列小于等于 1000 的行数,并且将冒号 “:” 视为分割符
4.9.3 计算 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
4.9.4 计算第 7 列以 bash 结尾的行数,并且将冒号 “:” 视为分割符
4.9.5 计算第 3 列和第 4 列的和赋值给变量,将变量的值打印出来,并且将冒号 “:” 视为分割符
4.9.6 计算第 1 列所有值各自总共出现的次数
4.9.7 统计此行中横杠 “-” 出现的次数并将第 4 列替换为次数
4.10 案例十:awk if 判断语句计数
4.10.1 计算第 3 列小于等于 1000 的行数和第 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
4.10.2 计算第 7 列以 bash 结尾的行数和第 7 列不以 bash 结尾的行数,并且将冒号 “:” 视为分割符
4.10.3 如果第 3 列等于 0 则打印 “root”,否则打印 “not root”,并且将冒号 “:” 视为分割符
4.10.4 如果第 3 列大于 1000 则打印第 3 列的值,否则打印 “system id”,并且将冒号 “:” 视为分割符
4.11 案例十一:awk for 循环实现同时批量输出值的名称和值
4.11.1 创建数组 a,其中 a[0]=0 a[1]=11 a[2]=22,并且将数组 a 打印出来
4.11.2 统计所有的 IP 地址以及每一个 IP 地址访问的次数
4.11.3 统计所有的 IP 地址以及每一个 IP 地址访问的次数,并以从多到少的顺序进行排序
4.11.4 将每一列的值前面加上所属行的行号,按行打印出来
4.11.5 将每一列的值前面加上所属行的行号,按行打印出来
4.12 案例十二:awk 打印表格
具体的内容:
内容一:awk 格式
# awk <option> '<condition>{<command>}' <file>
# awk <option> ' BEGIN{<option> <command>} {<command>} END{<command>}' <file>
(
补充:在这里
BEGIN{ } 里的指令只执行 1 次,并且是最先执行
{ } 里的指令会一行行地执行文件里的内容
END{ } 里指令只执行 1 次,并且是最后执行
)
内容二:选项
2.1 awk 的 -F 选项
awk 默认是以空格分割列,但是也可以通 -F 参数指定分割每一列的符号
2.2 awk 的 RS、ORS、FS、OFS 选项
RS 全名为 Record Separator 即指定记录分隔符
ORS 全名为 Output Record Separate 即指定输出记录分隔符
FS 全名为 Field Separator 即指定字段分隔符
OFS 全名为 Output Field Separator 即指定输出字段分隔符
2.3 awk 的 sub、gsub 选项
2.3.1 sub 和 gsub 的区别
sub 只匹配第一个字符串,类似于 sed ‘s//’
gsub 匹配所有字符串,类似于 sed ‘s//g’
2.3.2 sub 和 gsub 的格式
2.3.2.1 sub 的格式
# sub (<original string or regular expression>, <substitution string>):
# sub (<original string or regular expression>, <substitution string>, <target string>)
2.3.2.2 gsub 的格式
# gsub (<original string or regular expression>, <substitution string>):
# gsub (<original string or regular expression>, <substitution string>, <target string>)
内容三:awk 的常用内置变量
1) $0 文本当前行的全部内容
2) $1 文本的第 1 列
3) $2 文本的第 2 列
4) $3 文本的第 3 列
(补充:“$” 号后面的数字以此类推)
5) NR 文本当前行的行数,也就是目前处于第几行
6) NF 文本当前行的列数,也就是目前一共有几列
7) $(NF-1) 文本倒数第一列
8) $(NF-2) 文本倒数第二列
9) $(NF-3) 文本倒数第三列
10) , 代表空格
11) \t 代表 tab 制表位,就是比一个空格更多的空格
内容四: awk 的使用案例
4.1 案例一:awk 基础打印
4.1.1 打印文档第 1 列和第 3 列,但中间没有空格
# awk '{print $1,$3}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
4.1.2 打印文档第 1 列和第 3 列
# awk '{print $1,$3}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
4.1.3 打印文档第 1 列和第 3 列,但中间有很长的空格空间
# awk '{print $1,$3}' test.txt
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
4.1.4 打印倒数第 2 列
# awk '{print $(NF-2)}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.1.5 打印每一行的行号和列数
# awk -F: '{print NR,NF}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.1.6 打印前一个命令结果的第 5 列
# df -h | awk '{print $5}'
4.1.7 打印前一个命令结果的第 5 列
# df -h / | tail -1 | awk '{print $5}'
4.1.8 打印第 2 到最后 1 列
# cat test.txt | awk '{$1="";print}' | sed -r 's/( )(.*)/\2/'
(
补充:
1)这里的 /etc/passwd 是要被 awk 操作的测试文件
2)这里的 $1=”” 是将第一设置为空
3)这里的 print 作用相当于 print $0
)
4.1.9 打印每行的行数、列数、第 1 列和最后 1 列,并且将冒号 “:” 视为分割符
# awk -F: '{print NR,NF,$1,$NF}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.1.10 打印第 1 列,这里的 \047 代表的是单引号 “’”,并且将冒号 “:” 视为分割符
# awk -F: '{print "\047 $1 \047"}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.2 案例二:awk 替换打印
4.2.1 将第 1 列为 root 的行的第 3 列替换成 “1” 后打印,并且将冒号 “:” 视为分割符
# awk -F: '$1=="root"{ $3 = '1';print }' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.2.2 将全部横杠 “-” 替换成空值后打印
# echo "z m y z-m-y 2021-11-11 z:y" | awk 'gsub(/-/,"")'
z m y zmy 20211111 z:y
或者:
# echo eternal-center-zmy | awk 'BEGIN{ FS="-";}{print $1,$2,$3}'
eternal center zmy
4.2.3 将全部横杠 “-” 替换成 3 个星号 “***” 后打印
# echo eternal-center-zmy | awk 'BEGIN{ FS="-";OFS="***"}{print $1,$2,$3}'
eternal***center***zmy
4.2.4 给每一行前面添加行号后打印
# cat test.txt
eternalcenter.com-ec-myz
eternalcentre.com-ec-myz
eternalcenter.org-ec-myz
eternalcentre.org-ec-myz
# awk 'BEGIN{ OFS="." }{ print NR,$0}' test.txt
1.eternalcenter.com-ec-myz
2.eternalcentre.com-ec-myz
3.eternalcenter.org-ec-myz
4.eternalcentre.org-ec-myz
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
4.2.5 以竖杠 “|” 作为分割符将第 2 列的数字去掉后打印
# cat test.txt
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org
# awk -F '|' 'BEGIN{ OFS="|" }{sub(/[0-9]+/,"",$2);print$0}' test.txt
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
或者:
# cat test.txt
eternalcenter.com|201901ec|com
eternalcentre.com|201902ec|com
zhumingyu.com|201903zmy|com
mingyuzhu.com|201904myz|com
eternalcenter.org|201905ec|org
eternalcentre.org|201906ec|org
# awk -F '|' -v OFS='|' '{sub(/[0-9]+/,"",$2);print $0}' test.txt
eternalcenter.com|ec|com
eternalcentre.com|ec|com
zhumingyu.com|zmy|com
mingyuzhu.com|myz|com
eternalcenter.org|ec|org
eternalcentre.org|ec|org
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
4.2.6 将句号 “.” 替换成换行符后打印
# cat test.txt
m.y.z
# awk 'BEGIN{RS=".";}{print $0}' test.txt
m
y
z
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
4.2.7 将换行符替换成句号 “.” 后打印
# cat test.txt
m
y
z
# awk 'BEGIN{ORS=".";}{print $0}' test.txt
m.y.z.
(补充:这里的 test.txt 是要被 awk 操作的测试文件)
4.3 案例三:awk 变量
4.3.1 将 date 命令的运行结果,通过 getline 赋值给 d ,之后将 d 的值打印出来
# awk 'BEGIN {"date"|getline d; print d}'
4.3.2 将 eternalcenter 的值赋予给 content,并将 content 变量的值打印出来
# content=eternalcenter
# awk '{print "$content"}'
content
# awk '{print '$content'}'
eternalcenter
(补充:awk 在使用变量时必须使用单引号 “’”,否则会把变量名称当作字符串)
4.4 案例四:awk 自定义分割列符号
4.4.1 将冒号 ”:“ 视为分割符
# awk -F: '{print $1,$7}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.4.2 将冒号 ”:“ 和句号 “.” 视为分割符
# awk -F [:.] '{print $1,$10}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.5 案例五:awk 打印常量
# awk -F: '{print $1,"的解释器是:",$7}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.6 案例六:awk 使用正则表达式匹配
4.6.1 打印包含 Failed 的行的第 11 列
# awk '/Failed/{print $11}' /var/log/secure
(补充:这里的 /var/log/secure 是要被 awk 操作的测试文件)
4.6.2 打印以 bash 结尾的行,并且将冒号 “:” 视为分割符
# awk -F: '/bash$/{print}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.6.3 打印以 root 或者 adm 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
# awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.6.4 打印以 r 或者 a 开头的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
# awk -F: '/^[ra]/{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.6.5 打印第 1 列包含 root 的行,并且将冒号 “:” 视为分割符
# awk -F: '$1~/root/' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.6.6 打印第 7 列不以 nologin 结尾的行的第 1 列和第 7 列,并且将冒号 “:” 视为分割符
# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.6.7 打印前一个命令包含 Rx p 的行的第 5 列
# ifconfig eth0 | awk '/RX p/{print $5}'
4.6.8 打印前一个命令以 / 结尾的行的第 4 列
# df -h | awk '/\/$/{print $4}'
4.6.9 打印第一列以两个数字结尾的行的第一列,并且将冒号 “:” 视为分割符
# awk -F: '$1 ~/[0-9][0-9]$/(print $1}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.6.10 打印以 root 开头到以 mysql 开头的所有行的第 1 列,并且将冒号 “:” 视为分割符
# awk -F '/^root/,/^mysql/{print $1}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7 案例七:awk 使用比较运算符匹配
4.7.1 打印行号等于 3 的行,并且将冒号 “:” 视为分割符
# awk -F: 'NR==3{print}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.2 打印第 3 列数值等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
# awk -F: '$3==1000{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.3 打印第 3 列数值不等于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
# awk -F: '$3!=1000{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.4 打印第 3 列数值大于 1000 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
# awk -F: '$3>=1000{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.5 打印第 3 列数值小于 10 的行的第 1 列和第 3 列,并且将冒号 “:” 视为分割符
# awk -F: '$3<10{print $1,$3}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.6 打印第 3 列数值大于 10 并且小于 20 的行,并且将冒号 “:” 视为分割符
# awk -F: '$3>10 && $3<20' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.7 打印第 3 列数值大于 1000 或者小于 10 的行,并且将冒号 “:” 视为分割符
# awk -F: '$3>1000 || $3<10' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.8 打印第 3 列乘以第 4 列小于 100 的行,并且将冒号 “:” 视为分割符
# awk -F: '$3 * $4 <100' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.7.9 打印第 1 列为 root 的行,并且将冒号 “:” 视为分割符
# awk -F: '$1=="root"' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.8 案例八:awk 计算
4.8.1 0 + 1 = 1
# awk 'BEGIN{print x+1}'
(注意:这里的 x 可以不定义,直接用,默认值为 0)
4.8.2 x = 0 + 1
# awk 'BEGIN{x++;print x}'
(注意:这里的 x 可以不定义,直接用,默认值为 0)
4.8.3 x = 8 + 2
# awk 'BEGIN{x=8;print x+=2}'
(注意:这里的 x 可以不定义,直接用,默认值为 0)
4.8.4 x = 8 – 1
# awk 'BEGIN{x=8;x--;print x}'
(注意:这里的 x 可以不定义,直接用,默认值为 0)
4.8.5 2 + 3 = 5
# awk 'BEGIN{print 2+3}'
4.8.6 2 * 3 = 6
# awk 'BEGIN{print 2*3}'
4.8.7 3.2 + 3.5 = 6.7
# awk 'BEGIN{print 3.2+3.5}'
4.8.8 23 除 8 余 7
# awk 'BEGIN{ print 23%8}'
4.8.9 打印第 3 加上 10 的结果,并且将冒号 “:” 视为分割符
# awk -F: '$3 + 10' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.8.10 找 200 以内 3 的倍数
# seq 200 | awk '$1%3==0'
4.8.11 找 100 以内 7 的倍数或者包含 7 的数
# seq 100 | awk '$1%7==0||$1~/7/'
4.8.12 将第 4 列求和后打印,并且将冒号 “:” 视为分割符
# awk -F: 'BEGIN{total=0}{total+=$4}END{print total}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.9 案例九:awk 计数
4.9.1 计算以 bash 结尾的行数
# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.9.2 计算第 3 列小于等于 1000 的行数,并且将冒号 “:” 视为分割符
# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.9.3 计算 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.9.4 计算第 7 列以 bash 结尾的行数,并且将冒号 “:” 视为分割符
# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.9.5 计算第 3 列和第 4 列的和赋值给变量,将变量的值打印出来,并且将冒号 “:” 视为分割符
# awk -F: '{result=$3+$4; printf result}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.9.6 计算第 1 列所有值各自总共出现的次数
# awk '{a[$1]++}END{for(i in a){print i,a[$i]}}' /usr/local/nginx/logs/access.log
(补充:这里的 /usr/local/nginx/logs/access.log 是要被 awk 操作的测试文件)
4.9.7 统计此行中横杠 “-” 出现的次数并将第 4 列替换为次数
# echo "z- m y 2021-11-11 z:y" | awk '$4=gsub(/-/,"")'
z m y 3 z:y
4.10 案例十:awk if 判断语句计数
4.10.1 计算第 3 列小于等于 1000 的行数和第 3 列大于 1000 的行数,并且将冒号 “:” 视为分割符
# awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.10.2 计算第 7 列以 bash 结尾的行数和第 7 列不以 bash 结尾的行数,并且将冒号 “:” 视为分割符
# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.10.3 如果第 3 列等于 0 则打印 “root”,否则打印 “not root”,并且将冒号 “:” 视为分割符
# awk -F: '{print ($3=0 ? "root": not root)}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.10.4 如果第 3 列大于 1000 则打印第 3 列的值,否则打印 “system id”,并且将冒号 “:” 视为分割符
# awk -F: 'BEGIN{max=1000}{id=($3>max ?$3 :"system id");print id}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.11 案例十一:awk for 循环实现同时批量输出值的名称和值
4.11.1 创建数组 a,其中 a[0]=0 a[1]=11 a[2]=22,并且将数组 a 打印出来
# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'
4.11.2 统计所有的 IP 地址以及每一个 IP 地址访问的次数
# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i] }}' /var/log/httpd/access_log
(
补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第一列的 IP 地址为例
)
4.11.3 统计所有的 IP 地址以及每一个 IP 地址访问的次数,并以从多到少的顺序进行排序
# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i] }}' /var/log/httpd/access_log | sort -k2nr
(
补充:
1) 这里的 /var/log/httpd/access_log 是要被 awk 操作的测试文件
2) 这里以统计 /var/log/httpd/access_log 文件里第一列的 IP 地址为例
)
4.11.4 将每一列的值前面加上所属行的行号,按行打印出来
# awk -F: '{ i=1;while(i<NF) {print NR,$i;i++}}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.11.5 将每一列的值前面加上所属行的行号,按行打印出来
# awk '{ for(i=1;i<NF;i++) {print NR,$i}}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)
4.12 案例十二:awk 打印表格
在开始打印一行,在结尾打印一行,并且将 “:” 视为分割符
# awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1 "\t" $3 "\t" $6}END{print "Total",NR,"lines."}' /etc/passwd
(补充:这里的 /etc/passwd 是要被 awk 操作的测试文件)