Linux必知必会--awk

弱者,是没有资格要求公平的。

          --《秦时明月》卫庄

参考文献:

  http://www.ruanyifeng.com/blog/2018/11/awk.html 阮一峰

  https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

  https://man.linuxde.net/awk

  awk是一种优良的文本处理工具,linux及unix环境中现有的功能最强大的数据处理引擎之一。

  awk提供了极其强大的功能:可以进行正则表达式的匹配,样式装入,流控制,数学运算符,进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言应该具有的几乎所有的精美特性。实际上awk的确拥有自己的语言:awk程序设计语言,三位创建者已将它正式定义为“样式扫描和处理语言”。它允许创建简短的程序,这些程序读取输入文件,为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他功能。

  最简单的说,awk是一种用于处理文本的编程语言工具。awk在很多方面类似于unix shell语言,尽管awk具有完全属于其本身的语法。(--取自wiki)

 

语法

awk [option] 'script' var = value file(s)

awk [opyion] -f script var = value file(s)

常用命令选项:

-F fs fs指定输入分隔符,fs可以是字符串或正则表达式

-v var=value  赋值一个用户定义的变量,将外部变量传递给awk

-f scripfile  从脚本中读取awk命令

-m[fr] val  对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

基本用法

awk 动作 文件名

示例:

awk '{print $0}' demo.txt

上方示例中,demo.txt是awk要处理的文件。前面单引号内部有一个大括号,里面就是每一行的处理动作print $0。其中print是打印命令,$0代表当前行,因此上面的执行结果,就是把每一行原样打印出来。

awk会根据空格和制表符,将每一行分成若干字段,依次用$1,$2,$3代表第一个字段、第二个字段、第三个字段。

echo 'This is a student' | awk '{print $3}'

打印出a,a为第三个字段。

如需要指定分割符,则要加上-F参数。

示例:

awk -F ';' '{print $1}' demo.txt

变量

$NF代表最后一个字段。

echo 'this is a test' | awk '{print $NF}'

$(NF-1)代表倒数第二个字段

awk -F ':' '{print $1, $(NF-1)}' demo

print命令里面的逗号,表示输出的时候,两部分之间使用空格分隔。

NR表示当前处理的是第几行

awk -F ':' '{print NR ") " $1}' demo

print 命令中如果原样输出字符,要放在双引号里面。

awk的其他内置变量如下

FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。

函数

tolower():字符转为小写。
length():返回字符串长度。
substr():返回子字符串。
sin():正弦。
cos():余弦。
sqrt():平方根。
rand():随机数。

条件

awk '条件 动作' 文件名

awk -F ':' '/usr/ {print $1}' demo.txt

print命令前面是正则表达式,只输出包含user的行。

awk -F ':' 'NR %2 = 1 {print $1}' demo.txt

输出奇数行

awk -F ':' 'NR >3 {print $1}' demo.txt

输出第三行以后的行

#输出第一个字段等于指定值的行
$ awk -F ':' '$1 == "root" {print $1}' demo.txt
root

$ awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt
root
bin

if语句

awk -F ':' '{if ($1 > "m") print $1}' demo

输出第一个字段的第一个字符大于m的行

if可指定else部分

awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo
原文地址:https://www.cnblogs.com/richered/p/11511828.html