linux awk基础详解
awk提供了一种编程语言而不只是编辑器命令(相比于sed)。 可以使用算数和字符串操作符来处理数据,常通过提取数据文件中的数据元素,将其重新排列或格式化,生成格式化报告。
awk基本命令格式
awk options program file
options可用选项如下:
使用数据字段变量
awk主要特性之一是其处理文件中数据的能力,它会自动的给一行中的每个数据分配一个变量。默认情况下,awk会将如下变量分配给它在文本行中发现的数据字段。
$0代表整个文本行;
$1代表文本行中的第1个数据字段;
$2代表文本行中的第2个数据字段;
$n代表文本行中的第n个数据字段。
而在文本行中,每个数据字段都是通过字段分隔符划分的。gawk在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。awk中默认的字段分隔符是任意的空白字符(例如空格或制表符)。
$ cat data.txt
One line of test text.
Two lines of test text.
Three lines of test text.
$
$ awk '{print $1}' data.txt
One
Two
Three
[root@Centos8_test awktest]# awk '{print $1 " " $2}' data # $1 " " $2 第一列 空格 第二列
One line
Two lines
Three lines
-F 分隔符
多个分隔符情况
awk -F '[=,()]'
表示以=或,或 ( 或 ) 作为分隔符
在处理数据前后运行脚本
awk还允许指定程序脚本何时运行。默认情况下,awk会从输入中读取一行文本,然后针对该行的数据执行程序脚本。有时可能需要在处理数据前运行脚本,比如为报告创建标题。BEGIN关键字就是用来做这个的。它会强制gawk在读取数据前执行BEGIN关键字后指定的程序脚本。
与BEGIN关键字类似,END关键字允许你指定一个程序脚本,awk会在读完数据后执行它。
[root@Centos8_test awktest]# cat script.awk
BEGIN {
print "the list of users and shells"
print "UserID\tShell"
print "------\t------"
FS=":"
}
{
print $1 "\t" $7
}
END {
print "this concludes the listing"
}
[root@Centos8_test awktest]# awk -f script.awk /etc/passwd
the list of users and shells
UserID Shell
------ ------
root /usr/bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
比较重要经常用的几条awk命令
查看文件列数:
[root@jay bash_practise]# cat file1.txt
a b c d
e f
i
o k l m n
[root@jay bash_practise]# cat file1.txt | awk '{print NF}'
4
2
1
5
查看文件行数
[root@jay ~]# cat file.txt | awk 'END{print FNR}'
4