![](https://i-blog.csdnimg.cn/blog_migrate/ac0e97c2cdc2f4fa9dd7f3ee143e6706.jpeg)
一、awk介绍
1. awk概述awk是一种==编程语言==,主要用于在linux/unix下对==文本和数据==进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。awk的处理文本和数据的方式:==逐行扫描==文件,默认从第一行到最后一行,寻找匹配的==特定模式==的行,并在这些行上进行你想要的操作。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
下面介绍的awk是以GNU的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。2. awk能干啥?awk==用来处理文件和数据==的,是类unix下的一个工具,也是一种编程语言可以用来==统计数据==,比如网站的访问量,访问的IP量等等支持条件判断,支持for和while循环二、awk使用方式1. ==命令行模式使用==1)语法结构awk 选项 '命令部分' 文件名特别说明:引用shell变量需用双引号引起2)常用选项介绍==-F== 定义字段分割符号,默认的分隔符是==空格==-v 定义变量并赋值3)=='==命名部分说明=='==正则表达式,地址定位'/root/{awk语句}' sed中: '/root/p''NR==1,NR==5{awk语句}' sed中: '1,5p''/^root/,/^ftp/{awk语句}' sed中:'/^root/,/^ftp/p'{awk语句1==;==awk语句2==;==...}'{print $0;print $1}' sed中:'p''NR==5{print $0}' sed中:'5p'注:awk命令语句间用分号间隔BEGIN...END....'BEGIN{awk语句};{处理中};END{awk语句}''BEGIN{awk语句};{处理中}''{处理中};END{awk语句}'2. 脚本模式使用1)脚本编写#!/bin/awk -f 定义魔法字符以下是awk引号里的命令清单,不要用引号保护命令,多个命令用分号间隔BEGIN{FS=":"}NR==1,NR==3{print $1"\t"$NF}...2)脚本执行方法1:awk 选项 -f awk的脚本文件 要处理的文本文件awk -f awk.sh filenamesed -f sed.sh -i filename方法2:./awk的脚本文件(或者绝对路径) 要处理的文本文件./awk.sh filename./sed.sh filename三、 awk内部相关变量变量变量说明备注==$0==当前处理行的所有记录==\$1,\$2,\$3...\$n==文件中每行以==间隔符号==分割的不同字段awk -F: '{print \$1,\$3}'==NF==当前记录的字段数(列数)awk -F: '{print NF}'==$NF==最后一列$(NF-1)表示倒数第二列==FNR/NR==行号==FS==定义间隔符'BEGIN{FS=":"};{print \$1,$3}'==OFS==定义输出字段分隔符,==默认空格=='BEGIN{OFS="\t"};print \$1,$3}'RS输入记录分割符,默认换行'BEGIN{RS="\t"};{print $0}'ORS输出记录分割符,默认换行'BEGIN{ORS="\n\n"};{print \$1,$3}'FILENAME当前输入的文件名1、==常用内置变量举例==# awk -F: '{print $1,$(NF-1)}' 1.txt# awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt# awk '/root/{print $0}' 1.txt# awk '/root/' 1.txt# awk -F: '/root/{print $1,$NF}' 1.txt root /bin/bash# awk -F: '/root/{print $0}' 1.txt root:x:0:0:root:/root:/bin/bash# awk 'NR==1,NR==5' 1.txt # awk 'NR==1,NR==5{print $0}' 1.txt# awk 'NR==1,NR==5;/^root/{print $0}' 1.txt root:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin2、内置变量分隔符举例FS和OFS:# awk 'BEGIN{FS=":"};/^root/,/^lp/{print $1,$NF}' 1.txt# awk -F: 'BEGIN{OFS="\t\t"};/^root/,/^lp/{print $1,$NF}' 1.txt root /bin/bashbin /sbin/nologindaemon /sbin/nologinadm /sbin/nologinlp /sbin/nologin# awk -F: 'BEGIN{OFS="@@@"};/^root/,/^lp/{print $1,$NF}' 1.txt root@@@/bin/bashbin@@@/sbin/nologindaemon@@@/sbin/nologinadm@@@/sbin/nologinlp@@@/sbin/nologin[root@server shell07]# RS和ORS:修改源文件前2行增加制表符和内容:vim 1.txtroot:x:0:0:root:/root:/bin/bash hello worldbin:x:1:1:bin:/bin:/sbin/nologin test1 test2# awk 'BEGIN{RS="\t"};{print $0}' 1.txt# awk 'BEGIN{ORS="\t"};{print $0}' 1.txt四、 awk工作原理awk -F: '{print $1,$3}' /etc/passwd
awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符(RS)结束
每行被间隔符==:==(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始
问:awk如何知道用空格来分隔字段的呢?
答:因为有一个内部变量==FS==来确定字段分隔符。初始时,FS赋为空格
awk使用print函数打印字段,打印出来的字段会以==空格分隔==,因为\$1,\$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为==输出字段分隔符==OFS,OFS默认为空格
awk处理完一行后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕
SD-WAN通过双网关设计,自动切换优质网络线路,保证网络的流畅程度与网络速度,不仅如此,它相对专线昂贵的价格,在保证高质量效果的基础上,价格十分友好,SD-WAN与另外两种方案对比更加稳定,同时拥有线路选择的能力,能够实现负载均衡或分流,是跨境传输的最好方案。