# cat group_file1
wireshark x 987
usbmon x 986
jackuser x 985
vboxusers x 984 allen
aln x 1001
#
第一个示例:
# awk '{print}' group_file1
wireshark x 987
usbmon x 986
jackuser x 985
vboxusers x 984 allen
aln x 1001
#
该命令和cat 命令效果一样,都是直接把文件内容直接输出。该awk的命令部分为print,执行awk时,依次对每一行执行print命令,他会把文件每一行内容都打印出来。此处也可以有其他代码,也可以和输入进来的行无关。比如执行:
# awk '{print "hello awk!"}' group_file1
hello awk!
hello awk!
hello awk!
hello awk!
hello awk!
有多少行文件就会答应多少行hello awk!
# awk '{print $1 $3}' group_file1
wireshark987
usbmon986
jackuser985
vboxusers984
aln1001
输出结果黏在一起了,我们可以加入一些字符分割它:
# awk '{print "group:"$1 "\tid:"$3}' group_file1
group:wireshark id:987
group:usbmon id:986
group:jackuser id:985
group:vboxusers id:984
group:aln id:1001
在{}里面,及时$1之间$3有空格,也不会打印出空格,需要我们自己加入字符串来输出分割打印,也可以加入一个逗号,这样输出时会有一个空格分割。
# cat 1_awk.sh
#!/bin/sh
awk '{print "name:"$1 "\tid:"$3}' group_file1
# ./1_awk.sh
name:wireshark id:987
name:usbmon id:986
name:jackuser id:985
name:vboxusers id:984
name:aln id:1001
通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,在许多编程情况中,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
#!/bin/sh
awk '
BEGIN {
print " Name\tID\n==========================="
}
{
print "name:"$1 "\tid:"$3
}
END {
print "=============END============="
}
' group_file1
对于不是以空格分割的行,可以使用-F设置分隔符号,比如下面文件:
# cat group_file2
wireshark:x:987:
usbmon:x:986:
jackuser:x:985:
vboxusers:x:984:allen
aln:x:1001:
# awk -F: '{print $1, $3}' group_file2
wireshark 987
usbmon 986
jackuser 985
vboxusers 984
aln 1001
在后面我们有另外一种方法设置分割符号,就是设置FS变量。
awk 也可以写成以awk程序解释执行的脚本文件中,然后在命令行上以
awk -f xxx.awk filename
调用执行。
Awk脚本文件如下:
#!/bin/awk
BEGIN {
print "============begin=========="
}
{
print "++++++++++cmd++++++++++"
}
END {
print "-----------End---------"
}
调用该脚本如下:
# awk -f begin_cmd.awk group_file1
============begin==========
++++++++++cmd++++++++++
++++++++++cmd++++++++++
++++++++++cmd++++++++++
++++++++++cmd++++++++++
++++++++++cmd++++++++++
-----------End---------