贺胖娇的编程之旅......

awk

2020.02.27

参考文档:
awk 入门教程 Linux awk命令

知识点

(1)-F指定分隔符,例如:awk -F ':' '{print $1}' demo.log
(2)$0代表当前行,即所有内容,例如:awk '{print $0}' demo.log将会输出demo.log的所有内容
(3)$ + 数字表示某个字段,例如$2,$3分别表示第2第3个字段,也可以理解为列
(4)变量NF表示当前行有多少个字段,因此$NF就代表最后一个字段。例如:awk '{print $NF}' demo.log
(5)$(NF-1)代表倒数第二个字段,即NF-数字代表倒数字段。
(6)输出时使用空格分隔,例如:awk '{print $1, $(NF-1)}' demo.log
(7)要原样输出字符,需要放在"“里,例如awk -F ':' '{print "(",$5,")"}' demo.log
(8)变量NR表示当前处理的是第几行,可以输出当前行数awk -F ':' '{print NR "):(" $5 ")"}' demo.log
(9)awk有许多内置函数,例如转换大小写,详情见本文函数
(10)awk允许指定输出条件,可正则可根据行列计算等,非常重要
(11)awk提供判断语句(if else)

awk是什么

awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。

它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。

awk语法

awk [选项参数] 'script' var=value file(s)
#或
awk [选项参数] -f scriptfile var=value file(s)
#或者可以解释为:
#awk 动作 文件名

示例:

awk '{print $1}' demo.log # 打印第一列
echo 'this is a test' | awk '{print $0}' # 打印当前行

举例:

demo.log文件内容为:

this is number 1
and this is number 2
xxxx this is number 3
emmm this is number 4
awk '{print $1}' demo.log
# 执行结果为:
# this
# and
# xxxx
# emmm
awk '{print $0}' test.log
# 执行结果为整个文件原样输出

awk内置变量

$0表示当前行,即输出时输出所有
$ + 数字表示某个字段
NF表示当前行有多少个字段,因此$NF就代表最后一个字段。
$(NF-1)代表倒数第二个字段。
变量NR表示当前处理的是第几行。
FILENAME:当前文件名
FS:字段分隔符,默认是空格和制表符。
RS:行分隔符,用于分割每一行,默认是换行符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
OFMT:数字输出的格式,默认为%.6g。

awk内置函数

函数toupper()用于将字符转为大写
例如:
awk -F ':' '{print NR "):(" toupper($5) ")"}' demo.log。 tolower():字符转为小写。 length():返回字符串长度。 substr():返回子字符串。 sin():正弦。 cos():余弦。 sqrt():平方根。 rand():随机数。

条件

awk允许指定输出条件,只输出符合条件的行。

awk '条件 动作' 文件名

这个条件可以是正则表达式或者计算规则,例如:

awk -F ':' '$3 == 0 {print $0}' demo.log # 只有分隔后第三个字段为0的行才全部输出    
awk -F ':' '/sys/ {print $NF}' demo.log # 只有正则匹配到sys的行才输出最后一个字段    
awk -F ':' '/[s]?bin/ {print $NF}' demo.log # 匹配sbin或bin存在的行,输出最后一个字段    
awk -F ':' 'NR % 2 == 0 {print $0}' demo.log # 只输出偶数行    
awk -F ':' 'NR > 3 {print $0}' demo.log # 只输出第三行以后的行      
awk -F ':' '$1 == "sys" {print $0}' demo.log # 输出第n个字段值为指定值的行
awk -F ':' '$1 ~ /^r/ {print $1}' demo.log # ~表示开始正则匹配,输出第一列以r开头的

判断语句

可以只用if,也可以if + else,例如:

awk -F ':' '{if ($1 > "s") print $1}' demo.log # 输出第一个字段的第一个字符大于s的列    
awk -F ':' '{if ($1 > "s") print $1; else print "----"}' demo.log # 加else条件,记得一定要用;分隔,否则会语法错误    

注意:这里的if不能直接当做条件来使用,而是直接使用,否则会语法错误:

hexiaojiao@MS-RWTYITLHLCWO:~/datas$ awk -F ':' 'if ($1 > "s") {print $1}' demo.log
awk: cmd. line:1: if ($1 > "s") {print $1}
awk: cmd. line:1: ^ syntax error

其他写法

示例中的:awk -F ':' '{print NR "):(" toupper($5) ")"}' demo.log 也可以写成

awk -F ':' '{printf("%s):(%s)\n",NR,toupper($5))}' demo.log    
awk -F ':' '{printf "%-8s %-10s\n",$1,$4}' demo.log
发表评论