提示:
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk
- 一、awk是什么?
- 二、awk语法结构
- 1、awk脚本基本格式
- 2、awk常用参数_示例
- 2.1 print打印
- 2.2 -F 指定输入分隔符
- 2.2.1 $n 列出当前记录的第n个字段
- 2.2.2 将第1个和第2个字段 分行 输出
- 2.2.3 将第1个和第2个字段以空格作为间隔输出
- 2.2.4 将$1与$2相连输出,不分隔
- 2.2.5 将第一和第二个字符用-连接,输出
- 2.2.6 只输出以空格分隔的第二个字符
- 2.2.6 awk自定义输出
- 2.2.7 NF 显示每行有多少字段
- 2.2.8 将每行第NF个字段的值打印出来
- 2.2.9 显示只有3个字段的行
- 2.2.10 显示每行字段数量大于4的行
- 2.2.11 输出每行的行号及内容
- 2.2.12 NR 显示第4行
- 2.2.13 NR 显示第4行和第6行
- 2.2.14 NR不显示第4行
- 2.2.15 $n> 第一列的值大于4的行
- 2.3 -v 赋值一个用户定义变量
- 2.4 awk高级输入输出【next】
- 2.5 -f 从脚本文件中读取awk命令
- 2.6 awk内置变量
一、awk是什么?
awk是处理⽂本⽂件的⼀个应⽤程序,⼏乎所有系统都⾃带这个程序。 它依次处理⽂件的每⼀⾏,并读取⾥⾯的每⼀个字段。对于⽇志、CSV 那样的每⾏格式相同的⽂本⽂件,awk可能是最⽅便的⼯具。 awk其实不仅仅是⼯具软件,还是⼀种编程语⾔。不过,本⽂只介绍它的命令⾏⽤法,对于⼤多数场合,应该⾜够⽤了。
二、awk语法结构
1、awk脚本基本格式
# awk 'BEGIN{ commands } pattern{ commands } END{ commands }' file
// 一个awk脚本通常由BEGIN,通用语句块,END语句块组成,三部分都是可选的。
// 脚本通常是被单引号或双引号包住。
2、awk常用参数_示例
2.1 print打印
[root@localhost awk_test]# cat linshi.txt
ver01 zpzp
ver02 zwzw
// print是awk打印指定内容的主要命令
[root@localhost awk_test]# awk '{print}' linshi.txt
ver01 zpzp
ver02 zwzw
//不输出txt里的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
[root@localhost awk_test]# awk '{print " "}' linshi.txt
[root@localhost awk_test]#
//输出相同个数的a行,一行只有一个a字母
[root@localhost awk_test]# awk '{print "a"}' linshi.txt
a
a
[root@localhost awk_test]#
2.2 -F 指定输入分隔符
-F fs fs指定输入分隔符,fs可以是字符串或正则表达式
2.2.1 $n 列出当前记录的第n个字段
//将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
//$n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
[root@localhost awk_test]# awk -F ' ' '{print $1}' linshi.txt
ver01
ver02
[root@localhost awk_test]# awk -F ' ' '{print $2}' linshi.txt
zpzp
zwzw
2.2.2 将第1个和第2个字段 分行 输出
’{print $x;print $y}‘
//将第1个和第2个字段分行输出
[root@localhost awk_test]# awk -F ' ' '{print $1;print $2}' linshi.txt
ver01
zpzp
ver02
zwzw
2.2.3 将第1个和第2个字段以空格作为间隔输出
'{print $1,$2}'
//将第1个和第2个字段以空格作为间隔输出
[root@localhost awk_test]# awk -F ' ' '{print $1,$2}' linshi.txt
ver01 zpzp
ver02 zwzw
2.2.4 将$1与$2相连输出,不分隔
'{print $1 $2}'
// $1与$2相连输出,不分隔
[root@localhost awk_test]# awk -F ' ' '{print $1 $2}' linshi.txt
ver01zpzp
ver02zwzw
2.2.5 将第一和第二个字符用-连接,输出
'{print $1 "-" $2}'
//将第一和第二个字符用-连接,输出
[root@localhost awk_test]# awk -F " " '{print $1 "-" $2}' linshi.txt
ver01-zpzp
ver02-zwzw
2.2.6 只输出以空格分隔的第二个字符
awk -F ' ' '{print $2}'
//只输出以空格分隔的第二个字符
[root@localhost awk_test]# cat linshi.txt | awk -F ' ' '{print $2}'
zpzp
zwzw
[root@localhost awk_test]# cat zptest.txt
$n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 : 这个变量包含执行过程中当前行的文本内容。
ARGC : 命令行参数的数目。
//取以冒号分隔的第二个字段
[root@localhost awk_test]# awk -F: '{print $2}' zptest.txt
当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
这个变量包含执行过程中当前行的文本内容。
命令行参数的数目。
//取以“空格:空格”分隔的第二个字段
[root@localhost awk_test]# awk -F' : ' '{print $2}' zptest.txt
当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
这个变量包含执行过程中当前行的文本内容。
命令行参数的数目。
命令行中当前文件的位置(从0开始算)。
包含命令行参数的数组。
数字转换格式(默认值为%.6g)。
2.2.6 awk自定义输出
'{print "name:" $1 "\t\t age:" $2}'
【\t表示tab】
//自定义输出
[root@localhost awk_test]# awk -F " " '{print "num:" $1 "\t\t name:" $2}' linshi.txt
num:ver01 name:zpzp
num:ver02 name:zwzw
2.2.7 NF 显示每行有多少字段
显示每行有多少字段,NF起了作用
'{print NF}'
//显示每行有多少字段,NF起了作用
[root@localhost awk_test]# cat awktest02.txt
aa bb cc
aa bb cc dd ee
aa bb
aa
aaa bbb ccf
a b c d e f gg ab
//将每行第NF个字段的值打印出来
[root@localhost awk_test]# awk -F " " '{print NF}' awktest02.txt
3
5
2
1
3
8
2.2.8 将每行第NF个字段的值打印出来
'{print $NF}'
// 将每行第NF个字段的值打印出来
[root@localhost awk_test]# awk -F " " '{print $NF}' awktest02.txt
cc
ee
bb
aa
ccf
ab
2.2.9 显示只有3个字段的行
'NF==3{print}'
//显示只有3个字段的行
[root@localhost awk_test]# awk -F " " 'NF==3{print}' awktest02.txt
aa bb cc
aaa bbb ccf
2.2.10 显示每行字段数量大于4的行
'NF>4{print}'
//显示每行字段数量大于2的行
[root@localhost awk_test]# awk -F " " 'NF>4{print}' awktest02.txt
aa bb cc dd ee
a b c d e f gg ab
2.2.11 输出每行的行号及内容
{print NR $0}'
NR:行号
$0:输出内容
//输出每行的行号【其中$0表示展示所在行的数据信息】
[root@localhost awk_test]# awk -F " " 'NF>4{print NR}' awktest02.txt
2
6
[root@localhost awk_test]# awk -F " " 'NF>4{print NR $0}' awktest02.txt
2aa bb cc dd ee
6a b c d e f gg ab
[root@localhost awk_test]# awk -F " " 'NF>4{print NR ":" $0}' awktest02.txt
2:aa bb cc dd ee
6:a b c d e f gg ab
2.2.12 NR 显示第4行
'NR==4{print}'
//显示第4行
[root@localhost awk_test]# cat awktest02.txt
aa bb cc
aa bb cc dd ee
aa bb
aa
aaa bbb ccf
a b c d e f gg ab
[root@localhost awk_test]# awk -F: 'NR==4{print}' awktest02.txt
aa
[root@localhost awk_test]# awk -F: 'NR==4{print NR}' awktest02.txt
4
[root@localhost awk_test]# awk -F: 'NR==4{print NR $0}' awktest02.txt
4aa
2.2.13 NR 显示第4行和第6行
'NR==4 || NR==6{print NR ":" $0}'
//显示第4行和第6行
[root@localhost awk_test]# awk -F: 'NR==4{print NR ":" $0}' awktest02.txt
4:aa
[root@localhost awk_test]# awk -F: 'NR==4 || NR==6{print NR ":" $0}' awktest02.txt
4:aa
6:a b c d e f gg ab
2.2.14 NR不显示第4行
'NR!=4{print NR ":" $0}'
//不显示第4行
[root@localhost awk_test]# awk -F: 'NR!=4{print NR ":" $0}' awktest02.txt
1:aa bb cc
2:aa bb cc dd ee
3:aa bb
5:aaa bbb ccf
6:a b c d e f gg ab
2.2.15 $n> 第一列的值大于4的行
'$1>4{print}'
//第一列的值大于4的行
[root@localhost awk_test]# cat awktest05.txt
1 3 5 3 87
24 2 64 2
3 3 5
[root@localhost awk_test]# awk -F " " '$1>4{print}' awktest05.txt
24 2 64 2
[root@localhost awk_test]# awk -F " " '$1>2{print}' awktest05.txt
24 2 64 2
3 3 5
2.3 -v 赋值一个用户定义变量
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
//借助 -v 选项,可以将来自外部值(非stdin)传递给awk
[root@localhost awk_test]# cat awktest01.sh
VAR=10000
echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
[root@localhost awk_test]# sh awktest01.sh
10000
//定义内部变量接收外部变量
[root@localhost awk_test]# cat awktest04.txt
var1="aaa"
var2="bbb"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
[root@localhost awk_test]# sh awktest04.txt
aaa bbb
2.4 awk高级输入输出【next】
awk中next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配
[root@localhost awk_test]# cat awktest02.txt
aa bb cc
aa bb cc dd ee
aa bb
aa
aaa bbb ccf
a b c d e f gg
//列个行号 NR
[root@localhost awk_test]# awk -F " " '{print NR}' awktest02.txt
1
2
3
4
5
6
//让行号和内容一起输出 NR $0
[root@localhost awk_test]# awk -F " " '{print NR $0}' awktest02.txt
1aa bb cc
2aa bb cc dd ee
3aa bb
4aa
5aaa bbb ccf
6a b c d e f gg ab
//找出行号为偶数的行
[root@localhost awk_test]# awk -F " " 'NR%2==1{print NR $0}' awktest02.txt
1aa bb cc
3aa bb
5aaa bbb ccf
//将行号为偶数的行进行“跳过”操作 next
[root@localhost awk_test]# awk -F " " 'NR%2==1{next}{print NR $0}' awktest02.txt
2aa bb cc dd ee
4aa
6a b c d e f gg ab
2.5 -f 从脚本文件中读取awk命令
-f scriptfile 从脚本文件中读取awk命令
//不常用,还没整明白
2.6 awk内置变量
| 参数 | 说明 |
|---|---|
| $0 | 这个变量包含执行过程中当前行的文本内容 |
| $n | 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段 |
| ARGC | 命令行参数的数目 |
| ARGIND | 命令行中当前文件的位置(从0开始算) |
| ARGV | 包含命令行参数的数组 |
| CONVFMT | 数字转换格式(默认值为%.6g) |
| ENVIRON | 环境变量关联数组 |
| ERRNO | 最后一个系统错误的描述 |
| FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
| FILENAME | 当前输入文件的名 |
| NR | 表示记录数,在执行过程中对应于当前的行号 |
| FNR | 同NR |
| FS | 字段分隔符(默认是任何空格) |
| IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
| NF | 表示字段数,在执行过程中对应于当前的字段数 |
| OFMT | 数字的输出格式(默认值是%.6g) |
| OFS | 输出字段分隔符(默认值是一个空格) |
| ORS | 输出记录分隔符(默认值是一个换行符) |
| RS | 记录分隔符(默认是一个换行符) |
| RSTART | 由match函数所匹配的字符串的第一个位置 |
| RLENGTH | 由match函数所匹配的字符串的长度 |
| SUBSEP | 数组下标分隔符(默认值是34) |
1352

被折叠的 条评论
为什么被折叠?



