设为首页 加入收藏

TOP

awk知识点全回顾(一)
2017-10-13 10:37:21 】 浏览:6372
Tags:awk 知识点 回顾

本文目录:
1.awk简介和基本语法格式
2.print和printf格式化输出
3.输入行的字段分隔符和行分隔符
4.BGEIN和END
5.数组
6.流程控制语句
  6.1 条件判断语句
  6.2 while循环
  6.3 do循环
  6.4 for循环
7.更完整的awk程序格式和表达式
8.awk中的变量
9.awk中的内置函数
10.自定义函数
11.getline函数
12.向awk传递变量

1. awk简介和基本语法格式

Awk自动地搜索输入文件,并把每一个输入行切分成字段。许多工作都是自动完成的,例如读取每个输入行、字段分割、存储管理、初始化等。在AWK中不需声明变量数据类型,它内置字符串类型和数值类型。

一般来说,在CentOS上安装的awk默认是gawk。它的调用格式为:

awk [OPTIONS] -f program_file [--] filename_list
awk [OPTIONS] [--] program filename_list

program是awk程序的重中之重,称为awk的程序,它的格式为PATTERN{ACTIONS}。awk每读入一行,都会先与PATTERN做匹配比较,当找到符合条件的数据就执行对应的ACTION。

其中PATTERN或ACTIONS二者可省一。省略PATTERN时表示对所有行都执行ACTIONS,省略ACTIONS表示对符合条件的行执行默认的print动作。因为二者可省一,所以用大括号{}将ACTIONS部分包围起来,以区分PATTERN和ACTIONS。

一个简单的例子,输出/etc/passwd中用户shell为/bin/bash的用户名,其中使用"-F"选项指定冒号作为分隔符。

awk -F':' '$7 == "/bin/bash"{print "who use bash shell: ",$1}' /etc/passwd

其中位置变量$1,$2...为该行的第几个字段,"$0"表示整行。

如果要输出多个字段,则字段之间使用逗号","分隔,例如{print $1,$5}但输出时,仍默认以空格分隔各输出字段。

如果action为print $1 $5,则结果会将"$1"和"$5"拼接在一起,因为空格是awk中的拼接字符。例如变量赋值name = "abc" "bcd"等价于name="abcbcd"。其实不算是拼接符,而是因为awk会忽略任何不被引号包围的空白。

2.print和printf格式化输出

awk使用print和printf输出数据,不仅可以输出到标准输出中,还可以重定向到文件中,使用管道传递给另一个命令。

  1. print
    将 $0 打印到标准输出。等价于print $0
  2. print expression, expression, …
    打印各个 expression, expression 之间由 OFS 分开, 由 ORS 终止
  3. print expression,expression,… > filename
    文件名filename必须使用双引号包围,否则被当作变量。且文件只会被打开一次。
  4. print expression,expression,… >> filename
  5. print expression,expression,… | command
    将数据传递给系统命令。命令需要使用双引号包围。
  6. printf(format,expression,expression,…)
  7. printf(format,expression,expression,…) > filename
  8. printf(format,expression,expression,…) >> filename
  9. printf(format,expression,expression,…) | command
  10. close(filename), close( command)
    断开 print 与 filename (或 command) 之间的连接
  11. system(command)
    执行 command; 函数的返回值是 command 的退出状态

如果print或printf的参数列表中含有操作符,则需要使用括号包围,否则容易产生歧义。如:

print($1, $3) > ($3 > 100 ? "bigpop" : "smallpop")
print $1, ($2 > $3) 

执行系统命令的方式,可以通过管道的方式,也可以通过system()函数。注意包围命令的引号加的位置。

awk 'BEGIN{name="ma long shuai";print (1,2,3,4) | "echo " name}'
awk 'BEGIN{while (("fdisk -l" | getline) >0){print $0}}' awk 'BEGIN{system("fdisk -l")}' awk 'BEGIN{name="ma long shuai";system("echo " name)}'

printf命令可以输出更格式化的数据。

printf(format, value1, value2, ... , valueN)

format是一个字符串,包含按字面输出的纯文本,还包含输出格式,格式使用格式说明符"%"描述,后面跟着几个字符,这些字符控制一个value的输出格式。第一个"%"描述value1的输出格式,第二个"%"描述value2的输出格式,依次类推。因此,"%"的数量应该和被输出的value数量一样多。

例如:

{ printf("total pay for %s is $%.2f\n", $1, $2 * $3) }
{ printf("%-8s $%6.2f\n", $1, $2 * $3) }

第一个程序包含了两个要格式化的value,分别是"$1"和"$2 * $3"。这两个value的输出格式分别被"%s"和"%.2f"描述,前者表示按字符串格式输出"$1",后者表示按小数值格式输出"$2 * $3",且小数位占2位。由于printf不自带尾随换行符,因此手动加一个换行符"\n"。

第二个程序,"%-8s"表示"$1"按字符串格式输出,但短横线"-"表示要左对齐输出,"8"表示占用8个字符宽度,不足之数在右边空格补齐。"%6.2f"表示按小数格式输出"$2 * $3",且小数位占用2位,总字符数占用6位。注意,小数点也占用一个字符宽度。因此,一个可能的输出值为"123.20"。

格式说明符&qu

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇linux下文件和目录 下一篇ActiveMQ配置使用 for CentOS6

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目