共计 5027 个字符,预计需要花费 13 分钟才能阅读完成。
这篇文章主要介绍了怎么用 linux 的 AWK 创建文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用 linux 的 AWK 创建文件文章都会有所收获,下面我们一起来看看吧。
awk 处理过程: 依次对每一行进行处理,然后输出,与 sed 区别:awk 读到内存。
默认分隔符是空格或者 tab 键
案例一:
BEGIN{} {} END{} filename
行处理前 行处理 行处理后 文件名
# awk BEGIN{print 1/2} {print ok} END{print —} /etc/hosts
或者:
[root@awk ~]# cat /etc/hosts | awk BEGIN{print 1/2} {print ok} END{print —-}
0.5
ok
ok
—-
记录和字段
awk 假设它的输入是有结构的,而不是一串无规则的字符。默认它将每个输入行作为一条记录,而将由空格或制表符分隔的单词作为字段。
awk 按记录处理:一行是一条记录,因为 awk 默认以换行符分开的字符串是一条记录。(默认 \n 换行符:记录分隔符)
记录:以记录分割符分割的字符串 默认是换行 \n
字段:以字段分割符分割的字符串 默认是单个或多个“”tab 键。
========================================
awk 中的变量:
$0: 表示整行;
NF : 统计字段的个数
$NF: 是 number finally, 表示最后一列的信息
RS:输入记录分隔符;
ORS:输出记录分隔符。
NR: 打印记录号,(行号)
FNR:可以分开, 按不同的文件打印行号。
FS : 输入字段分隔符, 默认为一个空格。
OFS 输出的字段分隔符,默认为一个空格。
FILENAME 文件名 被处理的文件名称
$1 第一个字段,$2 第二个字段,依次类推 …
案例:
FS(输入字段分隔符)— 一般简写为 -F(属于行处理前)
[root@awk ~]# cat /etc/passwd | awk BEGIN{FS= :} {print $1}
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
games
[root@awk ~]# cat /etc/passwd | awk -F : {print $1}
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
注:如果 - F 不加默认为空格区分!
===============================================================
OFS(输出字段分隔符)
[root@awk ~]# cat /etc/passwd | awk BEGIN{FS= : OFS= ..} {print $1,$2}
root..x
bin..x
daemon..x
adm..x
lp..x
sync..x
shutdown..x
halt..x
mail..x
======================================================================
1. 创建两个文件
[root@awk ~]# vim a.txt
love
love.
loove
looooove
[root@awk ~]# vim file1.txt
isuo
IPADDR=192.168.246.211
hjahj123
GATEWAY=192.168.246.1
NETMASK=255.255.255.0
DNS=114.114.114.114
NR 表示记录编号, 当 awk 将行为记录时, 该变量相当于当前行号
[root@awk ~]# awk {print NR,$0} a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
6 isuo
7 IPADDR=192.168.246.211
8 hjahj123
9 GATEWAY=192.168.246.1
10 NETMASK=255.255.255.0
11 DNS=114.114.114.114
FNR:表示记录编号, 当 awk 将行为记录时, 该变量相当于当前行号 (不同文件分开)
[root@awk ~]# awk {print FNR,$0} a.txt file1.txt
1 love
2 love.
3 loove
4 looooove
5
1 isuo
2 IPADDR=192.168.246.211
3 hjahj123
4 GATEWAY=192.168.246.1
5 NETMASK=255.255.255.0
6 DNS=114.114.114.114
===========================================================
RS(输入记录分隔符)
1. 创建一个文件
[root@awk ~]# vim passwd
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin
[root@zabbix-server ~]# cat passwd | awk BEGIN{RS= bash} {print $0}
root:x:0:0:root:/root:/bin/
bin:x:1:1:bin:/bin:/sbin/nologin
ORS(输出记录分隔符)
2. 对刚才的文件进行修改
[root@awk ~]# vim 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
[root@awk ~]# cat passwd | awk BEGIN{ORS=} {print $0}
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin
===========================================================
NF:统计列的个数
[root@awk ~]# cat /etc/passwd | awk -F : {print NF}
7
7
7
7
$NF: 打印最后一列
[root@awk ~]# cat /etc/passwd | awk -F : {print $NF}
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
练习 1:将文件合并为一行
[root@awk ~]# cat /etc/passwd | awk BEGIN{ORS=} {print $0}
练习 2:把一行内容分成多行
1. 首先创建一个文件
[root@awk ~]# vim d.txt
root:x:0:0:root:/root:/bin/bash
[root@awk ~]# cat d.txt | awk BEGIN{RS= :} {print $0}
root
x
0
0
root
/root
1. 打印一个文件中的第 2 列和第 3 列
# cat /etc/passwd | awk -F : {print $2,$5}
2. 打印指定行指定列的某个字符
# free -m | awk NR==2 {print $2}
3. 统计一个文件的行数
# cat /etc/passwd | awk {print NR}
4. 在 awk 中使用 if 条件判断
++i:从 1 开始加,赋值在运算
i++: 从 0 开始加,运算在赋值
if 语句:
{if( 表达式){语句; 语句;…}}
显示管理员用户姓名
# cat /etc/passwd | awk -F : {if($3==0) {print $1 is administrator}}
统计系统用户
# cat /etc/passwd | awk -F : {if($3 =0 $3 1000){i++}} END{print i}
5. 在 awk 中使用 for 循环
# cat /etc/passwd | awk {for(i=1;i i++) {print $0}}
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
分别打印每行每列
# cat /etc/passwd | awk -F : {for(i=1;i i++) {print $i}}
root
x
0
0
root
/root
/bin/bash
数组遍历 – 用来统计网站日志,tcp 连接状态等。
++i:从 1 开始加,赋值在运算
i++: 从 0 开始加,运算在赋值
按索引遍历:
1. 先创建一个 test 文件
# vim test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
# cat test.txt | awk -F : {username[x++]=$1} END{for(i in username) {print i,username[i]}}
0 root
1 bin
# cat test.txt | awk -F : {username[++x]=$1} END{for(i in username) {print i,username[i]}}
1 root
2 bin
注意:变量 i 是索引
实际案例
1. 统计 /etc/passwd 中各种类型 shell 的数量
# cat /etc/passwd | awk -F: {shells[$NF]++} END{for(i in shells){print i,shells[i]} }
2. 统计 nginx 日志出现的状态码
# cat access.log | awk {stat[$9]++} END{for(i in stat){print i,stat[i]}}
3. 统计当前 nginx 日志中每个 ip 访问的数量
# cat access.log | awk {ips[$1]++} END{for(i in ips){print i,ips[i]}}
4. 统计某一天的 nginx 日志中的不同 ip 的访问量
# cat access.log |grep 28/Sep/2019 | awk {ips[$1]++} END{for(i in ips){print i,ips[i]}}
5. 统计 nginx 日志中某一天访问最多的前 10 个 ip
# cat access.log |grep 28/Sep/2019 | awk {ips[$1]++} END{for(i in ips){print i,ips[i]}} |sort -k2 -rn | head -n 2
sort:排序,默认升序
-k:指定列数
-r:降序
-n:以数值来排序
6. 统计 tcp 连接的状态 — 下去自己查各个状态,包括什么原因造成的!
# netstat -n | awk /^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}
LAST_ACK 5(正在等待处理的请求数)
SYN_RECV 30
ESTABLISHED 1597(正常数据传输状态)
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057(处理完毕,等待超时结束的请求数)
UV 与 PV 统计
=================================================================
1. 根据访问 IP 统计 UV
# cat access.log | awk {print $1} |sort |uniq -c | wc -l
uniq:去重
-c:每行连续出现的次数
2. 更具访问 ip 统计 PV
# cat access.log | awk {print $1} |wc -l
或者是 url
# cat access.log | awk {print $7} |wc -l
3. 查询访问最频繁的 URL
# cat access.log | awk {print $7} |sort | uniq -c |sort -n -k 1 -r | more
more:以一页一页的形式显示
4. 查询访问最频繁的 IP
# cat access.log | awk {print $1} |sort | uniq -c |sort -n -k 1 -r | more
关于“怎么用 linux 的 AWK 创建文件”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用 linux 的 AWK 创建文件”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道。