awk介绍
awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。awk是gawk的一个软链接。
awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。
awk能干啥?
awk用来处理文件和数据的,是类unix下的一个工具,也是一种编程语言。可以用来统计数据,比如网站的访问量,访问的IP量等等。支持条件判断,支持for和while循环。
awk的命令行模式使用
1、语法结构:
awk 选项 '命令部分' 文件名
特别说明:命令部分如果引用shell变量需用双引号引起,其他情况都使用单引号。
luck_user=tom
sed -i “/$luck_user/d” file
2、常用选项
-F 定义字段分割符号,默认的分隔符是空格
-v 定义变量并赋值
命名部分说明
正则表达式,地址定位
'/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语句}'
awk脚本模式使用
1、脚本编写
#!/bin/awk -f 以下是awk引号里的命令清单,不要用引号保护命令,多个命令用分号间隔 BEGIN{FS=":"} NR==1,NR==3{print $1"\t"$NF} |
2、脚本执行
方法1: awk 选项 awk的脚本文件 要处理的文本文件 awk -f awk.sh filename sed -f sed.sh -i filename 方法2: ./awk的脚本文件(或者绝对路径) 要处理的文本文件 ./awk.sh filename ./sed.sh filename |
awk相关变量
#打印文件中的所有内容 awk '{print $0}' a.txt #打印1-5行的内容 awk 'NR==1,NR==5{print $0}' a.txt awk 'NR==1,NR==5' a.txt awk 'NR>=1 && NR<=5{print $0}' a.txt #打印第1行和第5行 awk 'NR==1 || NR==5{print $0}' a.txt #按逗号分隔,打印第一列、最后一列和倒数第二列 awk -F: '{print $1,$NF,$(NF-1)}' a.txt #打印每一行的列数 awk -F: '{print NF}' a.txt #打印包含root的行 awk '/root/{print $0}' a.txt awk '/root/' a.txt #打印以“ : ”分割的包含root的第一列和最后一列 awk -F: '/root/{print $1,$NF}' a.txt #打印1到5行且打印包含root的行 awk 'NR==1,NR==5;/^root/{print $0}' a.txt #使用FS定义间隔符 awk 'BEGIN{FS=":"};{print $1,$NF}' a.txt #使用OFS定义输出间隔符 awk -F: 'BEGIN{OFS="@"};{print $1,$NF}' a.txt awk 'BEGIN{FS=":";OFS="@"};{print $1,$NF}' a.txt awk 'BEGIN{FS=":"};{print $1"@"$NF}' a.txt |
数据准备
# vi b.txt tom xiaohua susan lala jim tom lele huhu xiaohua xiaoli xiaoming haha |
#使用RS定义行分割符 awk 'BEGIN{RS="\t"};{print $1,$2}' b.txt #使用ORS定义输出数据的行分隔符 awk 'BEGIN{RS="\t";ORS="\n\n"};{print $1,$2}' b.txt |
awk的工作原理
awk -F: '{print $1,$3}' /etc/passwd
1、awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符(RS)结束。
2、每行被间隔符**:**(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始
问:awk如何知道用空格来分隔字段的呢?
答:因为有一个内部变量FS来确定字段分隔符。初始时,FS赋为空格
3、awk使用print函数打印字段,打印出来的字段会以空格分隔,因为$1,$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为输出字段分隔符OFS,OFS默认为空格。
4、awk处理完一行后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕。