弱者,是没有资格要求公平的。
--《秦时明月》卫庄
参考文献:
http://www.ruanyifeng.com/blog/2018/11/awk.html 阮一峰
https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
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