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

 

posted @ 2022-07-28 17:44  zed99  阅读(58)  评论(0编辑  收藏  举报