十五、gawk命令使用

gawk命令

gawk程序是Unix中原始awk程序的GNU版本。

它可以用来写脚本的方式处理文本数据。

他可以

  • 定义变量保存数据
  • 使用算数运算符字符串操作符处理数据
  • 使用结构化逻辑语句处理数据
  • 提取数据重新定义格式(如过滤日志文件找出错误行便于集中处理阅读)

语法格式

gawk options program file

 gawk选项

选项 描述
-F fs 指定分隔符
-f file 指定含有命令的文件
-v var=value 定义变量
-mf N 指定处理文件中最大字段数
-mr N 指定数据文件中最大数据行数
-W keyword 指定gawk的兼容模式或警告等级

从命令行读取程序脚本

gawk命令的脚本使用花括号定义。

gawk命令认为脚本是一串字符串所以还需要用单引号括起来。

gawk程序会针对数据流中的每行文本执行程序脚本。

注意:如下命令,因为没有在命令行上指定文件名,gawk默认会从STDIN也就是键盘接收数据。

即从键盘中中随便输入文本,接着都会执行输出Hello World!然后再等待输入。

[root@tzPC 19Unit]# gawk '{print "Hello World!"}'
This is a test
Hello World!

 Ctrl+D可以终止gawk程序

使用数据字段变量

gawk会自动给一行中每个数据字段分配一个变量

$0代表整个文本行

$1代表文本行中的第1个数据字段

$2代表文本行中第2个数据字段

...

在文本行中每个数据字段都是通过字段分隔符划分的。默认是空格或制表符

例:使用gawk读取文本文件,显示第一个数据字段的值

[root@tzPC 19Unit]# cat data2.txt 
One line of test text.
Two lines of test text.
Three     lines of test text.
[root@tzPC 19Unit]# gawk '{print $1}' data2.txt 
One
Two
Three

-F参数更改字段分隔符

[root@tzPC 19Unit]# gawk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
...

在程序脚本中使用多个命令

使用分号分隔命令即可。

[root@tzPC 19Unit]# echo "My name is tz" | gawk '{$4="root";print $0}'
My name is root

也可以使用如下写法

因为没有输入数据流,所以gawk默认会从STDIN中获取数据也就是从键盘中获取,所以要手动输入数据,然后才会执行gawk命令输出数据,使用Ctrl+D退出程序

[root@tzPC ~]# gawk '{
> $4="root"
> print $0}'
My name is tz
My name is root

 从文件中读取程序命令

使用-f选项指定命令文件

[root@tzPC 19Unit]# cat script2.gawk 
{print $1 "'s home directory is " $6}
[root@tzPC 19Unit]# gawk -F: -f script2.gawk /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
...

 使用含有多行命令的命令文件

注意:这里定义了变量text,再次调用它的时候不需要加$

[root@tzPC 19Unit]# cat script3.gawk 
{
text="'s home directory is "
print $1 text $6
}
[root@tzPC 19Unit]# gawk -F: -f script3.gawk /etc/passwd
root's home directory is /root
bin's home directory is /bin
daemon's home directory is /sbin
adm's home directory is /var/adm
lp's home directory is /var/spool/lpd
sync's home directory is /sbin

 

在处理数据前运行脚本

使用关键字BEGIN

[root@tzPC 19Unit]# cat data3.txt 
Line 1
Line 2
Line 3
[root@tzPC 19Unit]# gawk 'BEGIN {print "The data3 File Contents:"}
> {print $0}' data3.txt
The data3 File Contents:
Line 1
Line 2
Line 3

再处理数据后运行脚本

使用END关键字

[root@tzPC 19Unit]# gawk 'BEGIN {Print "The data3 File Contents:"}
> {print $0}
> END {print "End of File"}' data3.txt
Line 1
Line 2
Line 3
End of File

高大上的格式化输出报告用法来了,圈重点!

[root@tzPC 19Unit]# cat script4.gawk 
BEGIN{
print "The latest list of users and shells"
print " UserID \t Shell"
print "------- \t -------"
FS=":"
}

{
print $1 "    \t "    $7
}

END{
print "This concludes the listing"
}

[root@tzPC 19Unit]# gawk -f script4.gawk /etc/passwd
The latest list of users and shells
 UserID      Shell
-------      -------
root         /bin/bash
bin         /sbin/nologin
postfix         /sbin/nologin
sshd         /sbin/nologin
tz         /bin/bash
This concludes the listing

 

 

 

 学习来自:《Linux命令行与Shell脚本大全 第3版》第19章

 

posted @ 2020-08-29 15:57  努力吧阿团  阅读(642)  评论(0编辑  收藏  举报