Linux技巧:awk 命令简单入门介绍( 二 )


echo "$value" | awk '{print $4}' 命令打印出 value 变量值的第四列内容,可以用这个方式来对变量值进行处理 。
注意:这里使用管道操作符 | 来连接标准输入,让 awk 命令能够处理传入到标准输入的字符串,但是使用重定向标准输入操作符 < 并不能让 awk 命令处理字符串 。
重定向是基于文件的操作,所给的字符串会被当成文件名,举例如下:
$ awk '{print $4}' < "This is a test string."-bash: This is a test string.: No such file or directory可以看到,在重定向标准输入操作符 < 右边的 "This is a test string." 字符串被当成文件名,bash 提示找不到文件 。
这里不是 awk 命令报错,而是 bash 在处理重定向的时候报错 。
awk program使用 awk 命令的关键在于,program 参数要怎么写 。
查看 GNU gawk 在线帮助手册的说明,列举部分内容如下:

  • Programs in awk consist of pattern–action pairs.
  • An action without a pattern always runs.
  • An awk program generally looks like this: [pattern] { action }
  • Patterns in awk control the execution of rules -- a rule is executed when its pattern matches the current input record.
  • The purpose of the action is to tell awk what to do once a match for the pattern is found.
  • An action consists of one or more awk statements, enclosed in braces (‘{…}’).
即,awk 命令的 program 参数由 pattern 和 action 组成 。Pattern 用于指定匹配模式,并对匹配的行执行后面的 action 操作,不匹配的行不做处理 。Action 用于指定要对匹配到的行进行什么样的操作,这些操作语句要包含在大括号 {} 里面 。如果没有提供 pattern 参数,默认处理所有行 。
部分 pattern 参数的写法说明如下:
  • /regular expression/
    A regular expression. It matches when the text of the input record fits the regular expression.
  • expression
    A single expression. It matches when its value is nonzero (if a number) or non-null (if a string).
具体举例说明如下:
$ awk '/a.*/ {print $0}' testawkThis is a test string.This is another TEST string.$ awk '/test/ {print $0}' testawkThis is a test string.$ awk 'test {print $0}' testawk$ awk '"NONE" {print $0}' testawkThis is a test string.This is another TEST string.$ awk '$3 == "another" {print $0}' testawkThis is another TEST string.可以看到,awk '/a.*/ {print $0}' testawk 命令使用 a.* 正则表达式来匹配包含字符 ‘a’ 的行,然后打印出整行内容 。
awk '/test/ {print $0}' testawk 命令则是打印包含 "test" 字符串的行 。
awk 'test {print $0}' testawk 命令什么都没有打印,这种写法并不表示打印包含 "test" 字符串的行 。
awk '"NONE" {print $0}' testawk 命令打印出 testawk 文件的所有行,虽然这个文件并没有包含 "NONE" 字符串 。基于上面说明,所给的 pattern 参数是一个用双引号括起来的非空字符串,表示总是匹配,不管这个字符串的内容是什么 。
awk '$3 == "another" {print $0}' testawk 命令匹配第三列内容为 "another" 字符串的行,并打印出整行内容 。
即,如果要指定匹配某个字符串,pattern 参数写为 “/regular expression/” 的形式会比较简单,要写为 “expression” 形式,需要了解 awk 的表达式写法 。
获取所给行的内容awk 在读取每行内容时,会基于分割字符把行内容拆分成多个单词,可以用 $number 来获取第 number 列的单词,number 值从 1 开始 。例如,$1 对应第一列的单词,$2 对应第二列的单词,$3 对应第三列的单词,依此类推 。可以用 $NF 来获取拆分后的最后一列内容 。
特别的,$0 获取到整行的内容,包括行首、或者行末的任意空白字符 。
以 "This is a test string." 这一行进行举例,有如下的对应关系:
Linux技巧:awk 命令简单入门介绍

文章插图
awk行字段获取方法
使用 -F 选项指定分割字符前面提到,awk 默认使用空格来拆分行内容为多个单词 。如果想要基于其他字符来进行拆分,可以使用 -F 选项来指定分割字符 。
GNU gawk 在线帮助手册对 -F 选项说明如下:
-F fs
--field-separator fs
Set the FS variable to fs.
例如对 "clang/utils/analyzer/" 这样的目录路径来说,如果想要基于 / 进行拆分,以便获取各个目录名,就可以使用 -F 选项来指定分割字符为 / 。


推荐阅读